Как повторно использовать код в Zend Framework


Я работаю над веб-приложением, которое требует, чтобы пользователь вошел в систему, прежде чем он увидит или сделает что-либо. Ни одна часть этого приложения не должна быть доступна без входа в систему. (За исключением, конечно, контроллера входа в систему)

В настоящее время я использую сеансы для обработки аутентификации, и я ввел код в каждый контроллер в функции init (), чтобы проверить, является ли их сеанс допустимым.

Это был временный обходной путь, но он избыточен и неэффективен.

Я хотел бы, чтобы мой инит() функция должна быть похожа на следующую, но я не уверен, как ее достичь:

public function init()
{
    // If user not logged in redirect to login controller
    $myLibrary = Zend_Library_MyLibrary();
    $myLibrary->CheckAuth();
}

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

  1. где лучше всего хранить код, который будет использоваться в нескольких контроллерах?
  2. как мне тогда вызвать эту функцию из контроллера?

Спасибо.

3 2

3 ответа:

Код, который повторно используется на нескольких контроллерах, лучше всего поместить вActionHelper . Однако, для вашего случая, я предлагаю написать контроллер плагина . Те подключаются к процессу отправки на различных этапах :

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
    if(!Zend_Auth::getInstance()->hasIdentity())
    {
        $request->setControllerName('auth');
        $request->setActionName('login');
        // Set the module if you need to as well.
    }
}

Вышесказанное предполагает, что вы используете Zend_Auth для аутентификации и управления удостоверениями пользователей .

Вам нужен плагин поверх помощника, потому что проверка, вошел ли пользователь в систему, должна происходить автоматически, без вас необходимость вызывать где-то метод checkAuth(). Конечно, ничто не мешает вам добавить ActionHelper, например

class My_Helper_CheckAuth extends Zend_Controller_Action_Helper_Abstract
{
    public function checkAuth()
    {
        return Zend_Auth::getInstance()->hasIdentity();
    }
    public function direct()
    {
        return $this->checkAuth();
    }
}
После того, как вы зарегистрировали своего помощника в bootstrap, вы можете использовать его в каждом контроллере, чтобы проверить, аутентифицирован ли пользователь:
if ( $this->_helper->checkAuth() === FALSE) {
    // do something
}

Также смотрите эти учебные пособия:

Http://zendframework.com/manual/en/zend.controller.plugins.html

Регистрация плагина front controller и подключение к более ранней части процесса отправки - вот как я это делаю.

$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Zend_Controller_Plugin_AuthCheck());

Занесите это в свой индекс.РНР.

class AuthCheck extends Zend_Controller_Plugin_Abstract {
    public function preDispatch($request){
        // Check Auth

    }
}

Хотя для этого конкретного примера лучше всего (вероятно) использовать плагин Front Controller, вы также можете повторно использовать код, расширяя Zend_Controller_Action. Ниже приведен надуманный пример, если бы вы использовали Zend_Auth. Это войдет в library/Application/Controller и будет называться Action.php. Если бы вы использовали другое пространство имен, вы бы поменяли имя каталога приложения на это (библиотека/[пространство имен] / контроллер / действие.php) и переименовать класс соответственно.

class Application_Controller_Action extends Zend_Controller_Action
{
    protected $_loggedIn;
    protected $_username;
    protected $_flashMessenger = null;

    public function init()
    {
        $auth = Zend_Auth::getInstance();
        $this->_loggedIn = $auth->hasIdentity();
        if($this->_loggedIn)
        {
            $user = $auth->getIdentity();
            $this->_username = $this->view->escape($user->username);
        }
        $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger');
        $this->initView();
    }
    ...
}