【问题标题】:Symfony3 Use Entity Manager in Custom ContainerSymfony3 在自定义容器中使用实体管理器
【发布时间】:2018-07-21 17:07:04
【问题描述】:

我想为我的项目创建 HelperController。我生成了一个带有教义的控制器:generate:controller,我需要在其中使用实体管理器。

我注入到 services.yml 但它给出了这样的错误:

Argument 1 passed to CampingBundle\Controller\HelperController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given ...

我的控制器代码:

namespace CampingBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Doctrine\ORM\EntityManager;

class HelperController extends Controller
{
    protected $manager;

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

我的服务.yml:

services:
  camping.helper_controller:
      class: CampingBundle\Controller\HelperController
      arguments: ["@doctrine.orm.entity_manager"]

为什么它不起作用?我应该清除缓存或其他东西,还是定义有什么问题?

谢谢

【问题讨论】:

  • 由于您配置路线的方式,它不起作用。您需要稍作调整来告诉控制器解析器从容器中拉出控制器而不是新建它。 symfony.com/doc/current/controller/… 不过我有点怀疑你的控制器名称。希望您的 HelperController 不是为了帮助其他控制器。
  • 如果你有学说包安装程序,1:你的经理可以通过调用 $this->getDoctrine()... 2-当你扩展基本控制器时,你可以访问 $container,所以你可以注册一个服务来处理你的经理初始化并访问它

标签: symfony doctrine entitymanager symfony-3.3 symfony3.x


【解决方案1】:

尝试使用 EntityManagerInterface 并删除 extends Controller。 如果您需要 CAS(控制器即服务),请检查此 link。 将protected $manager; 更改为private $manager;

namespace CampingBundle\Controller;

use Doctrine\ORM\EntityManagerInterface;

class HelperController
{
    /**
     * @var EntityManagerInterface $entityManager
     */
    private $entityManager;

    /**
     * @param $entityManager
     */
    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->entityManager = $entityManager;
    }
}

【讨论】:

  • 我试过了,但它仍然给出错误,如:Argument 1 passed to CampingBundle\Controller\HelperController::__construct() must implement interface Doctrine\ORM\EntityManagerInterface, none given, called in ..
  • 您是否在 CampingBundle 中正确实施了 DI?将您的 camping.helper_controller: class: CampingBundle\Controller\HelperController arguments: ["@doctrine.orm.entity_manager"] 添加到 app/config/services.yml 以进行检查。
  • 而且你需要在服务定义中找到你的服务。 bin/console debug:container | grep HelperController
  • @0TshEL_n1ck - 如果他想要一个常规控制器,那么他需要从基本控制器类扩展。当没有传递任何参数时,从 EntityManager 更改为 EntityManagerInterface 将无济于事。我在回答问题时发现有用的一件事是重现实际问题,然后在发布之前测试任何建议的解决方案。只是一个想法。
  • @Cerad,在我看来,他需要正确实现传递数据的依赖注入。关于常规控制器,我通过了关于 CAS 的链接。我向他指出了关于 EntityManagerInterface 和访问修饰符的基本知识,因为如果不了解这些内容,他将很难。
【解决方案2】:

我将把我的两分钱留在这里,因为我遇到了同样的问题,并通过在服务中添加 tags 来解决它。

something.validate.some_service:
  class: Path\To\Some\Validator
  arguments:
    - '@doctrine.orm.entity_manager'
  tags:
    - { name: validator.constraint_validator, alias: some_validator_alias }

How to Work with Service Tags by Symfony

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2015-12-12
    • 1970-01-01
    • 2023-03-15
    • 2018-02-16
    • 1970-01-01
    • 2015-06-12
    • 2019-01-27
    相关资源
    最近更新 更多