View Helper’ы Zend Framework в видах Symfony 2

block-device-iconВ жизни возникает много всяких инетересных задач. Как правило, можно выделить задачи класса “реализовать такую-то фишку” и “извернуться, чтобы оно работало”. Вот, как раз, о последнем типе задач и пойдёт речь в этом посте.

Иногда в процессе разработки параллельно с разработкой идут несколько “миграций”. Ну например переход с SQL на NoSQL, я об этом как-то уже писал. Не суть. Так вот, представим, что идёт миграция с Zend Framework на Symfony (да простят меня любители ZF). Нам необходимо, чтобы наши горячо любимые (т.к. хорошо отлаженные) ZF View хелперы работали и в Sf-окружении. Как же это сделать.

Задача

Необходимо, чтобы одни и те же (да, без копипасты) Zend Framework View Helper-ы работали как в Zf окружении, так и в Sf окружении.

Решение

Многим разработчикам хорошо знаком механизм Zend_Application_Bootstrap  в ZF. Очень, надо сказать, удобная штука. Там можно описывать зависимости одних классов от других и порядок их загрузки. Вернее так, сначала описываем зависимости, потом подгружаем нужный класс, а уж он подгружает своё дерево зависимостей.

symfony_poster

Я был очень удивлён, но симфоневский Dependency Injection работает точно так же. Я просто перенес ресурсы в сервисы, определил зависимости, и они загрузились. Для решения нашей задачи нам понадобится Zend_layout. Воспользуемся механизмом factory_service/facctory_method

services.yml

Отлично, сразу как на ладони видны зависимости. Про содержимое методов не буду распространяться, если коротко, то в бандле есть специальный сервис, который называется (OurNamespace\DefaultBundle\Service\Bootstrap). Он содержит в себе методы, фабрики для классов-сервисов, которые аналогичны ресурсам в Zend_Application. А остальные сервисы используют его для ссылки на свои конструкторы.

Например, для создания объекта Zend_Controller_Front используется метод createZfFrontController@zf.bootstrap, т.е. OurNamespace\DefaultBundle\Service\Bootstrap:;createZfFrontController(). Для создания объекта лейаута используем OurNamespace\DefaultBundle\Service\Bootstrap::createZfLayout (Zend_Controller_Front, Symfony\Bundle\FrameworkBundle\Templating\Helper\ActionsHelper). В принципе на этом этапе всё понятно. Теперь, сама суть. Создаём сервис “zf.view_helpers_proxy”:

services.yml

Тут используется уже не функция-фабрика из Bootstrap, а вполне себе обычны конструктор класса ZendViewHelpersProxy.

А вот и сам класс:

Обращаем вниманеи на функцию getName() и теги в описании сервиса { name: templating.helper, alias: zf }. Это позволит нам использовать ЛЮБОЙ Zend Framework View Helper в Symfony вот так:

По сути обычный прокси, который позволит обеспечить совместимость и избежать дублирования кода. А со временем можно будет потихоньку пеерписать хелперы. Главное, что таким образом процесс миграции пойдёт плавно без авралов и факапов.

Ссылки

http://blog.logicexception.com/2011/11/creating-symfony2-helper.html
http://symfony.com/doc/2.0/book/templating.html

Leave a Comment