Два пакета используют один и тот же прослушиватель событий

В моем проекте Symfony2 у меня есть два пакета:

  • UploadBundle, который регистрирует загруженный файл в Database; а также * UploadSfdcBundle, который регистрирует загруженный файл в SalesForce

я использую oneup/uploader-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 также будет казнен и наоборот.

Как я могу сказать Symfony2 использовать UploadListener когда я загружаю в databaseи использовать UploadSfdcListener когда я загружаю в Salesforce?

1

Решение

Поскольку вы используете OneupUploader, вы должны добавить некоторые пользовательские данные при загрузке, чтобы вы знали, какой тип процесса / загрузки выполняется. Каждый контроллер / служба, отвечающая за рендеринг страницы веток, должна передавать пользовательскую переменную, доступную в ветке, которую я называю «тип файла». В вашем комплекте Salesforce установите

$filetype = 'salesforce';

Я использую интерфейс Blueimp, и вот как добавить пользовательские данные на вашей странице ветки:

<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 прослушиватель событий, перебирающий то, что должно обрабатываться вместо нескольких прослушивателей.

Одна проблема с этим, в какой пакет это должно войти? Если вы хотите сделать свой код многократно используемым, вам могут потребоваться отдельные прослушиватели для каждого пакета и обрабатывать только тот тип файла, который подходит для этого пакета. У меня есть «главный пакет», который управляет другими пакетами, и именно здесь у меня есть слушатели событий. Это хорошо работает для этого проекта, но не обязательно чисто.

Я открыт для любых мыслей, если они делают это по-другому, так как это очень распространенная ситуация.

1

Другие решения

Каждый слушатель события получает PostUploadEvent/PreUploadEvent объект события. Это имеет getType() метод (который является ключом onup_uploader.mappings установка). Используя это значение, вы можете определить, какой контроллер был использован. Если это неправильный, используйте return остановить выполнение метода.

2

По вопросам рекламы [email protected]