当前位置: 首页 > 知识库问答 >
问题:

Symfony 2 EntityManager注入服务

阚亮
2023-03-14

我已经创建了自己的服务,需要注入doctrine EntityManager,但我看不到在我的服务上调用了\uu construct(),注入也不起作用。

以下是代码和配置:

<?php

namespace Test\CommonBundle\Services;
use Doctrine\ORM\EntityManager;

class UserService {

    /**
     *
     * @var EntityManager 
     */
    protected $em;

    public function __constructor(EntityManager $entityManager)
    {
        var_dump($entityManager);
        exit(); // I've never saw it happen, looks like constructor never called
        $this->em = $entityManager;
    }

    public function getUser($userId){
       var_dump($this->em ); // outputs null  
    }

}

这是我的包中的services.yml

services:
  test.common.userservice:
    class:  Test\CommonBundle\Services\UserService
    arguments: 
        entityManager: "@doctrine.orm.entity_manager"

我已经导入了. yml在config.yml在我的应用程序中

imports:
    # a few lines skipped, not relevant here, i think
    - { resource: "@TestCommonBundle/Resources/config/services.yml" }

当我在控制器中调用服务时

    $userservice = $this->get('test.common.userservice');
    $userservice->getUser(123);

我得到一个对象(不是null),但是$this-

还有一件事,Controller和UserService在不同的捆绑包中(我真的需要它来保持项目的组织),但是仍然:其他一切都很好,我甚至可以调用

$this->get('doctrine.orm.entity_manager')

在我用来获取UserService和有效(非空)EntityManager对象的同一个控制器中。

看起来我缺少了一段配置或者UserService和Doctrine配置之间的链接。


共有3个答案

常子濯
2023-03-14

注:自Symfony 3.3起,EntityManager已折旧。改用EntityManagerInterface。

namespace AppBundle\Service;

use Doctrine\ORM\EntityManagerInterface;

class Someclass {
    protected $em;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->em = $entityManager;
    }

    public function somefunction() {
        $em = $this->em;
        ...
    }
}
越胤
2023-03-14

对于现代参考,在Symfony 2.4中,您不能再为构造函数注入方法命名参数了。根据留档你会通过:

services:
    test.common.userservice:
        class:  Test\CommonBundle\Services\UserService
        arguments: [ "@doctrine.orm.entity_manager" ]

然后,它们将按照通过参数列出的顺序可用(如果有多个参数)。

public function __construct(EntityManager $entityManager) {
    $this->em = $entityManager;
}
商正诚
2023-03-14

类的构造函数方法应称为\uu construct(),而不是\uu constructor()

public function __construct(EntityManager $entityManager)
{
    $this->em = $entityManager;
}
 类似资料:
  • 问题内容: 我已经创建了自己的服务,并且需要注入原则EntityManager,但是我没有看到在我的服务上被调用,并且注入不起作用。 这是代码和配置: 这是我的包 我已经将.yml导入了我的应用中 当我在控制器中致电服务时 我得到一个对象(不为null),但是在UserService中为null,正如我已经提到的,从未调用过UserService上的构造函数 还有一件事,Controller和Us

  • 问题内容: 我想将服务注入app.config,以便可以在调用控制器之前检索数据。我这样尝试过: 服务: 配置: 但是我得到这个错误: 错误:未知提供程序:EditorApp的dbService 如何更正设置并注入此服务? 问题答案: Alex提供了无法执行您要尝试执行的操作的正确原因,因此+1。但是您遇到此问题是因为您没有完全使用解决方案的设计方式。 接受服务或函数的字符串,返回要注入的值。由于

  • 问题内容: 我写了一个AngularJS服务,我想对其进行单元测试。 我的app.js文件已注册: 我可以测试DI是否像这样工作: 这证明了可以通过DI框架创建服务,但是接下来我要对服务进行单元测试,这意味着要模拟注入的对象。 我该怎么做呢? 我试过将我的模拟对象放在模块中,例如 并将服务定义重写为: 但是后者似乎停止了DI所创建的所有服务。 有人知道我可以如何为单元测试模拟注入的服务吗? 谢谢

  • 问题内容: 我在Groovy中实现了Grails服务,我想在Web应用程序中将其注入Java类。我知道我可以通过applicationContext.getBean(“ exampleService”)获得Java中的bean,但是在编译时类型ExampleService是未知的。 我可以简单地导入服务吗?它似乎没有声明一个典型的包。 (我对Grails和Java Web还是很陌生,因此非常感谢能

  • 我有一些UserService对用户实体进行操作。我创建了自己的注释和ConstraintValidator类作为实现 我需要将UserService注入到ConstraintValidator中。而且,正如spring文档所说,在注册bean之后: 不幸的是,它对我没有作用。我在字段(在实现ConstraintValidator的类内)使用NullPointerException累加stackt

  • 我不确定DI应该如何与服务类一起工作。基本上,这两个服务类具有相同的接口,我希望能够避免nessesary if的,如果我可以将正确的一个注入到控制器中。一个例子将非常感谢。 抱歉,伙计们,我不太清楚。我还需要弄清楚的是,哪一个服务类需要注入到控制器中,而不需要在那一点上指定具体的实现。所以,我希望有一种方法可以执行某种if语句,并检查应该插入服务的哪个实现。