Nasıl tüm denetleyicileri benim init işlevleri kod merkezde mi?

3 Cevap php
public function init(){
    	$this->view->user = Zend_Auth::getInstance()->getIdentity();
    	$this->view->siteName = Zend_Registry::get('config')->site->name;
    	$this->view->menu = $this->_helper->generateMenu(Zend_Auth::getInstance()->getIdentity());
    	$this->view->slogan = Zend_Registry::get('config')->site->slogan;
    }

Bu modül / denetleyici çağrıldığını her isteği umursamamak yürütür yüzden ben bu kodu koyabilirsiniz bir yer var, tüm modüller arasında benim denetleyicileri tüm init dosyası nedir?

3 Cevap

Sen Zend_Controller_Action uzatabilirsiniz:

public class My_Controller_Action extends Zend_Controller_Action
{
    public function init()
    {
        $this->view->user = Zend_Auth::getInstance()->getIdentity();
        $this->view->siteName = Zend_Registry::get('config')->site->name;
        $this->view->menu = $this->_helper->generateMenu(Zend_Auth::getInstance()->getIdentity());
        $this->view->slogan = Zend_Registry::get('config')->site->slogan;
    }

}

Sonra sadece oldukça Zend_Controller_Action daha My_Controller_Action uzatmak için denetleyicileri değiştirin. Sadece bir kontrol init yöntemine ek kod eklemeniz gerekiyorsa, siz de parent :: init () çağırmak gerekir unutmayın:

public class FooController extends My_Controller_Action
{
    public function init()
    {
        parent::init();

        // Do something.
    }

    public function IndexAction()
    {
        // ...
    }
}

Ben oldukça Zend_Controller_Plugin_Abstract uzanan bir eklenti yazmak için tavsiye ediyorum, onun amacı budur.

By this way, you will have no need to do anything anywhere in your controller. Then you can use the registry to access to your data...

class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{
    protected $_auth = null;

    protected $_acl = null;

    public function __construct (Zend_Auth $auth, Zend_Acl $acl)
    {
        $this->_auth = $auth;
        $this->_acl = $acl;
    }

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
         //some code
    }
}

Ve sonra bootstrap.php içinde

$this->_front->registerPlugin(new My_Controller_Plugin_Layout());

http://framework.zend.com/manual/en/zend.controller.plugins.html

Öncelikle var sorunu çözmek için tasarlanmış bir eylem Yardımcısı oluşturmak, denetleyiciler genelinde kodu paylaşmak.

Onlar, "istek üzerine" çalıştırılabilir:

$myHelper = $this->_helper->MyHelper;
$myHelper->someFunction();

ve ayrıca sevk işlemi otomatik olarak arayacak kanca bir dizi var. Kanca kullanmak için, komisyoncu ile eylem yardımcıya kayıt gerekir:

$helper = new App_Controller_Action_Helper();
Zend_Controller_Action_HelperBroker::addHelper($helper);

Mevcut kancalar vardır:

  • init()
  • preDispatch()
  • postDispatch()

Daha fazla bilgi için, manuel sayfa http://framework.zend.com/manual/en/zend.controller.actionhelpers.html bulunabilir ve ben onlar hakkında makaleler bir çift yazdım: http://akrabat.com/2008/10/31/using-action-helpers-in-zend-framework/ ve http://akrabat.com/2008/11/05/hooks-in-action-helpers/