Symfony2在构造函数上注入Doctrine Dbal作为服务

时间:2014-09-11 19:15:36

标签: php symfony doctrine-orm fosrestbundle

尝试将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中调用第2449行的/test/tmp/dev/cache/classes.php,在/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

任何帮助都会很棒。 THX

2 个答案:

答案 0 :(得分: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']]

我认为应该让你去。

答案 1 :(得分:0)

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