没有__construct()方法的Symfony2,Doctrine,getDoctrine()

时间:2013-01-31 12:58:26

标签: symfony service controller doctrine

我们有服务

services:
    service_name:
        class: One\SomeBundle\Controller\OurController

我们需要添加什么才能使$ this-> getDoctrine()在我们的“OurController”中运行? 我试过“OurController”

$this->countainer->get('doctrine') 
// and
$this->getDoctrine()

但没有任何反应,只是错误。

我希望此控制器使用本机方法,例如$ this-> getDoctrine()。据我所知,我们可以给控制器(services.yml中的参数)提供参数,然后应用它,但我们可以将其设置为默认值吗?没有

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

和其他额外的东西。我需要的是使$ this-> getDocrine()有效。

3 个答案:

答案 0 :(得分:1)

我认为这个学说可以在所有这样的控制器中使用

$em = $this->getDoctrine()->getEntityManager();

如果您希望服务中提供该原则,请使用类似

的内容
services:
    your.service:
        class: YourVendor\YourBundle\Service\YourService
        arguments: [ @doctrine.orm.entity_manager ]

答案 1 :(得分:0)

定义服务时,必须将参数作为参数传递,如下所示(因为默认情况下服务无法访问主容器):

<services>
    <service id="myservice" class="path/to/my/class">
        <argument type="service" id="doctrine" />
        ...
    </service>
</services>

这是在xml中配置的,但如果你愿意,我会让你用yml转换它。

然后在您的服务类中,您只需将构造函数设置为:

class MyServiceClass
{
    protected $doctrine;

    public function __construct(\Doctrine $doctrine, ...)
    {
        $this->doctrine = $doctrine;
        ....
    }
}

现在,您可以在自己的服务类中使用该教义服务。

答案 2 :(得分:0)

您可以使用JMSDiExtra为Controller中的属性设置服务:

控制器代码:

<?php

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use JMS\DiExtraBundle\Annotation as DI;

/**
 * Controller class
 */
class MyController extends Controller
{
    /**
     * @DI\Inject
     */
    protected $request;

    /**
     * @DI\Inject("doctrine.orm.entity_manager")
     */
    protected $em;

    // .....

    /**
     * Action
     */
    public function myAction()
    {
        // ....
        $this->em->persist($myObject);
        // ....
    }
}

使用JMSDiExtra的更多文档 - http://jmsyst.com/bundles/JMSDiExtraBundle

此捆绑包是Symfony2 Framework

中的默认值