Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony2如何使用从控制器外部访问服务_Symfony - Fatal编程技术网

Symfony2如何使用从控制器外部访问服务

Symfony2如何使用从控制器外部访问服务,symfony,Symfony,在我的Symfony2控制器中,这可以正常工作: $uploadManager=$this->get('upload.upload_manager'); 但当我将其移动到自定义侦听器时: 使用条令\ORM\Event\LifecycleEventArgs; 使用Acme\UploadBundle\Upload\UploadManager; 班级人事变动 { 公共函数postRemove(生命周期事件目标$args) { $entity=$args->getEntity(); $entityMa

在我的Symfony2控制器中,这可以正常工作:

$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年之前,推荐的方法是什么?