Краткий ответ
Нет, услуги не должны быть определены в пакете.Фактический класс обслуживания может находиться или не находиться внутри пакета - они могут находиться в папке библиотеки поставщика (или где-либо еще в этом отношении).И определения сервисов, хотя они обычно определяются в Resources\config\services.yml
комплекта, также могут быть определены в app/config.yml
под ключом services
.
Сервис - это просто класс, который был зарегистрирован в контейнере внедрения зависимостей Symfony,Сам класс может жить где угодно.
Длинный ответ
Важно понимать назначение пакетов в Symfony2.Большая часть вашего проекта (за исключением сторонних библиотек) состоит из пакетов.Некоторые люди любят складывать все в один гигантский пакет, но я предпочитаю использовать их в качестве контейнеров для определенных функций (например: управление пользователями, управление публикациями в блогах, управление активами).
Поскольку пакеты должны представлять собой один фрагментфункциональности имеет смысл определить некоторые сервисы в пакетах.Например, естественно определить BlogPostEntityService
класс в BlogPostBundle
.Теперь, только потому, что сервис содержится в пакете, не делает его менее глобальным.Если я зарегистрирую свой сервис как blog_bundle.blog_post_entity_service
, я все равно смогу получить к нему доступ из любого другого пакета.
В примере с Мартином MyService
является расплывчатым примером - он не является конкретным, как BlogPostEntityService
.Тем не менее, вполне вероятно, что вы создадите сервисные службы (например, ArrayUtilService
), и в этом случае вы можете создать UtilBundle
и сохранить службу там.
Какова лучшая практиказдесь?
Нет однозначного ответа - вам решать, где хранить классы обслуживания.Спросите себя, имеет ли служба непосредственное отношение к той функциональности, которую представляет ваш пакет - если это так, то, скорее всего, он входит в пакет.Это также имеет смысл, если вы планируете поделиться или повторно использовать свой пакет.
Служба доступна только для контроллеров в пакете HelloBundle?
Нет.Вы можете позвонить в службу из любого контроллера (или из любого класса container
).Вы также можете ввести MyService
в любой другой сервис.