【问题标题】:How can I inject doctrine into Symfony2 service如何将教义注入 Symfony2 服务
【发布时间】:2014-03-27 04:10:00
【问题描述】:

我使用简化的控制器并且没有服务容器。我正在尝试将教义注入服务中。这是错误:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Acme\Controller\WebController::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /home/hcs/Core/app/cache/dev/appDevDebugProjectContainer.php on line 3036 and defined in /home/hcs/Core/src/Acme/Controller/WebController.php line 28

这是我的服务定义:

doctrine:
  dbal:
    driver:   %database_driver%
    host:     %database_host%
    port:     %database_port%
    dbname:   %database_name%
    user:     %database_user%
    password: %database_password%
    charset:  UTF8

  orm:
    mappings:
      Acme:
        type: annotation
        dir: %kernel.root_dir%/../src/Acme/Model
        prefix: Acme\Model
        alias: Model
        is_bundle: false

services:
  WebController:
    class: Acme\Controller\WebController
    arguments: [@doctrine.orm.entity_manager ]
    parent: elnur.controller.abstract

还有我的班级

use Doctrine\ORM\EntityManager;

/**
 * @Service("WebController", parent="elnur.controller.abstract")
 */
class WebController extends AbstractController
{ 
    protected $em;

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

这里是 SF2 容器的输出 (php app/console container:debug | grep -i entity)

doctrine.orm.default_entity_manager             container EntityManager5330e85ad5afb_546a8d27f194334ee012bfe64f629947b07e4919\__CG__\Doctrine\ORM\EntityManager

doctrine.orm.entity_manager                     n/a       alias for doctrine.orm.default_entity_manager                  

doctrine.orm.validator.unique                   container Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntityValidator

form.type.entity                                container Symfony\Bridge\Doctrine\Form\Type\EntityType  

translator                                      container Symfony\Component\Translation\IdentityTranslator

我也尝试了服务定义中的参数:[“@doctrine.orm.entity_manager”],但仍然没有。我试过清理我的缓存,但我一辈子都无法注入 EM。我做错了什么?

【问题讨论】:

  • 您在哪里以及如何调用此服务? ["@doctrine.orm.entity_manager"] 应该适用于争论。
  • 我在 config.yml 中定义我的服务,并将上述内容作为参数提供。但我在施工时收到上述错误。
  • 你是如何构建它的?在控制器中使用:$WebController = $this->get('WebController'); 或者你只是在做$WebController = new WebController()?
  • 服务是一个控制器。每当从请求中查询时都会加载它

标签: php symfony doctrine-orm doctrine


【解决方案1】:

问题在于您将 YAML 服务定义和同一个类的 DiExtra 注释混合在一起。 YAML 定义是完整的并提供了所需的依赖项,但您还没有添加 @InjectParams 来使用 @Service 注释。基本上,您正在使用不同的方法创建单个类的两个服务,并且注释方法不完整。

要么从类中删除 @Service 注释,或者,如果您更喜欢注释(我这样做),也可以使用注释注入依赖项并摆脱 YAML 服务定义:

/**
 * @InjectParams({
 *    "em" = @Inject("doctrine.orm.entity_manager")
 * })
 */
public function __construct(EntityManager $em)
{
    $this->em = $em;
}

@InjectParams 注释将$em 等参数名称与@em 等服务名称相匹配。由于没有@em服务,你必须用@Inject注解覆盖默认匹配。

但是有一种方法可以简化它。您可以在 YAML 配置文件中将实体管理器别名为 @em:

services:
    em:
        alias: doctrine.orm.entity_manager

现在您可以简化@InjectParams 注释:

/**
 * @InjectParams
 */
public function __construct(EntityManager $em)
{
    $this->em = $em;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多