Сервисный контейнер Symfony2 - возвращает ли get () объекты по ссылке или копированию? - PullRequest
2 голосов
/ 25 января 2012

Просто быстрый вопрос, интересно, возвращаются ли объекты, извлеченные из сервисного контейнера в Symfony2, по ссылке или в виде копии?

Причина, по которой я спрашиваю, заключается в том, что я хочу знать, делаю ли я что-то вроде:

public function helloAction()
{
    $mailer = $this->get('acme.mailer');
    $mailer->shutdown();
}

в контроллере, а метод shutdown () делает что-то внутренне с объектом, будет ли служба acme.mailer "выключаться" в контейнере?

Другими словами, могу ли я навсегда изменить службу после получения ее из контейнера? Это хорошая практика?

Спасибо

1 Ответ

5 голосов
/ 25 января 2012

Сервисы возвращаются по ссылке, как и все объекты PHP (по умолчанию).

Это не значит, что вы всегда будете получать один и тот же экземпляр данного сервиса.

Каждый сервис определен в области.Контейнер DependencyInjection предоставляет две общие области:

  • контейнер - каждый раз, когда вы запрашиваете услугу, вы получаете один и тот же экземпляр
  • прототип - каждый раз, когда вы запрашиваете услугу, вы получаетеновый экземпляр

Область контейнера является областью по умолчанию.

Примечание : Symfony представляет дополнительные области.

Подробнее об областях можно узнать у официальногоДокументация: Как работать с областями действия

Чтобы ответить на вторую часть вопроса.Если сервис определен в области видимости контейнера, я не думаю, что это хорошая идея - уничтожить его в контроллере.Другие части вашего приложения могут все еще нуждаться в нем.Я бы лучше отключился в деструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...