Услуги в Symfony2 - PullRequest
       13

Услуги в Symfony2

0 голосов
/ 02 марта 2012

Я пытаюсь получить какой-то сервис (например, сеанс) из-за пределов контроллера.

Пожалуйста, объясните, как это сделать правильно.

1 Ответ

3 голосов
/ 02 марта 2012

Есть много разных способов, каждый из которых имеет свои плюсы и минусы.

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

Второй способ - внедрить службу в ваш класс:

class MyClass{

    public function __construct($session){
        // ...
    }
}

class MyContainer extends Controller{

    public function SomeKindOfAction(){
        $myClass = new MyClass($this->get('session'));
    }
}

Это может быть нормально, если вы используете толькокласс в вашем контроллере.Если у вас есть больше вложенных отношений, как в MyClass, вы создаете другой класс, в котором вам нужен сеанс, вы можете столкнуться с жесткой связью (чего следует избегать), а также с проблемами сложности.

Лучший способ - этосоздайте свой собственный сервис и вводите туда то, что вам нужно.Существует множество документов, поэтому я просто приведу краткий пример использования MyClass выше.

services.yml:

services:
    my.myClass:
        class: /Acme/DefaultBundle/MyStuff/MyClass
        arguments: ["@session"]

Теперь ваш класс - это сервис (кто бы мог подумать, что это так просто!), И вы можете использовать его внутриваш контроллер:

class MyContainer extends Controller{

    public function SomeKindOfAction(){
        $myClass = $this->get('my.myClass');
    }
}

Теперь вам не нужно думать о конструкторе и о том, как получить ваши объекты, DI-контейнер сделает это за вас.Если вы хотите узнать больше, прочитайте здесь .

...