在我的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 }
UploadSfdcListener
在SalesForce
上传文件。
问题在于,如果我想在database
上传文件,SalesForce
的监听器也会被执行,反之亦然。
如何在我上传到UploadListener
时告诉Symfony2使用database
,以及在我上传到UploadSfdcListener
时使用Salesforce
?
答案 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个事件监听器整理出应该处理的内容而不是多个侦听器。
这个问题的一个问题是它应该包含什么?如果要使代码可重用,则可能需要为每个包分别使用单独的侦听器,并且只处理适合该包的文件类型。我有一个“主捆绑”来管理其他捆绑包,这是我拥有我的事件监听器的地方。它适用于这个项目,但不一定干净。
如果他们采用不同的方式,我会对任何人的想法持开放态度,因为这是一种非常常见的情况。