Всегда ли службы Symfony2 должны быть объявлены в комплекте? - PullRequest
1 голос
/ 08 февраля 2012

В Symfony2 сервис определяется как [выделение мин]:

Сервис - это общий термин для любого объекта PHP, который выполняет определенную задачу.Служба обычно используется " глобально ", например, объект подключения к базе данных или объект, который доставляет сообщения электронной почты.В Symfony2 службы часто настраиваются и извлекаются из контейнера служб.Говорят, что приложение, которое имеет много разделенных сервисов, следует сервис-ориентированной архитектуре.

С ключевым словом «глобально» во всех примерах, которые я вижу, как определить сервис, декларируется сервис.в существующем комплекте?Вот пример из MartinSikora.com

<?php
    // Bundle/HelloBundle/Services/MyService.php
    namespace Bundle\HelloBundle\Services;

    class MyService {

        public function sum($n1, $n2) {
            return $n1 + $n2;
        }

    }
?>

Затем он использует его из Hello Controller:

<?php
// Bundle/HelloBundle/Controller/HelloController.php
namespace Bundle\HelloBundle\Controller;

class HelloController extends Controller {

    public function indexAction() {
        $number = $this->get('my_service')->sum(12, 37);
        // this returns 49

        /*
        ...
        */
    }
}
?>

Обратите внимание, как его пример службы объявлен внутрипакет HelloBundle в папке с надписью «Службы».Разве не было бы лучше, если бы папка «Службы» хранилась на один или несколько уровней выше вне какого-либо конкретного пакета, поскольку службы предназначены для использования во всем приложении?

  • Какова лучшая практика здесь?
  • Служба доступна только для контроллеров в пакете HelloBundle?
  • Почему это обычно делается так?

1 Ответ

10 голосов
/ 08 февраля 2012

Краткий ответ
Нет, услуги не должны быть определены в пакете.Фактический класс обслуживания может находиться или не находиться внутри пакета - они могут находиться в папке библиотеки поставщика (или где-либо еще в этом отношении).И определения сервисов, хотя они обычно определяются в 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 в любой другой сервис.

...