2010-06-20 13 views
6

Utilizzando Symfony 1.4.5 con DottrinaEseguire po 'di pulizia quando si cancella un record nella Symfony/Dottrina

ho un modello che include un immagine caricata come una delle colonne - la creazione e l'aggiornamento del record va bene (usando il metodo doSave() per gestire il caricamento e qualsiasi modifica al file).

Il problema che sto riscontrando è se il record è cancellato - Voglio che rimuova anche il file associato. Ma non riesco a trovare comunque di farlo dopo diverse ore di caccia attraverso la documentazione e Google.

C'è un modo per specificare un qualche tipo di codice di post-cancellazione?

risposta

6

soluzione finale:

in /lib/model/doctrine/Image.class.php

class Image extends BaseImage 
{ 
    public function postDelete() 
    { 
    $filename = $this->getFilename(); 

    $filepath = sfConfig::get('sf_upload_dir') . '/' . $filename; 
    @unlink($filepath); 
    } 
} 

Grazie al colonnello Sponz per avermi nella giusta direzione

+0

Puoi anche gestirlo con gli eventi di Doctrine, ma per azioni semplici come l'eliminazione di un file specifico per il record, la tua soluzione va bene – Benoit

+0

sì, ho letto sugli eventi/ascoltatori - se inizio a ottenere un pesante postDelete processo probabilmente lo passerò a quello – HorusKol

+1

Sto facendo questo, ma sto incontrando un problema: se l'eliminazione fallisce e la transazione non viene mai commessa, il metodo postDelete viene comunque eseguito e i file vengono comunque cancellati. – mattalxndr

2

È da un po 'che non uso Doctrine, ma mi sembra di ricordare che esiste una funzione di eliminazione del post che è possibile utilizzare per questo genere di cose. Se si cerca nell'origine la classe base di Doctrine, si dovrebbe essere in grado di trovare il nome esatto del metodo e l'uso.

EDIT: Il metodo è postDelete() e si trova nella classe di Doctrine_Record

Ecco la sezione dalla documentazione Symfony che copre advanced Doctrine usage.

+0

realtà - quella pagina doesn entrare in qualsiasi dettaglio abbastanza vicino e l'API doctrine è ugualmente inutile. – HorusKol

+0

Cosa succede quando si crea un metodo postDelete() nella classe del modello? Puoi farlo per intraprendere un'azione - anche solo registrare un messaggio? –

+0

Posso ottenere il codice nel metodo postDelete() per l'esecuzione, nessun problema - ma non vedo come ottenere il nome file dell'immagine che ho bisogno di eliminare ... – HorusKol

2

Hijacking Colonnello La risposta di Sponsz, il metodo postDelete() è sicuramente la soluzione giusta. +1 a lui :-) Ma devi abilitare i callback di Doctrine nel tuo config/ProjectConfiguration.class.php. Aggiungere questo metodo:

public function configureDoctrine(Doctrine_Manager $manager) 
{ 
    $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true); 
} 

Cancella la cache Symfony, e Dottrina sparerà i metodi di callback, come postDelete() al momento opportuno.

+0

grazie per le informazioni extra - anche se, penso che sia già ordinato come quando inserisco un'eco nel metodo postDelete, ottengo l'output atteso senza doverlo aggiungere esplicitamente alla configurazione – HorusKol

+2

In realtà è sufficiente aggiungere questa configurazione quando utilizzando i callback DQL (preDqlSelect, preDqlUpdate e preDqlDelete) – DuoSRX

+0

ahh il mio errore - non mi è mai sembrato di essere in grado di far funzionare i metodi del post * senza questo in qualche modo. Forse è una sbornia dai miei giorni di Doctrine 1.0 ...:-) – richsage

Problemi correlati