PHP code example of happenv-com / laravel-access-control
1. Go to this page and download the library: Download happenv-com/laravel-access-control 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/ */
happenv-com / laravel-access-control example snippets
// In ProductGalleryServiceProvider
$registry = resolve(VoterRegistry::class);
$registry->register(
ProductPermission::Delete,
function (User $user, Product $product = null): Response {
if ($product && $product->galleries()->exists()) {
return Response::deny('Cannot delete product with galleries.');
}
return Response::allow();
}
);
namespace App\Permissions;
use Happenv\LaravelAccessControl\Contracts\PermissionDefinition;
enum ProductPermission: string implements PermissionDefinition
{
case View = 'product.view';
case Create = 'product.create';
case Update = 'product.update';
case Delete = 'product.delete';
}
namespace Modules\Category\Providers;
use Illuminate\Support\ServiceProvider;
use Happenv\LaravelAccessControl\PermissionRegistry;
use Modules\Category\Permissions\CategoryPermission;
class CategoryModuleServiceProvider extends ServiceProvider
{
public function boot(): void
{
$registry = resolve(PermissionRegistry::class);
$registry->register([
CategoryPermission::class,
]);
}
}
namespace Modules\Product\Providers;
use Illuminate\Auth\Access\Response;
use Illuminate\Support\ServiceProvider;
use Happenv\LaravelAccessControl\PermissionRegistry;
use Happenv\LaravelAccessControl\VoterRegistry;
use App\Models\User;
use Modules\Category\Models\Category;
use Modules\Category\Permissions\CategoryPermission;
use Modules\Product\Permissions\ProductPermission;
class ProductModuleServiceProvider extends ServiceProvider
{
public function boot(): void {
$registry = resolve(PermissionRegistry::class);
$registry->register([
ProductPermission::class,
]);
$registry = resolve(VoterRegistry::class);
$registry->register(
CategoryPermission::Delete,
function (User $user, Category $category = null): Response {
if ($category->products()->exists()) {
return Response::deny(
'Cannot delete category with assigned products.'
);
}
return Response::allow();
}
);
}
}
namespace App\Voters;
use Illuminate\Auth\Access\Response;
use Happenv\LaravelAccessControl\Attributes\VoterForPermission;
use App\Models\User;
use App\Models\Currency;
use App\Models\Channel;
use App\Permissions\CurrencyPermission;
final class CurrencyVoter
{
#[VoterForPermission(CurrencyPermission::Delete)]
public function preventDeletingUsedByChannels(User $user, Currency|string|null $currency): Response
{
if (!$currency instanceof Currency) {
return Response::allow();
}
if (Channel::query()->whereJsonContains('currencies', $currency->code)->exists()) {
return Response::deny('Some channels are using this currency.');
}
return Response::allow();
}
#[VoterForPermission(CurrencyPermission::Update)]
public function preventUpdatingDefaultCurrency(User $user, Currency|string|null $currency): Response
{
if ($currency instanceof Currency && $currency->is_default) {
return Response::deny('Cannot modify the default currency.');
}
return Response::allow();
}
}
$registry = resolve(VoterRegistry::class);
$registry->register(CurrencyVoter::class);
// Or register multiple classes at once
$registry->register([
CurrencyVoter::class,
ProductVoter::class,
ChannelVoter::class,
]);
// Using Gate
Gate::allows(ProductPermission::View, $product);
Gate::authorize(ProductPermission::Delete, $product);
// Using the User model
$user->can(ProductPermission::Update, $product);
$user->cannot(ProductPermission::Delete, $product);
// In controllers
$this->authorize(ProductPermission::Update, $product);
// In Blade templates
@can(ProductPermission::View, $product)
<a href="{{ route('products.show', $product) }}">View</a>
@endcan
namespace App\Permissions\Groups;
use Happenv\LaravelAccessControl\Contracts\PermissionGroupDefinition;
final class ProductGroup implements PermissionGroupDefinition
{
public function getName(): string
{
return 'Products';
}
public function getDescription(): ?string
{
return 'Permissions related to product management';
}
public function getSlug(): string
{
return 'products';
}
}
namespace Modules\Product\Permissions;
use Happenv\LaravelAccessControl\Contracts\PermissionDefinition;
use Happenv\LaravelAccessControl\Attributes\PermissionGroup;
use Happenv\LaravelAccessControl\Attributes\PermissionName;
use Happenv\LaravelAccessControl\Attributes\PermissionDescription;
use Modules\Product\PermissionGroups\ProductGroup;
#[PermissionGroup(ProductGroup::class)]
enum ProductPermission: string implements PermissionDefinition
{
#[PermissionName('View Products')]
#[PermissionDescription('Allows viewing product details')]
case View = 'product.view';
#[PermissionName('Create Products')]
#[PermissionDescription('Allows creating new products')]
case Create = 'product.create';
#[PermissionName('Update Products')]
#[PermissionDescription('Allows modifying existing products')]
case Update = 'product.update';
#[PermissionName('Delete Products')]
#[PermissionDescription('Allows removing products from the system')]
case Delete = 'product.delete';
}
use Happenv\LaravelAccessControl\PermissionCollection;
$collection = resolve(PermissionCollection::class);
// Get all permissions grouped
$grouped = $collection->getGroupedPermissions();
// Get flat list of all permissions
$permissions = $collection->getPermissions();
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Happenv\LaravelAccessControl\Contracts\AuthControllable;
use Happenv\LaravelAccessControl\Traits\HasRoles;
class User extends Authenticatable implements AuthControllable
{
use HasRoles;
/**
* Get roles assigned to the user.
*/
public function getRoles(): iterable
{
return $this->roles; // Your roles relationship
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;
use Happenv\LaravelAccessControl\Contracts\AuthControllable;
use Happenv\LaravelAccessControl\Traits\HasPermissions;
class Role extends Model implements AuthControllable
{
use HasPermissions;
protected $casts = [
'permissions' => 'array',
];
protected function getPermissions(): Collection
{
return new Collection($this->permissions ?? []);
}
protected function setPermissions(Collection $permissions): void
{
$this->permissions = $permissions->toArray();
$this->save();
}
}
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Collection;
use Happenv\LaravelAccessControl\Contracts\AuthControllable;
use Happenv\LaravelAccessControl\Traits\HasRolesAndPermissions;
class User extends Authenticatable implements AuthControllable
{
use HasRolesAndPermissions;
protected $casts = [
'permissions' => 'array',
];
public function getRoles(): iterable
{
return $this->roles;
}
protected function getPermissions(): Collection
{
return new Collection($this->permissions ?? []);
}
protected function setPermissions(Collection $permissions): void
{
$this->permissions = $permissions->toArray();
$this->save();
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.