Как повторно использовать код в Zend Framework
Я работаю над веб-приложением, которое требует, чтобы пользователь вошел в систему, прежде чем он увидит или сделает что-либо. Ни одна часть этого приложения не должна быть доступна без входа в систему. (За исключением, конечно, контроллера входа в систему)
В настоящее время я использую сеансы для обработки аутентификации, и я ввел код в каждый контроллер в функции init (), чтобы проверить, является ли их сеанс допустимым.
Это был временный обходной путь, но он избыточен и неэффективен.Я хотел бы, чтобы мой инит() функция должна быть похожа на следующую, но я не уверен, как ее достичь:
public function init()
{
// If user not logged in redirect to login controller
$myLibrary = Zend_Library_MyLibrary();
$myLibrary->CheckAuth();
}
Итак, мой вопрос действительно состоит из двух частей:
- где лучше всего хранить код, который будет использоваться в нескольких контроллерах?
- как мне тогда вызвать эту функцию из контроллера?
Спасибо.
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, напримерПосле того, как вы зарегистрировали своего помощника в bootstrap, вы можете использовать его в каждом контроллере, чтобы проверить, аутентифицирован ли пользователь:class My_Helper_CheckAuth extends Zend_Controller_Action_Helper_Abstract { public function checkAuth() { return Zend_Auth::getInstance()->hasIdentity(); } public function direct() { return $this->checkAuth(); } }
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(); } ... }