Bonjour,

Je suis en train de migrer une de mes appli web vers la version 3 de CakePHP et je rame un peu avec ce afterFind qui n'existe plus pour cette dernière version.

L'idée c'est qu'après chaque find ou get, je puisse compléter l'entité par deux champs supplémentaires. Dans mon cas, ça me permettrait de générer dynamiquement le chemin relatif de certaines images et de pouvoir y accéder lors du beforeDelete ou du afterSave.

Pour vous donner une idée, sur CakePHP 2 j'avais ce type de code :

public function afterFind($results, $primary = false){
        foreach($results as $k => $result) {
            if(isset($result[$this->alias]['id'])){
                $results[$k][$this->alias]['image1'] = 'rea/460x380/'.$result[$this->alias]['id'].'.png';
                $results[$k][$this->alias]['image2'] = 'rea/220x135/'.$result[$this->alias]['id'].'.png';
            }
        }
        return $results;
    }

Est-ce que quelqu'un s'est déjà penché sur le sujet ou aurait des suggestions à me faire ?

J'ai déjà pas mal épuré la doc, notemment ces deux parties :

Globalement j'ai assez bien compris, mais je n'arrive pas à reproduire ce que je souhaite. Je ne sais pas vraiment comment m'y prendre.

Merci d'avance pour votre aide.

2 réponses


Xeta
Réponse acceptée

Hello,

Tu as plusieurs choix, map(), une propriété virtuelle (getter) et enfin un custom finder.

Avec map():

$user = $this->Users
    ->find()
    ->formatResults(function ($users) {
        return $users->map(function ($user) {
            $user->image1 = 'rea/460x380/' . $user->id . '.png';
            $user->image2 = 'rea/220x135/' . $user->id . '.png';
            return $user;
        });
    });

Une propriété virtuelle :

protected function _getImage1() {
    return 'rea/460x380/' . $this->id . '.png';
}

Un custom finder :

public function findImages(Query $query)
{
    return $query->formatResults(function ($users) {
        return $users->map(function ($user) {
            $user->image1 = 'rea/460x380/' . $user->id . '.png';
            $user->image2 = 'rea/220x135/' . $user->id . '.png';
            return $user;
        });
    });
}

$users = $this->Users
    ->find('images')
    //etc

Perso, j'utilise toujours la méthode avec une propriété virtuelle.

Geetix
Auteur

Merci beaucoup pour ces précisions et ces exemples. Je comprend beaucoup mieux.

La méthode avec le getter est effectivement plus propre, je vais utiliser celle-là.