【问题标题】:Symfony2 injecting Doctrine Dbal as service on constructorSymfony2 在构造函数上注入 Doctrine Dbal 作为服务
【发布时间】:2014-11-05 20:57:15
【问题描述】:

试图将 Doctrine dbal 连接传递给我在控制器中的构造。

我正在关注此链接,但它不起作用:

How do you access Doctrine DBAL in a Symfony2 service class?

这是我在 app/config/config.yml 中的服务

services:
 form1:
   class:       Test\TestBundle\Controller\FormController
   arguments:   [@doctrine.dbal.form1_connection]

这是我的控制器与构造

namespace Test\TestBundle\Controller;

use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\RestBundle\Util\Codes;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Doctrine\DBAL\Connection;


class FormController extends FOSRestController implements ClassResourceInterface
{

    private $connection;

    public function __construct(Connection $dbalConnection)  {
        $this->connection = $dbalConnection;    
    }
}

我收到此错误“消息”:“可捕获的致命错误:传递给 Test\TestBundle\Controller\FormController::__construct() 的参数 1 必须是 Doctrine\DBAL\Connection 的实例,没有给出,在 /srv 中调用/test/tmp/dev/cache/classes.php 在第 2449 行并在 /vagrant/test.com/src/Test/TestBundle/Controller/FormController.php 中定义

这里是 app/config/routing.yml

test_form:
    pattern:  /api/v4/forms.{_format}
    defaults: { _controller: TestTestBundle:Form:cget, _format: json }
    requirements:
        _method: GET

任何帮助都会很棒。谢谢

【问题讨论】:

  • 这个控制器是如何创建的?带有控制器即服务的路由?还是一个新的 FormController()?还是直接从容器中获取?
  • 它由 app/console 命令行创建。此控制器的路由在 routing.yml 中,它是到 /api/v4/forms 的修改路由。{_format} 会不会是服务混淆了,找不到该路由?
  • 你能从 routing.yml 发布相关行吗?如果它有类似 _controller: TestBundle::Form 的东西,那么这将解释问题。它应该有 __controller: form1.
  • ok 刚刚做了,也许您可​​以看到问题所在。我将需要使用 /api/v4/forms.{format} 的特定模式,所以不知道是否有另一种方法可以做到这一点,并且在 FormController 下的该方法上保持格式为 json。谢谢

标签: php symfony doctrine-orm fosrestbundle


【解决方案1】:

好的。基本问题是_controller:TestTestBundle:Form:cget没有使用服务容器来创建FormController。因此没有注射。您需要将控制器配置为服务。

http://symfony.com/doc/current/cookbook/controller/service.html

您的路由将如下所示:

test_form:
    pattern:  /api/v4/forms.{_format}
    defaults: { _controller: form1:cgetAction, _format: json }
    requirements:
        _method: GET

但是,这将产生第二个问题,因为您的控制器最终是从 Symfony 基本控制器扩展而来的,这也需要注入容器。因此,您需要将服务文件调整为:

services:
    form1:
        class:       Test\TestBundle\Controller\FormController
        arguments:   ['@doctrine.dbal.form1_connection']
        calls:
            - [setContainer, ['@service_container']]

我认为这应该能让你继续前进。

【讨论】:

  • 刚刚尝试过,但给了我错误,“消息”:“您请求了一个不存在的服务 \"form1\"。您的意思是:\"doctrine.dbal.logger.profiling. form1\"?", "class": "Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException",
  • 刚刚发现错误,它缺少这个:默认值:{ _controller: form1:cgetAction, _format: json } 所以只需编辑它,我们很好:),谢谢
  • 我的错。我总是忘记动作后缀。
  • 这是一个好问题,更多的人应该看看你的答案:)
  • 好吧。我非常喜欢将控制器定义为服务。但是,在这种特殊情况下,由于您需要从 RestController 扩展,因此您已经拥有容器,这意味着实际上不需要注入您的连接。控制器的动作可以只使用 $this->get('doctrine.dbal.form1_connection');只有当您将控制器设计为不需要容器时,使用服务才开始获得回报。
【解决方案2】:

我不知道你的服务,也许你需要这个:doctrine.dbal.default_connection。

【讨论】:

  • 我有两个连接,每个都有实体管理器,其中一个是 form1,另一个是默认值。它们都不是服务。
猜你喜欢
  • 2011-10-19
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多