Symfony: почему мой контейнер пуст в моем контроллере?

В Symfony 3.3 у меня есть контроллер TrainingOrganizationController:

class TrainingOrganizationController extends Controller
{
    @Route...
    public function deleteAction(Request $request, UserInterface $user, TrainingOrganization $organization)
    {
        ...
        $this->delete($user, $organization);
        ...
    }

    public function delete(UserInterface $user, TrainingOrganization $organization)
    {
        $organization->setDeletedAt(new \DateTime());
        $organization->setDeletedBy($user);

        $entityManager = $this->getDoctrine()->getManager();

        $centers = $entityManager->getRepository(TrainingCenter::class)->getResults([
            'whereTrainingOrganizationId' => $organization->getId(),
        ]);

        foreach ($centers as $center) {
            $this->get(TrainingCenterController::class)->delete($user, $center);
        }
    }
}

Этот контроллер вызывает другой контроллер: функции TrainingCenterController и delete():

class TrainingCenterController extends Controller
{
    public function delete(UserInterface $user, TrainingCenter $center)
    {
        $center->setDeletedAt(new \DateTime());
        $center->setDeletedBy($user);

        $entityManager = $this->getDoctrine()->getManager(); // ERROR
        ...

Но у меня есть эта ошибка в функции delete: «Вызов функции-члена get() при нулевом значении». Я не понимаю, потому что мой контроллер как сервис имеет конфигурацию по умолчанию:

AppBundle\Controller\:
    resource: '../../src/AppBundle/Controller'
    public: true
    tags: ['controller.service_arguments']

Можете вы помочь мне ? Я хочу вызывать несколько контроллеров для каскадного удаления (а не повторять код) :)


person Gaylord.P    schedule 11.11.2017    source источник
comment
Для каскадного удаления? Вы используете доктрину ORM?   -  person BENARD Patrick    schedule 12.11.2017
comment
Да, но я не хочу использовать удаление Cascade для доктрин. Я просто хочу вызвать несколько контроллеров :)   -  person Gaylord.P    schedule 12.11.2017


Ответы (1)


Вы используете контроллер в качестве общей службы — лучше использовать обычную службу, в которую вы вводите экземпляр доктрины с помощью конструктора и вызываете эту службу из любого места, где это необходимо — через ->get(name::class) или с помощью полностью управляемого службой контроллера с полным __constructor(TypeHint $serviceName) .

Когда система создает контроллер и вызывает действие (или __invoke()), происходит еще одна вещь: ContainerAwareTrait позволяет вызывать setContainer(), чего не происходит для обычных служб.

person Alister Bulman    schedule 11.11.2017