我们有服务
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()有效。
答案 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
中的默认值