Symfony 2.7

时间:2017-08-25 08:59:31

标签: symfony events dependency-injection

我正在S3中执行一些文件操作,并且需要在API请求之后成功复制临时文件后执行一些操作。例如,更新存储在DB中的文件大小。

我想在需要执行此操作的情况下发送事件,但任何订阅者都需要一些服务,如文件系统和实体管理器,我无法弄清楚如何将服务注入到EventSubscriber中它需要创建并作为不知道文件系统或学说或容器的类中的订阅者添加到EventDispatcher。

我试图使用ContainerAwareEventDispatcher。这是我以这种方式发送的事件:

class PendingFile implements SourceFile
{
    /**
     * @var string
     */
    private $filename;

    /**
     * @var PendingFileService
     */
    private $pendingFileService;

    /**
     * @param string $filename
     * @param PendingFileService $pendingFileService
     */
    public function __construct($filename, PendingFileService $pendingFileService)
    {
        $this->filename = $filename;
        $this->pendingFileService = $pendingFileService;
    }

    /**
     * @param string $targetFilename
     * @param Media $media
     */
    public function process($targetFilename, Media $media)
    {
        $this->pendingFileService->copyFile($this->filename, $targetFilename);

        $event = new PendingFileCopyEvent($media);
        $eventDispatcher = new ContainerAwareEventDispatcher(new ContainerBuilder());
        $eventDispatcher->addSubscriberService(
            'acme.media.event_subscriber.pending_file_copy',
            'Acme\MediaBundle\EventSubscriber\PendingFileCopySubscriber'
        );
        $eventDispatcher->dispatch(PendingFileCopyEvent::EVENT_NAME, $event);
    }
}

不幸的是,这个容器是空的,无法识别我的服务。我无法将这些服务注入实体本身。如果可以的话,为什么我还会使用活动用户......

问题:如何将我的订阅者正确构建为具有所需依赖关系的服务?

1 个答案:

答案 0 :(得分:2)

通常,您应该只使用事件调度程序的一个实例。 Symfony提供@event_dispatcher服务。您应该使用它而不是实例化一个新的。因此,在您的PendingFile班级中,在构造函数中添加EventDispatcherInterface $eventDispatcher,然后像您一样调度事件。

对于订阅者,您需要创建该类,然后将其声明为具有kernel.event_subscriber标记RFC2617的服务,以在事件调度程序中自动注册事件订阅者(这样您就可以删除addSubscriberService代码行。)

和Voila!