首页 文章

对控制器的Doctrine manager类注入不起作用

提问于
浏览
0

在我的包中,我需要在控制器的构造函数中初始化我的doctrine manager类(作为服务并使用ManagerRegistry),但symfony仍然会抛出此异常:

类型错误:函数AdminBundle \ Controller \ RegistraceController :: __ construct()的参数太少,在C:\ apache \ htdocs \ mujProjekt \ vendor \ symfony \ symfony \ src \ Symfony \ Component \ HttpKernel \ Controller \ ControllerResolver中传递0 . php在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"]

我试图清除缓存,但没有成功 . 来自AdminBundle的services.yml正确包含在config.yml中 .

config.yml中的orm config:

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

我正在使用Symfony 3.3和PHP 7.1 .

3 回答

  • 0

    如果要在RegistraceController中注入AdminManager,则必须将RegistraceController定义为服务 . 看https://symfony.com/doc/current/controller/service.html . 这种方法有一些缺点,因为你没有从Symfony的基础控制器继承 . 因此,如果需要,还必须注入路由器和模板引擎 . 但我喜欢将Controller定义为服务 . 当你看到依赖关系时,它会更清晰 .

    除此之外,您可以将控制器内的Symfony Container用作Controll容器的反转,并使用$ this-> get('admin.admin_manager')获取服务;从你的行动里面 .

  • 0

    所以我认为你的服务yml需要看起来像这样:

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

    在这里查找Symfony Service Container

    希望它会有所帮助!

    问候 :)

  • 1

    谢谢大家的回复 . 幸运的是,我通过将其添加到app / config / services.yml中的服务来解决了我的问题 .

    AdminBundle\Controller\:
        resource: '%kernel.project_dir%/src/AdminBundle/Controller'
        public: true
        tags: ['controller.service_arguments']
    

相关问题