1. Go to this page and download the library: Download ferdiunal/nova-shield library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ferdiunal / nova-shield example snippets
return [
/**
* Specify the resources that will be used in the project.
* If you want to use custom resources, you can add them to the list.
*/
'resources' => [
app_path('Nova'),
\Ferdiunal\NovaShield\Http\Nova\ShieldResource::class,
// Custom resource: For custom menu items
// [
// "name" => "Custom Menu Item",
// "prefix" => "customMenuItem::",
// "policies" => ["CustomMenuPolicy"] // Add custom menu policies here
// ]
],
// 'teamFields' => \App\Lib\TeamField::class,
/**
* Constant policies of Laravel Nova
*/
'policies' => [
'viewAny',
'view',
'create',
'update',
'replicate',
'delete',
'restore',
'forceDelete',
'runAction',
'runDestructiveAction',
'canImpersonate',
'canBeImpersonated',
'add{Model}',
'attach{Model}',
'attachAny{Model}',
'detach{Model}',
],
/**
* Specify the file path of each language files for authorisations.
*/
'langs' => [
// lang_path('en/nova-shield.json'),
// base_path('langs/en/nova-shield.json'),
],
/**
* Default Super admin role name and guard
*/
'superAdmin' => [
'name' => 'super-admin',
'guard' => 'web',
],
'hooks' => [
/**
* When matching permissions with roles, upsert is used by default.
* If you are using custom ID types like UUID or ULID, you need to
// app/Providers/NovaServiceProvider.php
Nova::mainMenu(function (Request $request) {
return [
MenuItem::make('Custom Menu Item')
->path('/custom-menu')
->canSee(
function ($request) {
return $request->user()->can('CustomMenuPolicy');
}
)
];
});
// ----
// config/nova-shield.php
return [
"resources" => [
...
// Custom resource: For custom menu items
[
"name" => "Custom Menu Item",
"prefix" => "customMenuItem::",
"policies" => ['CustomMenuPolicy'] // Add custom menu policies here
]
]
];
namespace App\Nova;
use Ferdiunal\NovaShield\PermissionAuthorizable;
use Laravel\Nova\Resource as NovaResource;
abstract class Resource extends NovaResource
{
use PermissionAuthorizable;
....
}
// App\Models\User
use Ferdiunal\NovaShield\Contracts\HasShieldTeam;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements HasShieldTeam
{
public function getTeamIdAttribute(): mixed
{
// return $this->team_id
}
}
namespace App\Lib;
use Ferdiunal\NovaShield\Lib\NovaTeamHelperField;
use Laravel\Nova\Fields\Field;
use Laravel\Nova\Fields\Select;
class TeamField extends NovaTeamHelperField
{
public static function field(): Field
{
return Select::make('Teams', 'team_id')
->options([])
->displayUsingLabels()
->searchable()
->sortable();
}
}
return [
/*
|--------------------------------------------------------------------------
| Nova Route Middleware
|--------------------------------------------------------------------------
|
| These middleware will be assigned to every Nova route, giving you the
| chance to add your own middleware to this stack or override any of
| the existing middleware. Or, you can just stick with this stack.
|
*/
'middleware' => [
....
\Ferdiunal\NovaShield\Http\Middleware\TeamMiddleware::class,
],
];
// app/SyncPermissionHook.php
namespace App;
use Ferdiunal\NovaShield\Contracts\SyncPermissionHook as SyncPermissionHookContract;
use Illuminate\Support\LazyCollection;
use Illuminate\Support\Str;
use Spatie\Permission\Contracts\Role;
use Spatie\Permission\Models\Permission;
class SyncPermissionHook implements SyncPermissionHookContract
{
/**
* Sync permissions to a role
*
* @param array<int,string> $permissions
* @return void
*/
public function __invoke(Role $role, $permissions)
{
Permission::query()->upsert(
LazyCollection::make($permissions)
->map(function ($permission) use (&$role) {
return [
'id' => Str::uuid(),
'name' => $permission,
'guard_name' => $role->guard_name,
'created_at' => now(),
'updated_at' => now(),
];
})->toArray(),
['name', 'guard_name'],
['name', 'guard_name'],
);
$role->syncPermissions($permissions);
}
}
// config/nova-shield.php
return [
'hooks' => [
/**
* When matching permissions with roles, upsert is used by default.
* If you are using custom ID types like UUID or ULID, you need to