【问题标题】:Symfony FOSRestController as a service (Dependency injection)Symfony FOSRestController 作为服务(依赖注入)
【发布时间】:2017-01-23 05:19:57
【问题描述】:

我正在尝试在我的控制器中使用依赖注入。我正在使用 FOSRestController。

我收到一个错误:

捆绑“app.person_rest_controller”不存在或不存在 启用。可能你忘记在 registerBundles() 方法中添加了 你的 AppKernel.php 文件?在 /var/www/html/src/AppBundle/Resources/config/routing.yml(即 从“/var/www/html/app/config/routing.yml”导入)。

我的控制器看起来像:

class PersonRestController extends FOSRestController
{

    private $entityManager;
    private $container;
    private $sendNewContactRabbitMQProducer;

    public function __construct(EntityManager $entityManager, $container, Producer $rabbitMQProducer)
    {
        $this->entityManager = $entityManager;
        $this->container = $container;
        $this->sendNewContactRabbitMQProducer = $rabbitMQProducer;
    }

    public function postPersonAction(ParamFetcher $paramFetcher)
    {
        ...
    }

我的 routing.yml :

service_person:
    type: rest
    prefix: /v1
    resource: "@app.person_rest_controller"
    name_prefix:  api_1_ # naming collision

还有我的 services.yml :

services:
    app.person_rest_controller:
        class: AppBundle\Controller\PersonRestController
        arguments:
            - "@doctrine.orm.entity_manager"
            - "@service_container"
            - "@person.rabbitmq.producer.send_new_contact"
    person.rabbitmq.producer.send_new_contact:
        class: AppBundle\Service\SendNewContactRabbitMQProducer
        arguments: []
        calls:
            - [setRabbitMQProducer, ["@old_sound_rabbit_mq.send_person_id_from_hotelpro4u_producer"]]
            - [setLogger, ['@logger']]

我的工作基于此:https://github.com/FriendsOfSymfony/FOSRestBundle/issues/990

一个想法?

谢谢! =)

【问题讨论】:

  • 注意:永远不要将整个容器注入到服务中,而只是注入您真正需要和想要使用的服务等。这会增加你的可测试性等等。如果你需要注入很多依赖,你的服务就很大。
  • 感谢您的说明,我会考虑的。

标签: php symfony dependency-injection fosrestbundle


【解决方案1】:

两件快速的事情,特别是因为您似乎有一条实际上可以帮助您的错误消息:

  1. 您需要通过 composer 安装 FosRESTBundle
  2. 您需要在 AppKernel.php 中启用它

这两个都在official Symfony documentation上进行了解释。
一般在/symfony/project/root/doc/app/AppKernel.php下找到AppKernel.php

【讨论】:

    【解决方案2】:

    我创建了解决方案,这是一个愚蠢的错误:

    服务控制器的名称前没有@。

    改变:

    service_person:
        type: rest
        prefix: /v1
        resource: "@app.person_rest_controller"
        name_prefix:  api_1_ # naming collision
    

    到这里:

    service_person:
        type: rest
        prefix: /v1
        resource: "app.person_rest_controller"
        name_prefix:  api_1_ # naming collision
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-12
      • 2020-09-09
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多