1

我们有服务

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() 工作。

4

3 回答 3

1

我认为该学说适用于所有这样的控制器

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

如果您希望在您的服务中使用该学说,请使用类似这样的东西

services:
    your.service:
        class: YourVendor\YourBundle\Service\YourService
        arguments: [ @doctrine.orm.entity_manager ]
于 2013-02-01T01:21:21.790 回答
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;
        ....
    }
}

现在,学说服务将在您自己的服务类中可用。

于 2013-01-31T13:22:27.223 回答
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 框架中的默认包

于 2013-02-01T06:32:27.053 回答