Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Je cherche à mettre à jour un champs "lastlogin" dans ma BDD quand un utilisateur se connecte. Je peux le faire manuellement mais je cherche à utiliser le behavior timestamp comme dans la documentation en faisant :

        $this->addBehavior('Timestamp', [
            'events' => [
                'Model.beforeSave' => [
                    'created' => 'new',
                    'modified' => 'always',
                ],
                'Users.login' => [
                    'lastlogin' => 'always'
                ]
            ]
        ]);

Ce que je veux

Le code est censé se déclender lors de l'action login du controller users et mettre à jour le champs, mais non... rien ne se passe. Dans l'action login il n'y a aucun évenement de save, juste $this->Auth->identify(); et $this->Auth->setUser($user) comme expliqué dans la doc. Donc je pense que le problème vient de la : si je déclenche aucun save, je vois pas comment il pourrait rentrer dans le behavior timestamps. Mais alors pourquoi la doc sous-entend qu'on puisse le faire ?

2 réponses


Bonjour.

Mais alors pourquoi la doc sous-entend qu'on puisse le faire ?

La documentation ne ment pas, elle précise bien :

Si vous avez besoin de modifier les champs avec des noms différents, ou si vous souhaitez mettre à jour le timestamp supplémentaire sur des événements personnalisés, vous pouvez utiliser quelques configurations supplémentaires

Il y est bien dit sur les évènements.
Essaies donc de remplacer ton Users.login qui n'est pas un évènement existant (à moins que tu l'aies créé), par un évènement existant qui est afterIdentitfy, soit Auth.afterIdentify.
Ce qui donnerait donc par exemple :

 $this->addBehavior('Timestamp', [
            'events' => [
                'Model.beforeSave' => [
                    'created' => 'new',
                    'modified' => 'always',
                ],
                'Auth.afterIdentify' => [
                    'lastlogin' => 'always'
                ]
            ]
        ]);

Je ne te garanties pas que ça fonctionnera forcément n'ayant jamais essayé de passer par le behavior Timestamp pour modifier des champs supplémentaires à ceux par défaut de celui-ci, mais tu en sauras en tout cas plus sur le sujet.

Flitflit
Auteur

Users.login est une action de mon controller Users.
J'ai essayé Auth.afterIdentify mais ça ne fonctionne pas. En tout cas pas dans mon model Users, peut être dans la configuration du authComponent... faut que j'essaye ;)