Допустим, на моей странице 10 разделов, в 6 из которых я должен проверить, вошел ли пользователь в систему, и если нет, перенаправить его на страницу «Войти / Зарегистрироваться».
Я обнаружил, что повторяю этот код в контроллере этих 6 страниц:
public function actionthatneedsauthAction()
{
$sl = $this->getServiceLocator();
$authService = $sl->get('doctrine.authenticationservice.orm_default');
$user = $authService->getStorage()->read(); //is the user logged in?
if ($user) { //auth successful
//-------------/*CODE FOR THIS SPECIFIC CONTROLLER GOES HERE*/--------
return new ViewModel(array(
'user' => $user,
'somethingelse' => $somethingelse
));
} else { //auth denied
return $this->redirect()->toRoute(user, array('action' => 'login'));
}
}
Я пытался заключить это в службу под названием islogged
(это модель, а не контроллер), но я не мог заставить его работать, потому что я не мог найти способ перенаправить на контроллер изнутри модели, я только знаю, как перенаправить на контроллер через другой контроллер.
Так по моему usermanager.php
У меня была такая функция:
public function islogged()
{
$sl = $this->getServiceLocator();
$authService = $sl->get('doctrine.authenticationservice.orm_default');
$user = $authService->getStorage()->read(); //is the user logged in?
if ($user) { //auth successful
return $user;
} else {
/*
redirect to the login screen, dont know how to do it,
this code doesnt work here:
return $this->redirect()->toRoute(NULL, array(
'controller' => 'user',
'action' => 'login'
));
*/
}
}
поэтому идея заключалась в том, что в моих контроллерах мне нужно было только написать:
$user = islogged();
и все повторение кода, которое я упомянул, больше не понадобится.
Это хорошая практика, что я пытался сделать с usermanager.php islogged
функционировать?
Если это хорошая практика, как я должен перенаправить на контроллер из модели?
Если это не очень хорошая практика, какой способ избежать повторения кода в моих контроллерах?
Я знаю, что могу поставить шаг аутентификации в onboostrap()
но в этом случае аутентификация будет срабатывать для всех моих страниц, и я просто хочу, чтобы в некоторых из них.
Я бы посоветовал вам внедрить аутентификацию Doctrine с официальным DoctrineModule Authentication
описано в docs
папка репо.
Прочитай это — Ссылка на DoctrineModule Authentication
Затем вы можете обработать проверку подлинности через собственный контроллер zf2 и просмотреть помощники идентичность. Смотрите пример в docs
Вот.
Я использую этот модуль ACL в своих приложениях: https://github.com/ZF-Commons/zfc-rbac
Мой контроллер обзора клиента выглядит так:
<?php
namespace RoleBasedCustomer\Controller;
use RoleBasedUser\Service\AuthenticationService;
use RoleBasedUser\Service\UserService;
use RoleBasedUser\Controller\AbstractMultiModelController;
class OverviewController extends AbstractMultiModelController
{
public function __construct(
AuthenticationService $authService,
UserService $userService
) {
$this->authService = $authService;
$this->userService = $userService;
}
public function indexAction()
{
if ( ! $this->authService->hasIdentity() ) {
return $this->redirect()->toRoute('customer/login');
}}
}
Единственное, что мне нужно было сделать, это заменить эти две строки:
$authService = $this->getServiceLocator()
->get('doctrine.authenticationservice.orm_default');
$user = $authService->getStorage()->read(); //is the user logged in?
с этим:
$user = $this->identity();