2013-09-26 4 views
0

Я реализованного Zend Auth путем создания getServiceConfig() -как AuthenticationService объекта в Module.php:Как использовать Zend Auth, чтобы сделать значения глобально доступны в каждом действии и layout.phtml

'AuthService' => function($sm) { 
        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
        $dbTableAuthAdapter = new DbTableAuthAdapter($dbAdapter, 'tblUSRUsers', 'Email', 'Password', "MD5(?)"); 

        $authService = new AuthenticationService(); 
        $authService->setAdapter($dbTableAuthAdapter); 
        $authService->setStorage($sm->get('Application\Model\MyAuthStorage')); 

        return $authService; 
       }, 

В действии контроллера, я получение этого объекта по

$this->getServiceLocator() 
        ->get('AuthService'); 

Для проверки подлинности я получить значение с помощью

$authservice = $this->getServiceLocator()->get('AuthService'); 
$arrUserDetails = $authservice->getIdentity(); 

Его рабочие характеристики, эти значения доступны.

Но проблема в том, что ServiceLocator не доступен в конструкторе контроллера, поэтому не может написать выше код. Написание этого кода в каждом действии, похоже, не является хорошей практикой. Может ли кто-нибудь помочь в этом?

ответ

0

Возможное решение будет иметь обработчик события маршрута, где вы установили учетные данные пользователя:

class Module 
{ 
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager = $e->getApplication() 
      ->getEventManager(); 

     $eventManager->attach (
      MvcEvent::EVENT_ROUTE, 
      function (MvcEvent $e) 
      { 
       $auth = $e->getApplication() 
          ->getServiceManager() 
          ->get('AuthService'); 

       $e->setParam('userinfo', $auth->getUserInfo()); 
       // update 
       $layout = $e->getViewModel(); 
       $layout->userinfo = $auth->getUserInfo();   
     }); 
    } 

, а затем получить доступ, то в контроллере, как это:

class IndexController extends AbstractActionController 
{ 
    public function indexAction() 
    { 
     $this->getEvent()->getParam('userinfo'); 
+0

Предположим, что я должен пройти. Записал имя пользователя в layout.phtml. Я хочу установить эту информацию через конструктор для Layout. Но, $ this-> getEvent() -> getParam ('userinfo'); также недоступно в конструкторе. Поэтому, заставляя меня вкладывать его в каждое действие. – Bhuvi

+0

Если вам это нужно в макете, то положите его туда. См. Мое обновление. – akond

+0

Спасибо. Я также хочу перенаправить пользователя на страницу входа в систему, если он не аутентифицирован. Для этого я пишу if (! $ Auth-> hasIdentity()) { $ controller = $ e-> getTarget(); return $ controller-> plugin ('redirect') -> toRoute ('login'); } в функции onBootstrap.Но он показывает «Неустранимая ошибка: вызов неопределенного метода Zend \ Mvc \ Application :: redirect()» Не могли бы вы также указать, как это можно достичь? – Bhuvi

0

Существует несколько способов сделать это. Вы можете перегрузить метод ControllerConfig в классе Module, чтобы вы могли создавать экземпляры контроллеров, как вам нравится. Или вы можете написать плагин контроллера, который будет обрабатывать аутентификацию &, чтобы вернуть идентификатор.

EDIT

Если предоставили эти ссылки раньше, но не имеют достаточного доступа с телефона;).

Чтобы понять ControllerConfig, обратите внимание на this blog post. В модуле Module есть объяснение о том, как уменьшить метод getControllerConfig на полпути. Это метод, который ищет диспетчер модулей при создании экземпляров классов модуля, который позволяет вам настроить создание экземпляра контроллера в этом модуле. После того как вы вернете класс Controller, диспетчер Controller затем добавляет остальную часть зависимостей контроллера (плагины и т. Д.)

Controller pluginsController plugins - это небольшие классы, которые вводятся каждому контроллеру и которые могут быть вызваны из действия, чтобы сделать некоторые общие бит кода. Когда вы используете $this->getServiceLocator() в действии контроллера, вы используете плагин.

+0

Я не знаком с этим , Не могли бы вы объяснить подробно? – Bhuvi

+0

См. Мое редактирование. Вы также можете посмотреть https://github.com/ZF-Commons/ZfcUser и как они структурируют свой класс модуля. – Adrian

 Смежные вопросы

  • Нет связанных вопросов^_^