Внедрение класса диспетчера Doctrine в контроллер не работает

В моем комплекте мне нужно инициализировать мой класс менеджера доктрин (как сервис и используя ManagerRegistry) в конструкторе контроллера, но Symfony по-прежнему выдает это исключение:

Ошибка типа: слишком мало аргументов для функции AdminBundle \ Controller \ RegistraceController :: __ construct (), 0 передано в C: \ apache \ htdocs \ mujProjekt \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ HttpKernel \ Controller \ ControllerResolver.p на линии 198 и ровно 1 ожидается

контроллер:

namespace AdminBundle\Controller;

use AdminBundle\Manager\AdminManager;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

/**
* Class DefaultController
* @package AdminBundle\Controller
* @Route("/registrace")
*/
class RegistraceController extends Controller
{
/**
* @var AdminManager
*/
private $manager;

public function __construct(AdminManager $manager)
{
$this->manager = $manager;
}

...

AdminManager:

namespace AdminBundle\Manager;

use AdminBundle\Entity\Uzivatel;
use Doctrine\Common\Persistence\ManagerRegistry;

class AdminManager
{
private $em;

public function __construct(ManagerRegistry $Doctrine)
{
$this->em = $Doctrine->getManager('default');
}

...

AdminBundle \ Resources \ config \ services.yml:

services:
#    admin.example:
#        class: AdminBundle\Example
#        arguments: ["@service_id", "plain_value", "%parameter%"]
admin.admin_manager:
class: AdminBundle\Manager\AdminManager
arguments:
["@doctrine"]

Я пытался очистить кэш, но безуспешно. Services.yml от AdminBundle правильно включен в config.yml.

orm config в config.yml:

    orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
AdminBundle:  ~

Я использую Symfony 3.3 и PHP 7.1.

0

Решение

если вы хотите внедрить свой AdminManager в свой RegistraceController, вы должны определить RegistraceController как сервис. смотреть на https://symfony.com/doc/current/controller/service.html. У этого подхода есть некоторые недостатки, поскольку вы не наследуете от базового контроллера Symfony. Таким образом, вы должны внедрить Router и Template Engine, если они вам нужны. Но мне нравится определять мой контроллер как сервис. Это намного чище, когда вы видите зависимости.

Вместо этого вы можете использовать Symfony Container внутри вашего контроллера в качестве Inversion Of Controll Container и получать свой сервис с помощью $ this-> get (‘admin.admin_manager’); изнутри вашего действия.

1

Другие решения

Поэтому я думаю, что ваш сервис YML должен выглядеть так:

services:
admin.admin_manager:
class: AdminBundle\Manager\AdminManager
arguments: ["@doctrine"]
admin.admin_controller:
class: AdminBundle\Controller\RegistraceController
arguments: ["@admin.admin_manager"]

Посмотрите здесь Сервисный контейнер Symfony

Надеюсь, это поможет!

Привет 🙂

0

Спасибо всем за ваши ответы. К счастью, я решил свою проблему, добавив это в services в app / config / services.yml.

    AdminBundle\Controller\:
resource: '%kernel.project_dir%/src/AdminBundle/Controller'
public: true
tags: ['controller.service_arguments']
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector