Я реализовал логику в начальной загрузке модуля приложения, которая будет перенаправлять пользователей на страницу входа, если они не подписаны. у меня есть
class Module
{
public function onBootstrap(MvcEvent $e)
{
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$session = new Container('signin');
if (!isset($session->member)){
$eventManager->attach(MvcEvent::EVENT_ROUTE, array($this,'routeMatched'), -100);
}
}
public function routeMatched(MvcEvent $e)
{
$match = $e->getRouteMatch();
// No route match, this is a 404
if (!$match instanceof RouteMatch) {
return;
}
$list = array('login', 'signin', 'upload');
// Route is whitelisted
$name = $match->getMatchedRouteName();
if (in_array($name, $list)) {
return;
}
// Redirect to the user login page, as an example
$router = $e->getRouter();
$url = $router->assemble(array(), array(
'name' => 'signin'
));
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
return $response;
}
}
Как вы можете видеть ниже, код внутри onBootstrap
будет проверять, не установлена ли в контейнере сеанса переменная member
или нет, если она не установлена, то присоединяется EVENT_ROUTE, который внутренне обрабатывает, что делать, в зависимости от того, является ли текущий маршрут белым списком или нет.
$session = new Container('signin');
if (!isset($session->member)) ...
Проблема здесь в том, что $session->member
всегда получает null
. Я назначаю эту переменную в действии входа в систему внутри моего контроллера, как это
if ($data->authenticate($member->email, $member->password)){
$session = new Container('signin');
$session->member = $member;
return $this->redirect()->toRoute('member-control-panel');
}else{
$view->setVariable('error', 'Could not verify user/password');
}
В чем проблема?
Обновление:
Я внес изменения, предложенные Уилтсом в его ответе. Это по-прежнему не работало, но я немного изменил код, чтобы сохранить скалярное значение (электронная почта) вместо объекта (члена). Теперь он работает, поэтому возникает вопрос: почему контейнер сеанса хранит не объект, а только скалярные переменные?
В моем действии входа я внес такие изменения
$session = new Container('signin');
//$session->member = $member; //removed
$session->email= $member->email; //New
В бутстрапе вот так
$session = new Container('signin');
if (!isset($session->email)){
$eventManager->attach(MvcEvent::EVENT_ROUTE, array($this,'routeMatched'), -100);
}