2010-06-20 10 views
6

Utilizando Symfony 1.4.5 con DoctrinaRealizar una pequeña limpieza al eliminar un registro en Symfony/Doctrina

he un modelo que incluye una imagen cargada como una de las columnas - la creación y la actualización del registro está muy bien (usando el Método doSave() para tratar la carga y cualquier cambio en el archivo).

El problema que tengo es si el registro se elimina; también quiero que elimine el archivo asociado. Pero no puedo encontrar de todos modos para hacer esto después de varias horas de buscar documentación y Google.

¿Hay alguna forma de especificar algún tipo de código posterior a la eliminación?

Respuesta

6

solución final:

en /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); 
    } 
} 

Gracias a Coronel Sponz para mí apuntando en la dirección correcta

+0

También puede manejarlo con eventos de Doctrine, pero para acciones simples como eliminar un archivo específico de registro, su solución está bien – Benoit

+0

sí, leo los eventos/oyentes, si comienzo a obtener un post difícil de manejar. proceso Probablemente cambiaré a ese – HorusKol

+1

Estoy haciendo esto pero me encuentro con un problema: si la eliminación falla y la transacción nunca se confirma, el método postDelete se sigue ejecutando y los archivos se eliminan de todos modos. – mattalxndr

2

Hace un tiempo desde que utilicé Doctrine por última vez, pero parece recordar que hay una función de anotación de eliminación de publicaciones que puede usar para este tipo de cosas. Si busca la fuente de la clase base de Doctrine, debería poder encontrar el nombre y el uso exactos del método.

EDIT: El método es postDelete() y se encuentra en la clase Doctrine_Record

Ésta es la sección de la documentación de Symfony que cubre advanced Doctrine usage.

+0

realidad - que doesn página Entre en cualquier lugar con suficiente detalle, y la doctrina API es igualmente inútil. – HorusKol

+0

¿Qué sucede cuando creas un método postDelete() en tu clase de modelo? ¿Puedes hacer eso para tomar una acción, incluso solo registrar un mensaje? –

+0

Puedo ejecutar el código en el método postDelete(), no hay problema, pero no veo cómo obtener el nombre de archivo de la imagen que necesito eliminar ... – HorusKol

2

Secuestro La respuesta de Colonel Sponsz, el método postDelete() es definitivamente el camino a seguir. +1 a él :-) Pero deberá habilitar las devoluciones de llamadas de Doctrine en su config/ProjectConfiguration.class.php. Añadir este método:

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

Borrar la caché de Symfony, y Doctrina disparará los métodos de devolución de llamada como postDelete() en los momentos adecuados.

+0

gracias por la información adicional, aunque, creo que ya está ordenada, como cuando puse un eco en el método postDelete, obtengo el resultado esperado sin tener que agregarlo explícitamente a la configuración – HorusKol

+2

. En realidad, solo necesita agregar esta configuración cuando utilizando devoluciones de llamada de DQL (preDqlSelect, preDqlUpdate y preDqlDelete) – DuoSRX

+0

ahh mi error: nunca me había sido posible conseguir que los métodos de publicación * funcionaran sin esto de alguna manera. Tal vez eso es una resaca de mi Doctrine 1.0 días ...:-) – richsage

Cuestiones relacionadas