将原则实体管理器添加到symfony2中的服务中



我试图将实体管理器添加到我在Symfony中的服务层。我在网上进行了研究,但似乎没有一个答案对我有用。

我有一个带有一个名为AppBundle\Controller的命名空间的类。我的类名是主控制器。那么我到底需要向我的 services.yml 添加什么?

除此之外,我认为我只需要EntityManager $em作为参数传递到构造函数中,然后将$em分配给 $this->em(私有)?

例如

class MasterController extends Controller
{
    private $em;
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    } 
}

可以将控制器定义为服务,同时扩展框架控制器类。 为什么要这样做? 通过这样做,您可以利用基本功能,例如表单工厂,模板呈现,获取用户内容等。

同时,您可以注入所需的任何控制器特定服务。 这样可以避免将容器用作服务定位器模式。 换句话说,我们可以将服务推送到控制器中,而不是让控制器拉取服务。 控制器不需要关心服务来自哪里,变得更加独立。

例:

class PersonController extends Controller
{
    private $personRepository;
    public function __construct($personRepository)
    {
        $this->personRepository = $personRepository;
    }
    public function editAction(Request $request, $id)
    {
        $person = $this->personRepository->find($id); 
        $form = $this->createForm(new PersonFormType(), $person);
        $form->handleRequest($request);
        if ($form->isValid()) {
            // Note: I add flush/persist methods to my repositories
            // You could inject the entity manager and flush from it
            $personRepository->flush();
            return $this->redirect($this->generateUrl('wherever'));
        }
        return $this->render('person/edit.html.twig', array(
        'form' => $form->createView(),));
    }
}

使控制器成为服务,具有:

services:
person_repository:
    class: AppBundleEntityPersonRepository
    factory_service: 'doctrine.orm.default_entity_manager'
    factory_method:  'getRepository'
    arguments:  
        - 'AppBundleEntityPerson'
person_controller:
    class: AppBundleControllerPersonController
    calls:
      - [setContainer,['@service_container']]
    arguments: 
      -'person_repository

所以基本上,你最终得到一个标准的Symfony控制器,具有所有标准功能,但你可以注入控制器特定的服务,如存储库,这反过来又使你的控制器更易于阅读和调试。 您永远不需要在控制器操作方法中使用 $this->get('service')。

使用更标准的实体检索方法签订合同:

$personRepository = $this->getDoctrine()->getManager()->getRepository('AppBundleEntityPerson');

如您所见,标准方法不仅将控制器直接与原则联系起来,而且还要求控制器知道实体的类名。 您可以决定哪种方法更易于编写、理解和维护。

首先

,如果您的MasterController扩展SymfonyBundleFrameworkBundleController类,那么您已经可以使用EntityManager

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

但是,如果您想自己将其注入构造函数(并将控制器作为服务),您需要做的就是在services.yml中输入如下:

services:
    your_controller_service:
        class: AppBundleControllerMasterController
        arguments: [@doctrine.orm.entity_manager]

仅此而已。

编辑

请记住,您需要在类定义之前的某个地方use DoctrineORMEntityManager以避免Catchable fatal error

相关内容

  • 没有找到相关文章

最新更新