Миграция zf2 на zf3

У меня есть некоторые проблемы, связанные с миграцией моего приложения с zf2 на zf3. Я ознакомился с руководствами по миграции и начал процесс миграции, как описано там.

Согласно руководству по миграции, serviceLocator больше не доступен в контроллерах. Раньше я использовал его в каждом действии контроллера для внедрения массива переменных config (расположенного в module.config.php), Doctrine MongoDB DocumentManager и Doctrine EntityManager в модели, где они необходимы. Теперь я получаю так много устаревших предупреждений, как показано ниже;

PHP устарел: Использование Zend\ServiceManager\ServiceManager::getServiceLocator устарело, начиная с версии 3.0.0; вместо этого используйте контейнер, переданный фабрике, в /var/www/html/LeapX/vendor/zendframework/zend-servicemanager/src/ServiceManager.php в строке 169.

Поскольку мне нужно получить доступ к переменным config и внедрить Doctrine DocumentManager и Doctrine EntityManager в мои модели, мне пришлось вызвать $this->getServiceLocator() в моих контроллерах. Дайте мне знать, как решить эту проблему. Есть ли возможность напрямую внедрить эти зависимости в мои классы моделей? Должен ли я использовать фабрики для моделей?

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


person chamindaindika    schedule 03.01.2017    source источник
comment
Этот ответ можно найти здесь: ServiceManager в ZF3   -  person Rafael Armenio    schedule 08.06.2017


Ответы (1)


Из того, что я прочитал сам, больше невозможно вызывать getServiceLocator() из контроллеров, они удалили его, так как он продвигает антипаттерн.

Вот сообщение в блоге от самого Мэтью по этому вопросу: https://mwop.net/blog/2016-04-26-on-locators.html

Еще одно объяснение от самого парня здесь (короче, может быть легче усвоить): https://github.com/zendframework/zend-mvc/issues/89

В настоящее время я также пытаюсь перенести проект ZF2 (2.4.10) на ZF3 и сталкиваюсь с той же проблемой.

Я лично согласен с рекомендацией явно определять зависимости ваших классов и контроллеров вместо (чрезмерного) использования метода getServiceLocator(), хотя в зависимости от вашего кода рефакторинг большого количества кода для этой цели может показаться PITA.

В качестве альтернативы, это, вероятно, может помочь (хотя я не могу сказать наверняка, так как сам не пробовал): http://circlical.com/blog/2016/3/9/preparing-for-zend-f

person aswardly    schedule 03.01.2017