Gestion des images dans symfony

Publié le

13 nov. 2010

how2tips

Nov 14, 2010 − Lorsqu'un Schtroumpf est supprimé ou que son image est modifiée, il faut que nous supprimions son ancienne image. Pour ce faire, nous allons exploiter les méthodes postUpdate et postDelete de la classe Doctrine_Record dont hérite notre Schtroumpf'modèle.

// lib/model/doctrine/Schtroumpf.class.php

<?php

class Schtroumpf extends BaseSchtroumpf { 
    // ... 
    
    /** 
     * Gets the path of the picture * 
     * 
     * @param string $filename Picture filename (null to use the current value) * 
     * @return string or null if the filename is empty 
     */ 
    public function getPicturePath($filename = null) 
    { 
         if (null === $filename) { 
             $filename = $this->picture; 
        } 
        
        if (empty($filename)) { 
            return null; 
        } 
        
        return $this->picture_directory_path . DIRECTORY_SEPARATOR . $filename; 
    } 
    
    public function postUpdate(Doctrine_Event $event) 
    { 
        $modified = $event->getInvoker()->getModified(true); 
        
        if (
            array_key_exists($field, $modified) && 
            !empty($modified[$field]) && 
            $modified[$field] != $event->getInvoker()->getPicture() 
        ) { 
            @unlink($event->getInvoker()->getPicturePath($modified[$field])); 
        } 
    } 
    
    public function postDelete(Doctrine_Event $event) 
    { 
        foreach ($this->_options as $field => $params) { 
            if (null !== $path = $event->getInvoker()->getPicturePath()) { 
                @unlink($path); 
            } 
        } 
    } 
}

La méthode fonctionne telle qu'elle. Cependant, si vous avez plusieurs modèles à gérer de la sorte, vous risquez de vous répéter. C'est mal : Don't Repeat Yourself (DRY). Mais alors comment faire pour généraliser ce comportement tout en sachant qu'on ne peut pas faire d'héritage avec les records doctrine? C'est là qu'interviennent les behaviors de doctrine. Ces derniers ne sont pas traités ici car ils feraient à eux seuls l'objet d'un article. Sachez cependant que j'ai publié un plugin qui permet de gérer les médias attachés à un modèle doctrine : le knpDoctrineMediaHandlerPlugin. Pour ma part, j'ai également crée un template "RoutingAware" qui se connecte sur l'événement "routing.load_configuration" de symfony afin de récupérer une instance de routing pour les modèles.

Publié par

KNP Labs
KNP Labs

Commentaires