Мне грустно констатировать, что Lock в настоящее время не поддерживается. В настоящее время я не смогу предлагать поддержку или принимать новые взносы. Другие приоритеты не позволяют мне вложить в «Лок» ту работу, которую он заслуживает. В конце концов я попытаюсь снова приступить к работе, но, к сожалению, не могу сказать, когда. Я благодарю всех участников и пользователей.
-- Сохнет
Lock — это гибкий пакет Acl на основе драйверов для PHP 5.4+ .
Создатель Дрис Винтс. Стало возможным благодаря BeatSwitch. Вдохновленный авторитетом Мэтью Мачуги. Логотип Джерри Лоу.
Lock
: Экземпляр ACL для субъекта. В настоящее время этот пакет поставляется с CallerLock
и RoleLock
Caller
: объект идентификации, который может иметь разрешения на что-то делать.Driver
: система хранения разрешений, которые могут быть статическими или постоянными.Permission
: разрешение содержит действие и необязательный (уникальный) ресурс. Может быть либо Restriction
, либо Privilege
Restriction
: ограничение лишает вас возможности выполнить действие (на дополнительном ресурсе).Privilege
: привилегия позволяет вам выполнить действие (на дополнительном ресурсе).Action
: действие — это то, что вам либо разрешено, либо запрещено делать.Resource
: Ресурс может быть объектом, над которым вы можете выполнить одно или несколько действий. Он может быть нацелен либо на определенный тип ресурса, либо на конкретный ресурс по его уникальному идентификатору.Role
: роль также может содержать несколько разрешений. Вызывающий абонент может иметь несколько ролей. Роли могут наследовать разрешения от других ролей. Lock отличается от других пакетов acl тем, что пытается предоставить наиболее гибкий способ работы с несколькими вызывающими разрешениями и хранения разрешений.
Работая с контрактом Caller
Lock, вы можете установить разрешения для нескольких удостоверений.
Контракт Driver
позволяет легко хранить разрешения для постоянной или статической системы хранения. Статический ArrayDriver
по умолчанию поставляется с этим пакетом. Ознакомьтесь со списком ниже, чтобы увидеть больше драйверов, которые уже подготовлены для вас. Или создайте свой собственный, реализовав контракт Driver
.
Вы можете устанавливать и проверять разрешения для ресурсов, вручную передавая тип ресурса и (необязательный) идентификатор, или вы можете реализовать контракт Resource
на своих объектах, чтобы вы могли передавать их для более легкой блокировки.
Manager
позволяет легко создавать новые экземпляры Lock
, устанавливать псевдонимы действий или регистрировать роли.
Если вам нужна реализация для конкретной платформы, выберите один из уже подготовленных драйверов ниже.
Установите этот пакет через Composer.
$ composer require beatswitch/lock
Каждое удостоверение, которое должно иметь разрешения на какие-либо действия, должно реализовывать контракт BeatSwitchLockCallersCaller
. Контракт Caller
идентифицирует вызывающую сторону, требуя от нее возврата ее типа и уникального идентификатора. Давайте посмотрим на пример ниже.
<?php
use BeatSwitch Lock Callers Caller ;
class User implements Caller
{
public function getCallerType ()
{
return ' users ' ;
}
public function getCallerId ()
{
return $ this -> id ;
}
public function getCallerRoles ()
{
return [ ' editor ' , ' publisher ' ];
}
}
Добавив функцию getCallerType
мы можем идентифицировать группу вызывающих абонентов по уникальному типу. Если бы нам в какой-то момент захотелось установить разрешения для другой группы вызывающих абонентов, мы могли бы легко реализовать контракт на другом объекте.
<?php
use BeatSwitch Lock Callers Caller ;
class Organization implements Caller
{
public function getCallerType ()
{
return ' organizations ' ;
}
public function getCallerId ()
{
return $ this -> id ;
}
public function getCallerRoles ()
{
return [ ' enterprise ' ];
}
}
Таким образом, мы можем легко получить разрешения для определенного типа вызывающего абонента через драйвер.
Если вы хотите заранее настроить все свои разрешения, вы можете использовать статический ArrayDriver
, который поставляется с пакетом. Это позволяет вам установить список разрешений для вызывающего абонента до запуска вашего приложения.
use BeatSwitch Lock Drivers ArrayDriver ;
use BeatSwitch Lock Lock ;
use BeatSwitch Lock Manager ;
// Create a new Manager instance.
$ manager = new Manager ( new ArrayDriver ());
// Instantiate a new Lock instance for an object which implements the Caller contract.
$ lock = $ manager -> caller ( $ caller );
// Set some permissions.
$ lock -> allow ( ' manage_settings ' );
$ lock -> allow ( ' create ' , ' events ' );
// Use the Lock instance to validate permissions on the given caller.
$ lock -> can ( ' manage_settings ' ); // true: can manage settings
$ lock -> can ( ' create ' , ' events ' ); // true: can create events
$ lock -> cannot ( ' update ' , ' events ' ); // true: cannot update events
$ lock -> can ( ' delete ' , ' events ' ); // false: cannot delete events
Работа с постоянным драйвером позволяет сохранять разрешения для постоянного уровня хранения и настраивать их во время выполнения. Например, если вы реализуете драйвер Laravel 5, он будет хранить разрешения для базы данных, используя компонент базы данных Laravel. Создав собственный пользовательский интерфейс, вы можете легко подключить функциональность acl из этого пакета, чтобы создать, например, систему управления пользователями, в которой разные пользователи имеют разные разрешения.
Давайте взглянем на самый простой контроллер управления пользователями, чтобы понять, как это делается. Предположим, мы получили загрузочный экземпляр менеджера блокировок с нашим драйвером Laravel DB.
<?php
use BeatSwitch Lock Manager ;
class UserManagementController extends BaseController
{
protected $ lockManager ;
public function __construct ( Manager $ lockManager )
{
$ this -> lockManager = $ lockManager ;
}
public function togglePermission ()
{
$ userId = Input:: get ( ' user ' );
$ action = Input:: get ( ' action ' );
$ resource = Input:: get ( ' resource ' );
$ user = User:: find ( $ userId );
$ this -> lockManager -> caller ( $ user )-> toggle ( $ action , $ resource );
return Redirect:: route ( ' user_management ' );
}
}
Каждый раз, когда используется метод togglePermission
, разрешение пользователя для данного действия и типа ресурса будет переключаться.
Вы можете allow
или deny
вызывающему абоненту совершать какие-либо действия. Вот несколько способов установить и проверить разрешения.
Разрешить вызывающему абоненту создавать все.
$ lock -> allow ( ' create ' );
$ lock -> can ( ' create ' ); // true
Разрешить звонящему только создавать сообщения.
$ lock -> allow ( ' create ' , ' posts ' );
$ lock -> can ( ' create ' ); // false
$ lock -> can ( ' create ' , ' posts ' ); // true
Разрешить звонящему редактировать только определенное сообщение с идентификатором 5.
$ lock -> allow ( ' edit ' , ' posts ' , 5 );
$ lock -> can ( ' edit ' ); // false
$ lock -> can ( ' edit ' , ' posts ' ); // false
$ lock -> can ( ' edit ' , ' posts ' , 5 ); // true
Разрешить звонящему редактировать все сообщения, но запретить ему редактировать одно с идентификатором 5.
$ lock -> allow ( ' edit ' , ' posts ' );
$ lock -> deny ( ' edit ' , ' posts ' , 5 );
$ lock -> can ( ' edit ' , ' posts ' ); // true
$ lock -> can ( ' edit ' , ' posts ' , 5 ); // false
Переключить значение разрешения.
$ lock -> allow ( ' create ' );
$ lock -> can ( ' create ' ); // true
$ lock -> toggle ( ' create ' );
$ lock -> can ( ' create ' ); // false
Вы можете разрешить или запретить несколько действий одновременно, а также проверить несколько действий одновременно.
$ lock -> allow ([ ' create ' , ' edit ' ], ' posts ' );
$ lock -> can ( ' create ' , ' posts ' ); // true
$ lock -> can ([ ' create ' , ' edit ' ], ' posts ' ); // true
$ lock -> can ([ ' create ' , ' delete ' ], ' posts ' ); // false
Вы можете легко очистить разрешения для определенной комбинации действий и ресурсов.
$ lock -> allow ([ ' create ' , ' edit ' ], ' posts ' );
$ lock -> clear ( ' edit ' , ' posts ' );
$ lock -> can ( ' edit ' , ' posts ' ); // false
$ lock -> can ( ' create ' , ' posts ' ); // true
Вы также можете просто удалить все разрешения для экземпляра блокировки.
$ lock -> allow ( ' manage-posts ' );
$ lock -> allow ([ ' create ' , ' edit ' ], ' users ' );
$ lock -> clear ();
$ lock -> can ( ' manage-posts ' ); // false
$ lock -> can ( ' create ' , ' users ' ); // false
Чтобы сгруппировать несколько действий и установить их все одновременно, вам может потребоваться установить псевдоним действия.
$ lock -> alias ( ' manage ' , [ ' create ' , ' read ' , ' delete ' ]);
$ lock -> allow ( ' manage ' , ' posts ' );
$ lock -> can ( ' manage ' , ' posts ' ); // true
$ lock -> can ( ' create ' , ' posts ' ); // true
$ lock -> can ( ' delete ' , ' posts ' , 1 ); // true
$ lock -> can ( ' update ' , ' posts ' ); // false
Вы можете легко установить вызывающую сторону, которая имеет все разрешения для всего, передав подстановочный знак all
в качестве действия для экземпляра блокировки.
$ lock -> allow ( ' all ' );
Теперь каждый вызов метода «can» будет проверяться как true для этого вызывающего объекта.
Lock обеспечивает простой способ работы с ролями. Вы можете работать с ролями по умолчанию, но если вы хотите работать с наследованием, вам необходимо зарегистрировать роли в экземпляре менеджера.
$ manager -> setRole ( ' guest ' );
$ manager -> setRole ( ' user ' , ' guest ' ); // "user" will inherit all permissions from "guest"
Или зарегистрируйте несколько ролей одновременно.
$ manager -> setRole ([ ' editor ' , ' admin ' ], ' user ' ); // "editor" and "admin" will inherit all permissions from "user".
Давайте установим некоторые разрешения и посмотрим, как они разрешаются.
// Allow a guest to read everything.
$ manager -> role ( ' guest ' )-> allow ( ' guest ' , ' read ' );
// Allow a user to create posts.
$ manager -> role ( ' user ' )-> allow ( ' create ' , ' posts ' );
// Allow an editor and admin to publish posts.
$ manager -> role ( ' editor ' )-> allow ( ' publish ' , ' posts ' );
$ manager -> role ( ' admin ' )-> allow ( ' publish ' , ' posts ' );
// Allow an admin to delete posts.
$ manager -> role ( ' admin ' )-> allow ( ' delete ' , ' posts ' );
// Let's assume our caller has the role of "editor" and check some permissions.
$ lock = $ manager -> caller ( $ caller );
$ lock -> can ( ' read ' ); // true
$ lock -> can ( ' delete ' , ' posts ' ); // false
$ lock -> can ( ' publish ' ); // false: we can't publish everything, just posts.
$ lock -> can ([ ' create ' , ' publish ' ], ' posts ' ); // true
Вам нужно знать, что разрешения на уровне вызывающего абонента заменяют разрешения на уровне роли. Давайте посмотрим, как это работает.
Наш вызывающий абонент будет иметь роль пользователя.
$ manager -> caller ( $ caller )-> allow ( ' create ' , ' posts ' );
// Notice that we don't need to set the role in the
// manager first if we don't care about inheritance.
$ manager -> role ( ' user ' )-> deny ( ' user ' , ' create ' , ' posts ' );
$ manager -> caller ( $ caller )-> can ( ' create ' , ' posts ' ); // true: the user has explicit permission to create posts.
Условия на самом деле представляют собой утверждения, которые представляют собой дополнительные проверки, которые вы можете установить для разрешений. Вы можете передать их массив в качестве последнего параметра allow
и deny
. Все условия должны реализовывать интерфейс BeatSwitchLockPermissionsCondition
.
Внимание: обратите внимание, что условия в настоящее время работают только со статическими драйверами.
Давайте настроим условие.
<?php
use BeatSwitch Lock Lock ;
use BeatSwitch Lock Permissions Condition ;
use BeatSwitch Lock Permissions Permission ;
use BeatSwitch Lock Resources Resource ;
use Illuminate Auth AuthManager ;
class LoggedInCondition implements Condition
{
/**
* The Laravel AuthManager instance
*
* @var IlluminateAuthAuthManager
*/
protected $ auth ;
/**
* @param IlluminateAuthAuthManager $auth
*/
public function __construct ( AuthManager $ auth )
{
$ this -> auth = $ auth ;
}
/**
* Assert if the condition is correct
*
* @param BeatSwitchLockLock $lock The current Lock instance that's being used
* @param BeatSwitchLockPermissionsPermission $permission The Permission that's being checked
* @param string $action The action passed to the can or cannot method
* @param BeatSwitchLockResourcesResource|null $resource The resource passed to the can or cannot method
* @return bool
*/
public function assert ( Lock $ lock , Permission $ permission , $ action , Resource $ resource = null )
{
// Condition will succeed if the user is logged in.
return $ this -> auth -> check ();
}
}
Теперь посмотрим, как это будет работать при настройке разрешения.
$ condition = App:: make ( ' LoggedInCondition ' );
$ lock -> allow ( ' create ' , ' posts ' , null , $ condition );
$ lock -> can ( ' create ' , ' posts ' ); // true if logged in, otherwise false.
Вы также можете передать несколько условий.
$ lock -> allow ( ' create ' , ' posts ' , null , [ $ falseCondition , $ trueCondition ]);
$ lock -> can ( ' create ' , ' posts ' ); // false: there's at least one false condition
Вы можете передать столько условий, сколько захотите, но все они должны быть успешными, чтобы разрешение сработало.
Если хотите, вы также можете использовать обратный вызов.
$ lock -> allow ( ' create ' , ' posts ' , null , function ( $ lock , $ permission , $ action , $ resource = null ) {
return false ;
});
$ lock -> can ( ' create ' , ' posts ' ); // false because the callback returns false.
Если вы хотите получить список ресурсов, которым разрешено или запрещено выполнять определенное действие, вы можете использовать allowed
и denied
методы в экземпляре Lock
.
$ lock -> allow ( ' update ' , ' users ' , 1 );
$ lock -> allow ( ' update ' , ' users ' , 2 );
$ lock -> allow ( ' update ' , ' users ' , 3 );
$ lock -> deny ( ' update ' , ' users ' , 2 );
$ lock -> allowed ( ' update ' , ' users ' ); // Returns [1, 3];
$ lock -> denied ( ' update ' , ' users ' ); // Returns [2];
Имейте в виду, что вы можете получить идентификаторы только из ресурсов, для которых установлены разрешения. Ресурсы, не зарегистрированные через Lock, не возвращаются.
Вы можете легко добавить функциональность acl к вызывающему объекту или роли, реализовав признак BeatSwitchLockLockAware
.
<?php
use BeatSwitch Lock Callers Caller ;
use BeatSwitch Lock LockAware ;
class Organization implements Caller
{
use LockAware;
public function getCallerType ()
{
return ' organizations ' ;
}
public function getCallerId ()
{
return $ this -> id ;
}
public function getCallerRoles ()
{
return [ ' enterprise ' ];
}
}
Теперь нам нужно установить экземпляр блокировки.
$ caller -> setLock ( $ lock );
И теперь ваш вызывающий объект может использовать все методы блокировки для себя.
$ caller -> can ( ' create ' , ' posts ' );
$ caller -> allow ( ' edit ' , ' pages ' );
Если у вас есть вызывающий объект, реализующий свойство LockAware
, но еще не загрузивший экземпляр блокировки вызывающего объекта, вы можете легко сделать так, чтобы вызывающий объект знал о блокировке, используя метод менеджера makeCallerLockAware
.
$ caller = $ manager -> makeCallerLockAware ( $ caller );
И теперь ваш вызывающий абонент сможет использовать методы LockAware
. Аналогичный метод существует и для ролей.
$ role = $ manager -> makeRoleLockAware ( ' guest ' );
Это загрузит объект SimpleRole
, который уже имеет свойство LockAware
.
Все следующие методы можно вызвать в экземпляре BeatSwitchLockLock
.
Проверяет, есть ли у текущего вызывающего абонента разрешение на какие-либо действия.
can(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null
)
Проверяет, запрещено ли текущему вызывающему абоненту что-либо делать.
cannot(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null
)
Устанавливает разрешение Privilege
для вызывающего абонента, позволяющее ему что-то делать. Удаляет любые ограничения на совпадение.
allow(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null,
BeatSwitchLockPermissionsCondition[] $conditions = []
)
Устанавливает разрешение Restriction
для вызывающего абонента, чтобы запретить ему что-либо делать. Удаляет все соответствующие привилегии.
deny(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null,
BeatSwitchLockPermissionsCondition[] $conditions = []
)
Переключает значение для данного разрешения.
toggle(
string|array $action,
string|BeatSwitchLockResourcesResource $resource = null,
int $resourceId = null
)
Возвращает все идентификаторы в массиве заданного типа ресурса, с которым субъекту разрешено выполнять заданное действие.
allowed(
string|array $action,
string|BeatSwitchLockResourcesResource $resourceType
)
Возвращает все идентификаторы в массиве заданного типа ресурса, с которым субъекту запрещено выполнять данное действие.
denied(
string|array $action,
string|BeatSwitchLockResourcesResource $resourceType
)
Следующие методы можно вызвать в экземпляре BeatSwitchLockManager
.
Возвращает экземпляр BeatSwitchLockLock
для вызывающего объекта.
caller(
BeatSwitchLockCallersCaller $caller
)
Возвращает экземпляр BeatSwitchLockLock
для роли.
role(
BeatSwitchLockRolesRole $role
)
Добавьте псевдоним для одного или нескольких действий.
alias(
string $name,
string|array $actions
)
Установите одну или несколько ролей и дополнительную роль для наследования разрешений.
setRole(
string|array $name,
string $inherit = null
)
Устанавливает экземпляр блокировки для вызывающего объекта, который реализует признак LockAware
. Возвращает вызывающую сторону с установленным экземпляром блокировки.
makeCallerLockAware(
BeatSwitchLockCallersCaller $caller
)
Устанавливает экземпляр блокировки для роли, которая реализует особенность LockAware
. Возвращает роль с установленным экземпляром блокировки.
makeRoleLockAware(
BeatSwitchLockRolesRole|string $role
)
Вы можете легко создать драйвер, реализовав контракт BeatSwitchLockDriversDriver
. Ниже мы продемонстрируем, как создать собственный постоянный драйвер, используя Eloquent ORM от Laravel в качестве механизма хранения.
Предположим, у нас есть класс модели CallerPermission
как минимум со следующими столбцами базы данных:
caller_type
(varchar, 100)caller_id
(целое, 11)type
(варчар, 10)action
(варчар, 100)resource_type
(varchar, 100, допускается значение NULL)resource_id
(целое, 11, может быть обнулено) И у нас есть модель RolePermission
со следующими столбцами базы данных:
role
(varchar, 100)type
(варчар, 10)action
(варчар, 100)resource_type
(varchar, 100, допускается значение NULL)resource_id
(целое, 11, может быть обнулено) Давайте проверим полную реализацию драйвера ниже. Обратите внимание, что для метода getCallerPermissions
мы используем класс PermissionFactory
, чтобы легко сопоставить данные и создать из них объекты Permission
. Метод createFromData
PermissionFactory
принимает как массивы, так и объекты.
<?php
use BeatSwitch Lock Callers Caller ;
use BeatSwitch Lock Drivers Driver ;
use BeatSwitch Lock Permissions Permission ;
use BeatSwitch Lock Permissions PermissionFactory ;
use BeatSwitch Lock Roles Role ;
use CallerPermission ;
use RolePermission ;
class EloquentDriver implements Driver
{
/**
* Returns all the permissions for a caller
*
* @param BeatSwitchLockCallersCaller $caller
* @return BeatSwitchLockPermissionsPermission[]
*/
public function getCallerPermissions ( Caller $ caller )
{
$ permissions = CallerPermission:: where ( ' caller_type ' , $ caller -> getCallerType ())
-> where ( ' caller_id ' , $ caller -> getCallerId ())
-> get ();
return PermissionFactory:: createFromData ( $ permissions -> toArray ());
}
/**
* Stores a new permission into the driver for a caller
*
* @param BeatSwitchLockCallersCaller $caller
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function storeCallerPermission ( Caller $ caller , Permission $ permission )
{
$ eloquentPermission = new CallerPermission ;
$ eloquentPermission -> caller_type = $ caller -> getCallerType ();
$ eloquentPermission -> caller_id = $ caller -> getCallerId ();
$ eloquentPermission -> type = $ permission -> getType ();
$ eloquentPermission -> action = $ permission -> getAction ();
$ eloquentPermission -> resource_type = $ permission -> getResourceType ();
$ eloquentPermission -> resource_id = $ permission -> getResourceId ();
$ eloquentPermission -> save ();
}
/**
* Removes a permission from the driver for a caller
*
* @param BeatSwitchLockCallersCaller $caller
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function removeCallerPermission ( Caller $ caller , Permission $ permission )
{
CallerPermission:: where ( ' caller_type ' , $ caller -> getCallerType ())
-> where ( ' caller_id ' , $ caller -> getCallerId ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> delete ();
}
/**
* Checks if a permission is stored for a user
*
* @param BeatSwitchLockCallersCaller $caller
* @param BeatSwitchLockPermissionsPermission
* @return bool
*/
public function hasCallerPermission ( Caller $ caller , Permission $ permission )
{
return ( bool ) CallerPermission:: where ( ' caller_type ' , $ caller -> getCallerType ())
-> where ( ' caller_id ' , $ caller -> getCallerId ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> first ();
}
/**
* Returns all the permissions for a role
*
* @param BeatSwitchLockRolesRole $role
* @return BeatSwitchLockPermissionsPermission[]
*/
public function getRolePermissions ( Role $ role )
{
$ permissions = RolePermission:: where ( ' role ' , $ role -> getRoleName ())-> get ();
return PermissionFactory:: createFromData ( $ permissions -> toArray ());
}
/**
* Stores a new permission for a role
*
* @param BeatSwitchLockRolesRole $role
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function storeRolePermission ( Role $ role , Permission $ permission )
{
$ eloquentPermission = new RolePermission ;
$ eloquentPermission -> role = $ role -> getRoleName ();
$ eloquentPermission -> type = $ permission -> getType ();
$ eloquentPermission -> action = $ permission -> getAction ();
$ eloquentPermission -> resource_type = $ permission -> getResourceType ();
$ eloquentPermission -> resource_id = $ permission -> getResourceId ();
$ eloquentPermission -> save ();
}
/**
* Removes a permission for a role
*
* @param BeatSwitchLockRolesRole $role
* @param BeatSwitchLockPermissionsPermission
* @return void
*/
public function removeRolePermission ( Role $ role , Permission $ permission )
{
RolePermission:: where ( ' role ' , $ role -> getRoleName ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> delete ();
}
/**
* Checks if a permission is stored for a role
*
* @param BeatSwitchLockRolesRole $role
* @param BeatSwitchLockPermissionsPermission
* @return bool
*/
public function hasRolePermission ( Role $ role , Permission $ permission )
{
return ( bool ) RolePermission:: where ( ' role ' , $ role -> getRoleName ())
-> where ( ' type ' , $ permission -> getType ())
-> where ( ' action ' , $ permission -> getAction ())
-> where ( ' resource_type ' , $ permission -> getResourceType ())
-> where ( ' resource_id ' , $ permission -> getResourceId ())
-> first ();
}
}
Обратите внимание: мы не проверяем, существует ли разрешение, когда пытаемся его сохранить. Вам не нужно об этом беспокоиться, поскольку все это уже сделано за вас в экземпляре Lock
.
Теперь у нас есть драйвер, который поддерживает сохранение разрешений для вызывающих абонентов и ролей.
Вам очень легко убедиться, что ваш драйвер работает должным образом. Если вы создаете постоянный драйвер, вы можете легко протестировать его, создав тест PHPUnit, который расширяет класс PersistentDriverTestCase
.
<?php
use BeatSwitch Lock Tests PersistentDriverTestCase ;
class EloquentDriverTest extends PersistentDriverTestCase
{
public function setUp ()
{
// Don't forget to reset your DB here.
// Bootstrap your driver.
$ this -> driver = new EloquentDriver ();
parent :: setUp ();
}
}
И это все, что вам нужно! PersistentDriverTestCase
содержит все тесты, необходимые для проверки правильной работы драйвера. Итак, если все эти тесты пройдены, значит, ваш драйвер настроен правильно. Не нужно ничего издеваться, это чистый тестовый пример интеграции. Конечно, в этом конкретном примере, приведенном выше, для работы Eloquent вам потребуется загрузить Laravel. Работа с такой базой данных, как sqlite, будет лучшим способом протестировать ваш драйвер.
В данный момент блокировка не поддерживается.
Этот пакет в настоящее время поддерживается Dries Vints.
Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в теме.
Пожалуйста, смотрите файл вклада для получения подробной информации.
Вы можете увидеть список изменений для каждого выпуска в нашем файле журнала изменений.
Лицензия MIT. Дополнительную информацию см. в файле лицензии.