В моем проекте 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
?
Поскольку вы используете 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 прослушиватель событий, перебирающий то, что должно обрабатываться вместо нескольких прослушивателей.
Одна проблема с этим, в какой пакет это должно войти? Если вы хотите сделать свой код многократно используемым, вам могут потребоваться отдельные прослушиватели для каждого пакета и обрабатывать только тот тип файла, который подходит для этого пакета. У меня есть «главный пакет», который управляет другими пакетами, и именно здесь у меня есть слушатели событий. Это хорошо работает для этого проекта, но не обязательно чисто.
Я открыт для любых мыслей, если они делают это по-другому, так как это очень распространенная ситуация.
Каждый слушатель события получает PostUploadEvent
/PreUploadEvent
объект события. Это имеет getType()
метод (который является ключом onup_uploader.mappings
установка). Используя это значение, вы можете определить, какой контроллер был использован. Если это неправильный, используйте return
остановить выполнение метода.