ZF2: Как прикрепить слушателя к событию в классе модуля?

Я хочу, чтобы basePath было одинаковым для каждого компонента моего Mvc для данного запроса. Я имею в виду, что когда я вызываю эти методы, я хочу получить тот же результат, скажем, '/spam/ham/':

echo $this->headLink()->prependStylesheet($this->basePath() . '/styles.css')  // $this->basePath() has to be '/spam/ham/'

$this->getServiceLocator()
     ->get('viewhelpermanager')
     ->get('headLink')
     ->rependStylesheet($this->getRequest()->getBasePath() . '/styles.css')   // $this->setRequest()->getBasePath() has to be /spam/ham/

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

И теперь второе - basePath нужно установить в Request:

$this->getRequest()->getBasePath()

Здесь я нашел ответ, который на самом деле вообще не работает http://zend-framework-community.634137.n4.nabble.com/Setting-the-base-url-in-ZF2-MVC-td3946284.html. Как сказано здесь StaticEventManager устарел, поэтому я изменил его на SharedEventManager :

// In my Application\Module.php

namespace Application;
use Zend\EventManager\SharedEventManager

    class Module {
        public function init() {             

                $events = new SharedEventManager(); 
                $events->attach('bootstrap', 'bootstrap', array($this, 'registerBasePath')); 
            } 

            public function registerBasePath($e) { 

                $modules = $e->getParam('modules'); 
                $config  = $modules->getMergedConfig(); 
                $app     = $e->getParam('application'); 
                $request = $app->getRequest(); 
                $request->setBasePath($config->base_path); 
            } 
        } 
    }

И в моем modules/Application/configs/module.config.php я добавляю:

'base_path' => '/spam/ham/' 

Но это не работает. Проблемы:

1) Прогон никогда не доходит до функции registerBasePath. Но это необходимо. Я прикрепил событие с прослушивателем в функции init.

2) Когда я меняю SharedEventManager только на EventManager, происходит переход к функции registerBasePath, но выдается исключение:

Fatal error: Call to undefined method Zend\EventManager\EventManager::getParam()

Что я делаю неправильно? Почему запуск программы не доходит до функции registerBasePath? Если это единственный способ установить basePath глобально, то как это сделать правильно?




Ответы (1)


Я знаю, что в документации отсутствуют такие вещи. Но вы правы в подходе к этому:

  1. Будьте рано (так при начальной загрузке)
  2. Возьмите запрос из приложения
  3. Укажите базовый путь в запросе

В документах отсутствует эта информация, а сообщение, на которое вы ссылаетесь, довольно старое. Самый быстрый и простой способ сделать это — использовать метод onBootstrap():

namespace MyModule;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $app->getRequest()->setBasePath('/foo/bar');
    }
}

Если вы хотите получить базовый путь из своей конфигурации, вы можете загрузить менеджер сервисов туда:

namespace MyModule;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $sm  = $app->getServiceManager();

        $config = $sm->get('config');
        $path   = $config->base_path;

        $app->getRequest()->setBasePath($path);
    }
}
person Jurian Sluiman    schedule 20.12.2012