Symfony2如何使用从控制器外部访问服务
在我的Symfony2控制器中,这可以正常工作:Symfony2如何使用从控制器外部访问服务,symfony,Symfony,在我的Symfony2控制器中,这可以正常工作: $uploadManager=$this->get('upload.upload_manager'); 但当我将其移动到自定义侦听器时: 使用条令\ORM\Event\LifecycleEventArgs; 使用Acme\UploadBundle\Upload\UploadManager; 班级人事变动 { 公共函数postRemove(生命周期事件目标$args) { $entity=$args->getEntity(); $entityMa
$uploadManager=$this->get('upload.upload_manager');
但当我将其移动到自定义侦听器时:
使用条令\ORM\Event\LifecycleEventArgs;
使用Acme\UploadBundle\Upload\UploadManager;
班级人事变动
{
公共函数postRemove(生命周期事件目标$args)
{
$entity=$args->getEntity();
$entityManager=$args->getEntityManager();
$uploadManager=$this->get('ep_upload.upload_manager');
echo“上传目录是”$uploadManager->getUploadDir();
}
}
我得到一个错误:
Fatal error: Call to undefined method Acme\MainBundle\Listener\PersonChange::get() in /home/frank/...
我知道我必须要一个使用声明,但不知道该使用什么。更新:在Symfony中不再正式推荐将控制器定义为服务。
Controller
类中的get()
方法只是一个从容器中获取服务的助手方法,其目的是让新的Symfony2开发人员更快地获得服务。一旦人们熟悉了框架和依赖注入,建议显式地创建和注入每个必需的服务
由于您的
PersonChange
类不是控制器,并且不扩展controller
类,因此您没有get()
helper方法。相反,您需要将类定义为服务,并显式地注入所需的服务。有关详细信息,请阅读。当我遇到完全相同的问题时,也许我能帮上忙
埃尔努尔所说的很好,我将尝试弹出一个真实的例子
就我而言,我想访问
$lucenemanager = $this->get('ivory.lucene.manager')
即使通过扩展控制器,当控制器访问容器时,我也无法让它工作(我仍然不明白为什么)
在config.yml中,我的侦听器(searchindexer.listener)声明如下:
services:
searchindexer.listener:
class: ripr\WfBundle\Listener\SearchIndexer
arguments:
luceneSearch: "@ivory_lucene_search"
tags:
- { name: doctrine.event_listener, event: postPersist }
服务(ivory.lucene.search)作为参数在我的服务/侦听器中传递
然后在我的班上
protected $lucenemanager;
public function __construct($luceneSearch)
{
$this->lucenemanager = $luceneSearch;
}
然后您可以对$this使用get方法,这是一种始终有效的方法,尽管它不是OO中的最佳实践
global $kernel;
$assetsManager = $kernel->getContainer()->get('acme_assets.assets_manager');
如果需要访问服务,请在类构造函数中定义它:
class PersonChange{
protected $uploadManager;
public function __construct(UploadManager $uploadManager){
$this->uploadManager = $uploadManager;
}
// Now you can use $this->uploadManager.
}
现在,您可以在调用类(示例1)时将服务作为参数传递,或者将clas本身定义为服务(推荐的,示例2)
例1:
use Acme\PersonChange;
class appController{
function buzzAction(){
$uploadManager = $this->get('upload.upload_manager');
$personChange = new PersonChange($uploadManager);
示例2(更好):
将PersonChange
定义为服务本身,并将另一个服务定义为services.yml文件中的参数:
# app/config/services.yml
services:
upload.upload_manager:
class: AppBundle\uploadManager
PersonChange:
class: AppBundle\PersonChange
arguments: ['@upload.upload_manager']
这样,您就不必为控制器中的upload\u manager
服务操心了,因为它是作为构造函数的参数隐式传递的,因此您的控制器可以:
class appController{
function buzzAction(){
$personChange = $this->get('PersonChange');
这应该提供了一个可能的解决方案:第一句话:Symfony没有正式推荐将控制器定义为服务。我的回答已经过去了4年。最佳实践不断发展。是的,但在谷歌搜索时仍然很容易找到这个答案。它应该更新,以符合当前Symfony的做法。那么,在2016年之前,推荐的方法是什么?