У меня есть плагин, который просматривает пользовательские разрешения.
Я объявил его в своем файле module.config.php следующим образом:
'controller_plugins' => [
'factories' => [
Controller\Plugin\AccessPlugin::class => function($container) {
return new Controller\Plugin\AccessPlugin(
$container->get(Model\UserTable::class),
$container->get(Model\GrantsTable::class),
$container->get(Model\Authentication::class)
);
},
],
'aliases' => [
'access' => Controller\Plugin\AccessPlugin::class,
]
],
В моем событии onDispatch(MvcEvent $event)
, которое я хочучтобы получить параметры маршрутизации http, найдите грант и, в случае успеха, перенаправьте на правильный маршрут.
public function onDispatch(MvcEvent $event)
{
$controller = $event->getTarget();
$controllerName = $event->getRouteMatch()->getParam('controller', null);
$actionName = $event->getRouteMatch()->getParam('action', null);
$actionName = str_replace('-', '', lcfirst(ucwords($actionName, '-')));
$this->access()->checkAccess($controllerName, $actionName);
....
Конечно, плагин не может быть найден, он еще не загружен:
Вызов неопределенного метода User \ Module :: access ()
Я бы все равно хотел вызвать метод плагина. Есть ли возможность использовать его в этом случае? Примерно так:
$grantplugin = fetch/call the plugin
$isgranted = $grantplugin->checkAccess($controllerName, $actionName);
Любая помощь приветствуется!
** РЕДАКТИРОВАТЬ: Я попробовал решение, которое дал мне ermengildo. Но это не работает, причина в том, что я еще не работал с фабриками. С небольшой помощью я, вероятно, смогу научиться делать это правильно. Вот мои ниппеты:
Я разместил здесь две службы:
Я изменил module.php на (фрагмент!):
публичная функция onDispatch (событие MvcEvent $) {
$controller = $event->getTarget();
$controllerName = $event->getRouteMatch()->getParam('controller', null);
$actionName = $event->getRouteMatch()->getParam('action', null);
$actionName = str_replace('-', '', lcfirst(ucwords($actionName, '-')));
$container = $event->getApplication()->getServiceManager();
$accessService = $container->get(Service\AccessControl::class);
$accessService->access()->checkAccess($controllerName, $actionName);
Последнее, что я пытался объявить как фабрику сервиса:
'service_manager' => [
'factories' => [
// Avoid anonymous functions
Service\AccessControl::class => Service\AccessControlFactory::class,
],
],
Примечание: здесь уже естьпредупреждение о синтаксисе: ... не может быть преобразовано в тип
Если я отлаживаю, я получаю исключение:
Невозможно разрешить службу "Пользователь \ Сервис \ AccessControl" взавод;Вы уверены, что предоставили его во время настройки?
В дальнейшем объяснении этой строки в моем module.php должна быть проблема:
$accessService = $container->get(Service\AccessControl::class);