两个 bundle 使用相同的事件侦听器
Two bundles use the same event listener
在我的 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
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' 管理其他包,这是我的事件监听器。它适用于这个项目,但不一定干净。
我愿意听取任何人的不同想法,因为这是很常见的情况。
在我的 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
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' 管理其他包,这是我的事件监听器。它适用于这个项目,但不一定干净。
我愿意听取任何人的不同想法,因为这是很常见的情况。