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

时间:2017-11-10 11:24:35

标签: php symfony orm doctrine bundle

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

  

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

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

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

答案 1 :(得分: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

希望它会有所帮助!

问候:)

答案 2 :(得分:0)

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

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