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

use*_*287 15 symfony

在我的Symfony2控制器中,这很好用:

$uploadManager = $this->get('upload.upload_manager');
Run Code Online (Sandbox Code Playgroud)

但当我将它移动到自定义监听器时:

use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\UploadBundle\Upload\UploadManager;

class PersonChange
{
    public function postRemove(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();
        $entityManager = $args->getEntityManager();

        $uploadManager = $this->get('ep_upload.upload_manager');
        echo "the upload dir is " . $uploadManager->getUploadDir();
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Fatal error: Call to undefined method Acme\MainBundle\Listener\PersonChange::get() in /home/frank/...
Run Code Online (Sandbox Code Playgroud)

我知道我必须使用一个使用声明,但不知道该使用什么.

Eln*_*mov 16

更新:Symfony不再正式推荐将控制器定义为服务.

类中的get()方法Controller只是从容器中获取服务的辅助方法,它的目的是让新的Symfony2开发人员加快速度.一旦人们对框架和依赖注入感到满意,建议将控制器定义为服务并明确注入每个所需的服务.

由于您的PersonChange类不是控制器而且没有扩展Controller该类,因此您没有该get()辅助方法.相反,您需要将您的类定义为服务并显式注入所需的服务.阅读服务容器章节了解详细信息.


Mat*_*ieu 12

当我遇到完全相同的问题时,我可以帮忙

所说的是完全没问题的,我会尝试弹出一个真实的例子.

就我而言,我想访问

$lucenemanager = $this->get('ivory.lucene.manager')
Run Code Online (Sandbox Code Playgroud)

即使通过扩展控制器,我也无法让它在控制器访问容器时工作(我仍然不明白为什么)

在config.yml中,我的监听器(searchindexer.listener)声明如下:

   services:
    searchindexer.listener:
        class: ripr\WfBundle\Listener\SearchIndexer
        arguments:
              luceneSearch: "@ivory_lucene_search"
        tags:
            - { name: doctrine.event_listener, event: postPersist }
Run Code Online (Sandbox Code Playgroud)

服务(ivory.lucene.search)作为参数传递给我的服务/监听器.

然后在我的班上

protected $lucenemanager;

        public function __construct($luceneSearch)
        {
            $this->lucenemanager = $luceneSearch;
        }
Run Code Online (Sandbox Code Playgroud)

然后你可以对$ this使用get方法


Gui*_*big 6

尽管不是OO中的最佳实践,但这种方法始终有效

global $kernel;
$assetsManager = $kernel->getContainer()->get('acme_assets.assets_manager');?
Run Code Online (Sandbox Code Playgroud)