我有一个查找用户授权的插件。
我在我的 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 $event) {
$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,
],
],
备注:这里已经有语法警告:...无法解析为类型
如果我调试,我会得到一个异常:
无法将服务“User\Service\AccessControl”解析为工厂;你确定你在配置过程中提供了它吗?
在进一步的解释中,我的 module.php 中的这一行应该是问题所在:
$accessService = $container->get(Service\AccessControl::class);