两个捆绑包使用相同的事件侦听器

时间:2015-05-04 13:21:56

标签: php symfony file-upload salesforce

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

  • UploadBundle,将上传的文件注册到Database;和* UploadSfdcBundle,在SalesForce
  • 中注册上载文件

我正在使用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课程将文件上传到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 }

UploadSfdcListenerSalesForce上传文件。

问题在于,如果我想在database上传文件,SalesForce的监听器也会被执行,反之亦然。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

由于您使用的是OneupUploader,因此您应该在上传时添加一些自定义数据,以便了解运行的进程/上传类型。负责渲染树枝页面的每个控制器/服务都应传递一个自定义变量,该变量在twig中可用,我称之为“filetype”。在salesforce捆绑包中,设置

$filetype = 'salesforce';

我正在使用blueimp前端,这里是如何在你的树枝页面上添加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并查看控制台选项卡以查看上载的数据,然后检查开发日志以查看调用和处理的内容。它需要一些工作来使它正确,但我有许多不同的部分,人们可以上传这些文件的不同目的的文件。有些保存在私有区域,有些被放置在公共存储服务中,我发现最简单的方法是让1个事件监听器整理出应该处理的内容而不是多个侦听器。

这个问题的一个问题是它应该包含什么?如果要使代码可重用,则可能需要为每个包分别使用单独的侦听器,并且只处理适合该包的文件类型。我有一个“主捆绑”来管理其他捆绑包,这是我拥有我的事件监听器的地方。它适用于这个项目,但不一定干净。

如果他们采用不同的方式,我会对任何人的想法持开放态度,因为这是一种非常常见的情况。

相关问题