2013-07-05 3 views
2

Служба не вызывает setContainer, когда я расширяю ContainerAware или реализую ContainerAwareInterface.Создать сервис, реализующий ContainerAwareInterface

class CustomService implements ContainerAwareInterface 
{ 
    public function setContainer(ContainerInterface $container = null) 
    { 
     $this->container = $container; 
    } 
} 

Как я могу использовать контейнер из моей службы без инъекции? Требуется ли передать объект контейнера конструктору или сеттеру?

+0

Это Ваш полный класс или просто подмножество ? $ this-> container не существует в вашем классе. Пожалуйста, покажите свои заявления «use». – saamorim

+0

. Вы пытались установить параметры вызовов в определении своей службы, чтобы вызвать метод setContainer, передающий service_container в качестве аргумента? – Picoss

ответ

7

сделать определение в вашем файле services.yml

services: 
    bundle.service_name: 
     class: ... 
     calls: 
      - [ setContainer, [ @service_container ] ] 
+0

Я сделал именно это, но теперь все приложение просто висит – Zennichimaro

+0

Какая ошибка? –

+0

Вы должны поставить имя службы в пальто: услуги: bundle.service_name: класса: ... звонков: - [setContainer, [ '@service_container']] – Cedo

3

Только, реализующего ContainerAware или ContainerAwareInterface недостаточно. Вы должны вызвать инъекцию сеттера с аргументом service_container. Но инъекция полного контейнера не рекомендуется. Лучше вводить только те услуги, которые вам действительно нужны.

4

Вы должны поставить имя службы в кавычки:

services: 
    bundle.service_name: 
     class: ... 
     calls: 
      - [ setContainer, [ '@service_container' ]] 
1

Существует также ContainerAwareTrait, что вы можете использовать для реализации ContainerAwareInterface.

1

Это пример полной реализации службы, поддерживающей контейнер.

Следует помнить, что следует избегать инъекции всего контейнера. Рекомендуется применять только необходимые компоненты. См. Law of Demeter - Wikipedia для получения дополнительной информации по этому вопросу.

С этой целью, эта команда поможет найти все доступные услуги:

# symfony < 3.0 
php app/console debug:container 

# symfony >= 3.0 
php bin/console debug:container 

Во всяком случае, вот полный пример.

app/config/services.yml файл:

app.my_service: 
    class: AppBundle\Service\MyService 
    calls: 
     - [setContainer, ['@service_container']] 

класс обслуживания в src/AppBundle/Service/MyService.php:

<?php 

namespace AppBundle\Service; 

use Symfony\Component\DependencyInjection\ContainerAwareInterface; 
use Symfony\Component\DependencyInjection\ContainerAwareTrait; 

class MyService implements ContainerAwareInterface 
{ 
    use ContainerAwareTrait; 

    public function useTheContainer() 
    { 
     // do something with the container 
     $container = $this->container; 
    } 
} 

И, наконец ваш контроллер в src/AppBundle/Controller/MyController.php:

<?php 

namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; 
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Response; 

/** 
* My controller. 
*/ 
class MyController extends Controller 
{ 
    /** 
    * @Route("/", name="app_index") 
    * @Method("GET") 
    */ 
    public function indexAction(Request $request) 
    { 
     $myService = $this->get('app.my_service'); 
     $myService->useTheContainer(); 

     return new Response(); 
    } 
} 
Смежные вопросы