Zend Framework как это сделать, чтобы не повторяться - PullRequest
0 голосов
/ 29 января 2012

У меня есть эта вещь, которая мне нужна в нескольких местах:

public function init()
{
    $fbLogin = new Zend_Session_Namespace('fbLogin'); #Get Facebook Session
    if(!$fbLogin->user) $this->_redirect('/'); #Logout the user
}

Эти две строки:

    $fbLogin = new Zend_Session_Namespace('fbLogin'); #Get Facebook Session
    if(!$fbLogin->user) $this->_redirect('/'); #Logout the user

Какой лучший способ сделать это в ZendFramework? Чтобы создать плагинили же?Я хочу выполнить его в нескольких местах, но если мне нужно отредактировать его, я хочу отредактировать его в одном месте.

Ответы [ 2 ]

6 голосов
/ 29 января 2012

Вот пример Action Helper , который можно легко вызывать с контроллеров.

<?php

class My_Helper_CheckFbLogin extends Zend_Controller_Action_Helper_Abstract
{
    public function direct(array $params = array())
    {
        // you could pass in $params as an array and use any of its values if needed

        $request = $this->getRequest();
        $view    = $this->getActionController()->view;

        $fbLogin = new Zend_Session_Namespace('fbLogin'); #Get Facebook Session
        if(!$fbLogin->user) {
            $this->getActionController()
                 ->getHelper('redirector')
                 ->gotoUrl('/'); #Logout the user
        }

        return true;
    }
}

Чтобы использовать его, вы должны указать брокеру-помощнику, где он будет жить. Вот пример кода, который вы можете вставить в загрузчик, чтобы сделать это:

// Make sure the path to My_ is in your path, i.e. in the library folder
Zend_Loader_Autoloader::getInstance()->registerNamespace('My_');
Zend_Controller_Action_HelperBroker::addPrefix('My_Helper');

Затем, чтобы использовать его в вашем контроллере:

public function preDispatch()
{
    $this->_helper->CheckFbLogin(); // redirects if not logged in
}

Это не вдаваться в подробности, но Написание собственных помощников также полезно.

0 голосов
/ 02 июля 2012

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

class My_Base_Controller extends Zend_Controller_Action
{ 
    public function init()
    { ...

class IndexController extends My_Base_Controller
{ ...

Переместите init() в базовый контроллер, и вам не нужно повторяться в каждом конкретном контроллере.

Нужно варьировать init() в конкретном контроллере?

class FooController extends My_Base_Controller
{
    public function init()
    {
        parent::init();
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...