Как загрузить плагины с модулями - PullRequest
0 голосов
/ 08 сентября 2010

У меня есть этот плагин в каталоге plugins в каталоге модуля admin .Итак, это в application/modules/admin/plugins/LayoutPlugin.php:

<?php
class LayoutPlugin extends Zend_Controller_Plugin_Abstract
{
   public function preDispatch(Zend_Controller_Request_Abstract $request)
   {
      $layout = Zend_Layout::getMvcInstance();
      $view = $layout->getView();

      $view->whatever = 'foo';
   }
}

Я бы хотел использовать его для отправки переменных в представление макета.Бывает, что я получаю Fatal error: Class 'LayoutPlugin' not found каждый раз, когда пытаюсь Zend_Controller_Front::getInstance()->registerPlugin(new LayoutPlugin()); в admin bootstrap.

Как загрузить плагин внутри модуля?

Ответы [ 2 ]

1 голос
/ 16 ноября 2012

Я знаю, что это старый вопрос, но это всегда меня беспокоило.Я не знаю, сделал ли ZF 2 что-нибудь для ее решения (у меня еще не было возможности поиграть с этим), но я написал плагин для загрузчика плагинов, чтобы справиться с этим для ZF 1!

Проблема, конечно, в том, что даже при настройке автозагрузчика модуля и сохранении ваших плагинов в папке плагинов модуля, это только настраивает автозагрузку (которая в любом случае является межмодульной), а не регистрацию.Это означает, что вы можете создать плагин со строкой в ​​вашем application.ini, но он будет автоматически загружен и зарегистрирован для каждого модуля.

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

<?php

class BaseTen_Controller_Plugin_ModulePluginLoader extends Zend_Controller_Plugin_Abstract {

    private $_pluginMap;

    public function __construct(array $pluginMap) {
        $this->_pluginMap = $pluginMap;
    }

    public function routeShutdown(Zend_Controller_Request_Abstract $request) {
        $module = $request->getModuleName();

        if(isset($this->_pluginMap[$module])) {

            $front = Zend_Controller_Front::getInstance();

            foreach($this->_pluginMap[$module] as $plugin) {
                $front->registerPlugin(new $plugin());
            }
        }
    }
}

Поскольку нам нужно передать classMap вконструктор, нам нужно создать экземпляр и зарегистрировать этот плагин с помощью Front Controller, а не с помощью строки в application.ini:

public function _initPluginLoader() {
    $front = Zend_Controller_Front::getInstance();
    $front->registerPlugin(new BaseTen_Controller_Plugin_ModulePluginLoader(array(
        'default' => array(
            'Plugin_Foo',
            'Plugin_Bar',
            ...
        ),
        'foo' => array(
            'Foo_Plugin_Foo',
            'Foo_Plugin_Bar',
            ...
        )
    )));
}

Самый ранний плагин, который может быть запущен, - routeShutdown, иначе мы победимне знаю активный модуль.Однако это означает, что любые другие плагины, зарегистрированные с использованием этого метода, могут запускаться только с dispatchLoopStartup.В основном мы, вероятно, заинтересованы в preDispatch и postDispatch крючках, но о них стоит помнить.

1 голос
/ 08 сентября 2010

Модуль начальной загрузки модуля настраивает автозагрузчик модуля по умолчанию, поэтому, если вы переименуете свой класс в Admin_Plugin_LayoutPlugin, ZF сможет его найти.

Имейте в виду, что начальная загрузка администратора (как и все начальные загрузки) будет выполняться независимо от того, находитесь ли вы в модуле администратора или нет, поэтому, если вы намерены назначить дополнительные переменные только для ваших страниц администратора, которые вам понадобятся перед тем, как зарегистрировать плагин, убедитесь, что admin является текущим модулем.

...