我在Acl
中正在Module.php
进行操作,并且我希望将用户重定向到特定路线(如果他们未经授权)。
我的路线是Literal
并且是无参数的(即,在配置中设置了默认控制器和动作参数)。
我无法找到办法。
实际上我知道我可以设置我的RouteMatch
的控制器和动作参数(我从MvcEvent
得到它)但是我希望按名称设置新路线而不设置参数。
感谢任何帮助,谢谢
答案 0 :(得分:1)
这取决于您要从中重定向的函数定义。
onBootstrap
- > on Dispatch
,函数定义 - 例如:
use Zend\Mvc\MvcEvent;
.....
........
class Module {
public function onBootstrap(MvcEvent $e)
{
$e->getApplication()->getEventManager()->getSharedManager()->attach('SOME_CONTROLLER OR * (-> all controllers)', 'dispatch', function($e) {
$controller = $e->getTarget();
if (unauthorized_user) {
$controller->plugin('redirect')->toRoute('ROUTE_NAME');
}
}, 100);
}
......
........
}
onBootstrap
- > on Route
- 这很棘手,因为函数甚至在路由完成之前就被执行了,所以你还没有$e->getTarget()
即Controller对象。
public function onBootstrap(MvcEvent $e) {
$e->getApplication()
->getEventManager()
->getSharedManager()
->attach('*', 'route', function($e) {
if (unauthorized_user) {
return $this->customRedirect($e, 'ROUTE_NAME');
} else {
return $this->customRedirect($e, 'ROUTE_NAME', 'ACTION_NAME');
}
}, 100);
}
public function customRedirect($event, $route, $action = '') {
$url = $event->getRouter()->assemble(array('action' => $action), array('name' => $route));
$response = $event->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
$response->sendHeaders();
exit();
}
只是为了获取当前的route_name,controller_name和action_name。
可以使用这个 -
$sm = $e->getApplication()->getServiceManager();
$router = $sm->get('router');
$request = $sm->get('request');
$matchedRoute = $router->match($request);
$params = $matchedRoute->getParams();
$route_name = $matchedRoute->getMatchedRouteName();
$controller_name = $params['controller'];
$action_name = $params['action'];
我希望它有所帮助。