Ich habe erfolgreich einen Dienst und einen Listener zum automatischen Speichern von Dateien in meiner Post-Entität erstellt.Speichern verschiedener Dateitypen über einen Dienst in Symfony2
Alles funktioniert OK, außer ich muss ein anderes Feld zu der Post-Entität hinzufügen: 'Foto'. Was ist der richtige Weg, um so viel wie möglich des folgenden Codes zu erreichen? Ich habe versucht, einige Parameter für den Hörer zu übergeben, aber ich konnte es Arbeit bekommen ...
Broschüren gespeichert unter sollten: web/uploads/Broschüren und Fotos unter: web/uploads/Fotos.
Der Benutzer muss sowohl die Broschüre als auch ein Foto zur Verfügung stellen.
Vielen Dank für die Hilfe.
services.yml:
# brochure uploader service
app.brochure_uploader:
class: AppBundle\Utils\FileUploader
arguments: [ '%brochures_directory%' ]
# uploaded files for Post entity
app.doctrine_brochure_listener:
class: AppBundle\EventListener\BrochureUploadListener
arguments: [ '@app.brochure_uploader' ]
tags:
- { name: doctrine.event_listener, event: prePersist }
- { name: doctrine.event_listener, event: preUpdate }
Utils/FileUploader.php:
namespace AppBundle\Utils;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class FileUploader
{
private $targetDir;
public function __construct($targetDir)
{
$this->targetDir = $targetDir;
}
public function upload(UploadedFile $file = null)
{
$fileName = md5(uniqid()).'.'.$file->guessExtension();
$file->move($this->targetDir, $fileName);
return $fileName;
}
public function getTargetDir() {
return $this->targetDir;
}
}
EventLister/BrochureUploadListener.php:
Klasse BrochureUploadListener { privater $ uploader;
public function __construct(FileUploader $uploader)
{
$this->uploader = $uploader;
}
public function prePersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$this->uploadFile($entity);
}
public function preUpdate(PreUpdateEventArgs $args)
{
$entity = $args->getEntity();
$this->uploadFile($entity);
}
private function uploadFile($entity)
{
if (!$entity instanceof Post) {
return;
}
$file = $entity->getBrochure();
if (!$file instanceof UploadedFile) {
return;
}
$fileName = $this->uploader->upload($file);
$entity->setBrochure($fileName);
}
}
Form/PostType.php:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
[...]
->add('brochure', 'Symfony\Component\Form\Extension\Core\Type\FileType', array(
'label' => 'Brochure (PDF file)',
'data_class' => null,
))
[...]
;
}
Entity/post.php
/**
* @ORM\Column(type="string")
*
* @Assert\File(mimeTypes={ "application/pdf" })
*/
private $brochure;
Vielen Dank für die Eingabe, ich werde dieses Bundle versuchen. Ich möchte Symfony auch etwas besser kennenlernen, das ist der Grund für diese Frage :) – Torpedr