2012-04-01 5 views
6

Sto utilizzando l'articolo del libro di cucina di symfony.com per implementare un'opzione di caricamento file per le immagini.Symfony2: modifica caricamento file

Ora voglio caricare altre immagini sull'entità.

La strategia di default per la modifica è il seguente: 1. Fetch di DB 2. Iniettare in forma 3. Persist

In qualche modo questa strategia non funziona più quando si utilizza il caricamento di file (la dottrina non viene eseguito gli eventi)

Cos'altro posso fare per rendere modificabili gli articoli con foto?

risposta

10

Il ricettario non non gestisce gli aggiornamenti, in particolare nel caso in cui solo il file cambia.

In questo caso, l'evento PreUpdate non viene attivato, quindi è necessario per attivare $entity->preUpload() manualmente prima della $em->persist($entity), in modo che il caricamento di file viene gestito in ogni caso (preUpload altererà $entity->path modo si verificherà la persistente)

+0

Ciao, hai ragione. Quando non viene aggiornato alcun campo, gli eventi di callback del ciclo di vita non vengono attivati ​​:) – bodokaiser

+0

Se si utilizza Knot DoctrineExtensions, è possibile utilizzare Timestampable sull'entità che detiene la logica di caricamento del file e utilizzare $ entity-> updateTimestamps(); prima di $ em-> persist() in modo che aggiorni i campi fittizi di cui hai bisogno;) –

7

Se si modifica solo il campo di upload del ciclo di vita viene eseguito il metodo di caricamento, nel libro di cucina è riportata la soluzione in una scatola di citazione, come di seguito:

I callback PreUpdate e postUpdate sono attivati ​​solo se v'è un cambiamento in uno dei temi dell'entità ld che sono persistenti. Ciò significa che, per impostazione predefinita, se si modifica solo la proprietà $ file, questi eventi non verranno attivati, poiché la proprietà stessa non viene mantenuta direttamente tramite Doctrine. Una soluzione sarebbe quella di utilizzare un campo aggiornato persistente in Doctrine e di modificarlo manualmente quando si modifica il file .

aggiungere un campo fittizio per aggiornare nel controller prima di persistere evento come suggerire da questo duscussion:

https://github.com/symfony/symfony-docs/pull/564

public function setFile(UploadedFile $file) 
{ 
    $this->file = $file; 
    $this->updatedAt = new \DateTime(); 
}