两个 bundle 使用相同的事件侦听器

Two bundles use the same event listener

在我的 Symfony2 项目中,我有两个包:

我正在使用 oneup/uploader-bundle 上传文件。

我像这样为每个 Bundle 配置了事件侦听器:

对于uploadBundle

services.yml:

services:                         
    envivio_upload.upload_listener:
        class: Envivio\UploadBundle\Listeners\UploadListener
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: kernel.event_listener, event: oneup_uploader.pre_upload, method: onPreUpload }
            - { name: kernel.event_listener, event: oneup_uploader.post_upload, method: onPostUpload }

UploadListener class上传文件到Database

对于 UploadSfdcbundle:

services.yml:

services:
    envivio_upload_sfdc.upload_listener:
        class: Envivio\UploadSfdcBundle\Listeners\UploadSfdcListener
        arguments: ["@codemitte_forcetk.client", "@codemitte_forcetk.query_builder"]
        tags:
            - { name: kernel.event_listener, event: oneup_uploader.pre_upload, method: onPreUpload }
            - { name: kernel.event_listener, event: oneup_uploader.post_upload, method: onPostUpload }

UploadSfdcListener 上传文件 SalesForce.

问题是如果我要上传database中的文件,SalesForce的监听器也会被执行,反之亦然

我如何告诉 Symfony2 在我上传到 database 时使用 UploadListener,而在我上传到 Salesforce 时使用 UploadSfdcListener

每个事件侦听器接收一个 PostUploadEvent/PreUploadEvent 事件对象。这有一个 getType() 方法(这是 onup_uploader.mappings 设置的关键)。使用此值,您可以确定使用了哪个控制器。如果不正确,请使用 return 停止该方法的执行。

由于您使用的是 OneupUploader,因此您应该在上传时添加一些自定义数据,以便了解运行的 process/upload 类型。每个负责呈现 twig 页面的 controller/service 都应该传递一个在我调用 'filetype' 的 twig 中可用的自定义变量。在您的 salesforce 捆绑包中,设置

$filetype = 'salesforce';

我正在使用 blueimp 前端,这里是如何在你的 Twig 页面上添加 custom data

<script type="text/javascript">
$(document).ready(function()
{
    var url = "{{ oneup_uploader_endpoint('salesforce') }}";
    $('#fileupload').fileupload({
        url: url,
        dataType: 'json',
        formData: {
            id: "{{user.getId}}"
           ,filetype: "salesforce"
          },
        done: function (e, data) {   
            $.each(data.result.files, function (index, file) {
                $( "#begin" ).remove();
                $('<p/>').text(file).appendTo('#files');
                console.log(file);
                console.log(data.result.files[index].name);
            });
            $('#progress .progress-bar').css('width', '100%');
        },
        progressall: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);
            $('#progress .progress-bar').css(
                'width',
                progress + '%'
        );
    }
    });
    $("#fileupload").change(function() {
            $( '<p id="begin">Upload started...</p>' ).appendTo( "#files" );
    });
});

在我的事件监听器中我有:

public function onUpload(PostPersistEvent $event) {
    ...
    $uploadtype = $request->get('filetype');

    switch ($uploadtype) {
        //custom logic for each different type of upload
    }

    //code always processed for all files

}

测试时,我使用 chrome 并查看控制台选项卡以查看上传的数据,然后检查开发日志以查看调用和处理的内容。需要一些工作才能使其正确,但我有许多不同的部分,人们可以在其中上传具有不同目的的文件。有些保存在私有区域,有些放在 public 存储服务中,我发现让 1 个事件侦听器而不是多个侦听器来整理应该处理的内容最容易。

一个问题是它应该放入哪个包?如果你想让你的代码可重用,你可能需要为每个包单独的监听器,并且只处理适合该包的文件类型。我有一个 'master bundle' 管理其他包,这是我的事件监听器。它适用于这个项目,但不一定干净。

我愿意听取任何人的不同想法,因为这是很常见的情况。