Где разместить общую бизнес-логику для всех страниц в symfony2 - PullRequest
4 голосов
/ 12 марта 2012

Сейчас я работаю над своим первым проектом symfony2.Я создал службу, и мне нужно вызывать ее для каждого контроллера для создания html, необходимого для всех страниц моего веб-сайта.

Поэтому я создал класс BaseController, который расширяет Symfony \ Bundle \ FrameworkBundle \Контроллер \ класс контроллера и попытался поместить код в этот класс BaseController.Теперь всякий раз, когда я звоню из конструктора:

$my_service = $this->get('my_service');

или

$my_service = $this->container->get('my_service');

я получаю сообщение об ошибке:

Call to a member function get() on a non-object.

Объект контейнера не был инициализирован.Каково решение этой проблемы?Как использовать метод DRY в symfony2, если я хочу разместить левую панель или заголовок на всех страницах, которые содержат динамические данные?

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 12 марта 2012

Вы не должны использовать конструктор в своем классе контроллера, особенно когда вы наследуете от Symfony Controller: таким образом вы получаете контейнер после экземпляра объекта (DIC вызовет метод setContainer, унаследованный от Symfony'sконтроллер).

В общем, для ваших первых экспериментов используйте сервисы в методах действия;если есть какая-то сквозная логика, которую вам нужно выполнять в каждом запросе, вы можете подумать о регистрации некоторых слушателей событий (см. документацию «Internals» на веб-сайте Symfony).

Когда вы получаете больше уверенности в фреймворкевы можете начать думать о том, чтобы не наследовать контроллер Symfony, зарегистрировать классы контроллера в DIC и добавить нужные вам сервисы вручную (в конечном итоге реализовать некоторую логику в конструкторе).

4 голосов
/ 13 марта 2012

Я знаю, что это не тот ответ, который вам нужен, но если вам нужен html на всех страницах, я думаю, что использовать службу так, как вы делаете, - неправильный путь.

Я думаю, вы знаете о ветке ивозможность использовать макет для размещения общего кода.Но вы также можете встроить контроллер:

{% render "AcmeArticleBundle:Article:recentArticles" %}

В рамках недавнего действияArArticsAction вы можете разместить свой конкретный код и вернуть шаблон.Таким образом, вы можете получить собственный HTML-код в каждый из ваших шаблонов!Смотрите документы Symfony для более подробной информации: http://symfony.com/doc/current/book/templating.html#embedding-controllers

0 голосов
/ 06 января 2015

Бизнес-логика - это весь пользовательский код, который вы пишете для своего приложения, который не относится к конкретной среде (например, маршрутизация и контроллеры).Классы домена, сущности Doctrine и обычные классы PHP, которые используются как services , являются хорошими примерами бизнес-логики. Ref

...