我在文档如何将控制器用作服务中阅读。但我不确定它的目的是什么。那么为什么不简单地使用服务(一个类定义为服务)?
如果有人能给我一些很好的例子,可以在一项很棒的服务中转换控制器。
答案 0 :(得分:1)
经典的Symfony控制器使用Service Locater模式来引入它的依赖关系:
class PersonController
{
public function showAction()
{
$personRepository =
$this->getDoctrine()->getEntityManager()->getRepository('Entity\Person');
$person = $personRepository->find(1);
return new JsonResponse($person);
获取人员存储库需要该操作具有关于如何定位事物的相当多的知识。事实上有些神奇。控制器直接与学说和框架基础结构相关联。
这也使得行动难以测试。在运行操作之前,您必须创建一个容器,然后定义必要的服务。
将控制器定义为服务器与其注入的依赖关系进行对比:
class PersonController
{
protected $personRepository;
public function __construct($personRepository)
{
$this->personRepository = $personRepository;
}
public function showAction()
{
$person = $this->personRepository->find(1);
该操作不再需要了解如何找到存储库。它就在那里。对于测试,只需要创建一个存储库并注入它。干净简单。