当我在控制器(ClientDomainController)中调用它时,我遇到了一个烦人的问题:
$this->getDoctrine()->getManager();
我收到此错误:
Call to a member function has() on null
我查看了堆栈跟踪,发现:
$this->container is null
我的控制器来自Symfony Controller组件:
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
有趣的是,在另一个控制器(HomeController)中,我做了完全一样的事情:
而且这没有任何错误。
HomeController和ClientDomainController之间的唯一区别是第二个是服务。所以我把它写在services.yml文件中:
services:
client_domain:
class: AppBundle\Controller\ClientDomainController
最后,我测试了很多事情,例如在控制器中创建一个构造函数,并将其添加到services.yml文件中(从不对功能函数执行此操作):
arguments: [ 'doctrine.orm.entity_manager' ]
然后,当您将控制器注册为服务时,Symfony会像您说的那样创建它。
因此区别在于,尽管您的控制器实现了ContainerAwareInterface
(通过扩展Controller
类),但最终没有人调用setContainer
方法来利用此接口并设置$container
的值。您必须在services.yml配置中手动执行此操作,例如:
calls:
- [ setContainer, [ @service_container ] ]
但这不是最好的解决方案
将您的控制器注册为服务通常是好的。它使它们更具可测试性和可维护性。
但这是正确的,只要您遵守OOP的良好规则即可。在这种情况下,当您传递整个容器时,这意味着:
简而言之,应该像最后一样通过依赖者传递依赖关系,或者当仅在此特定操作中使用依赖关系时,可以使用基于操作的依赖关系注入。
实际上,最好的解决方案甚至是不扩展基Controller
类以使您的控制器框架独立。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句