Есть много разных способов, каждый из которых имеет свои плюсы и минусы.
Во-первых, каждый сервис - это какой-то объект, так что вы всегда можете просто создать рассматриваемый объект самостоятельно.Вы можете быть вынуждены иметь дело со многими ссылками, но это возможно.Это подрывает идею внедрения зависимостей, поэтому это не то, что вам следует делать!
Второй способ - внедрить службу в ваш класс:
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-контейнер сделает это за вас.Если вы хотите узнать больше, прочитайте здесь .