這取決於你想從重定向功能定義。
- 一個可以是簡單的和直接的
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
-
T他會變得棘手,因爲即使在路由完成之前該函數也會被執行,所以你還沒有一個$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();
}
只是爲了獲取當前的路由名稱,控制器名稱和動作名稱。
可以利用這一點 -
$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'];
我希望它可以幫助別人。
與$ router-> assemble()組合發送頭文件對我來說似乎是最好的方法 - 我會試試它並將其標記爲一個答案,如果一切按預期工作 – dan 2014-09-27 13:55:35
行它OK,謝謝!我不知道路由器的assemble()方法 – dan 2014-09-27 14:03:57