2015-03-01 3 views
1

Существует пример создания и использования службы в official documentation. При запуске мы создаем какой-то класс, а затем зарегистрировать его в конфиге/services.yml то мы можем использовать его в коде, как это:Где можно использовать услуги Symfony?

$result = $this->get('app.myservice')->myMethod($arg); 

//(In the [example][1] it is little bit other code:) 
//$slug = $this->get('app.slugger')->slugify($post->getTitle()); 

Но для чего? в то время как я могу просто так:

use MyServiceNamespace/MyService 
//... 
$result = (new MyService())->myMethod($arg); 

Где прибыль от использования Услуг? Это просто синтаксический сахар?

ответ

4

Nope. Вдали от синтаксиса сахара.

Вам необходимо иметь представление о том, что означает инъекция зависимости. Возможно, начните с проскальзывания здесь: http://symfony.com/doc/current/book/service_container.html

Предположим, что вашему сервису нужен репозиторий доктрины для выполнения его работы. Что лучше?

class MyController 
{... 
    $userManager = $this->get('user.manager'); 
    OR 
    $userRepository = $this->getDoctrine()->getManager()->getRepository('MyBundle::User'); 
    $userManager = new UserManager($userRepository); 

Ваш выбор, но как только вы проработали механику того, как добавить услугу, тогда вы никогда не оглянетесь назад.

Я также должен указать, что ваш пример sluglfy требует использования оператора использования и связывает ваш код непосредственно с конкретной реализацией. Если вам когда-либо понадобится скорректировать ваше slugification, вам нужно вернуться и изменить все места, где оно используется.

// These lines make your code more difficult to maintain 
use Something\Slugify; 
$slugify = new Slugify(); 
AS Opposed to 
$slugify = $this->get('slugify'); 
3

'В данном случае это не имеет отношения к делу. Но с точки зрения простой конструкции службы позволяют лучше управлять зависимостями.

Например, если вы объявляете услугу, передающую другую, тогда вам не придется инициировать их обоих. Symfony позаботится об этом.

И поскольку ваша декларация централизована, любая модификация способа, по которому вы решили создать свою службу (= объявить ее), вам не придется менять все ссылки на службы, которые вы изменили, поскольку symfony позаботится о том, чтобы если это необходимо.

Еще один момент - это объем услуг. Эта информация может быть проверена, но я думаю, что symfony запускает службу один раз (Singleton), что означает лучшее использование памяти.

Смежные вопросы