symfony service -- Вызов контроллера в других контроллерах (использование одинаковых участков кода)
Primary tabs
Для того чтобы можно было вызвать Контроллер из другого Контроллера, необходимо создать для него Сервис.
В чём проблема
При создании экземпляра контроллера Symfony создаёт контейнер, в который помещает стандартные сервисы (например, doctrine). Проблема в том, что, когда мы хотим обратиться к методу контроллера из другого класса, мы не можем просто создать его объект (в нём не будет контейнера).
Решение
Лучшей практикой будет вынос всех функциональных участков кода, в том числе и многократно используемых, из контроллера в сервисы.
Создать сервис можно так.
Как вариант решения проблемы - создание объекта контроллера и одновременно запуск метода setConteiner(), устанавливающего свойство conteiner. Чтобы не делать это каждый раз вручную, принято создавать сервис, который является по сути инстансом своего класса с определёнными свойствами.
Вот так будет выглядеть код:
- Вызываемый контроллер:
<?php namespace AppBundle\Controller; use AppBundle\Entity\Category; use Doctrine\ORM\EntityNotFoundException; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\DependencyInjection\ContainerInterface; class CategoryController extends Controller { protected $container; /** * @param ContainerInterface $container * * @return self */ public function setContainer(ContainerInterface $container = null): self { $this->container = $container; return $this; } /** * @return array */ public function getCategories(): array { // какой-то метод, который нужно вызвать из другого класса return $categories; } }
- Сервис (в services.yml):
categories.for.menu: class: AppBundle\Controller\CategoryController calls: - method: setContainer arguments: - "@service_container" # aliases: AppBundle\Controller\CategoryController: '@categories.for.menu'
- Вызывающий контроллер:
$this->get('categories.for.menu')->getCategories();
Источники
- Log in to post comments
- 7609 reads
vedro-compota
Wed, 12/13/2017 - 16:18
Permalink
по-хорошему надо всё общее
по-хорошему надо всё общее выносить куда-то ещё, а если нужен прям другой контроллер то делать переадресацию. Разве нет?
Хотя, наверное бывают исключения)
_____________
матфак вгу и остальная классика =)
melisa
Wed, 12/13/2017 - 17:17
Permalink
а если нужен прям другой
нет, речь идёт об одном методе, реализующем какой-то функционал
При создании экземпляра контроллера Symfony создаёт контейнер, в который помещает стандартные сервисы (например, doctrine). Проблема в том, что, когда мы хотим обратиться к методу контроллера из другого класса, мы не можем просто создать его объект (в нём не будет контейнера).
Решением проблемы является создание объекта контроллера и одновременно запуск метода seConteiner(), устанавливающего свойство conteiner. Чтобы не делать это каждый раз вручную, принято создавать сервис, который является по сути инстансом своего класса с определёнными свойствами.
vedro-compota
Wed, 12/13/2017 - 18:43
Permalink
и всё равно надо добавить,
и всё равно надо добавить, что повторно используемый код нельзя держать непосредственно в контроллере.
_____________
матфак вгу и остальная классика =)