我试图将实体管理器添加到我在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