Bonjour à tous,

Voila je rencontre un petit problème avec mon code.
j'ai suivis le blog tutorial du site officiel de cake pour apprendre cette nouvelle version.
apres quelques bidouilles de test, je rencontre un probleme de validation.
je ne sais pas si c'est moi qui fait mal (fort possible)

Ce que je fais

//src/Model/Table/ArticlesTable.php
class ArticlesTable extends Table
{
    public function validationDefault(Validator $validator)
    {
        $validator
            ->notEmpty('title')
            ->requirePresence('title');

        return $validator;
    }
}

// src/Controller/ArticlesController.php
public function add()
    {
        $article = $this->Articles->newEntity();
        if ($this->request->is('post')) {
            $article = $this->Articles->patchEntity($article, $this->request->data);

            $article->set('title', '') ; // une valeur qui ne respecte pas les règles de validation

            if ($this->Articles->save($article)) {
                $this->Flash->success(__('Your article has been saved.'));
                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('Unable to add your article.'));
        }
        $this->set('article', $article);
    }

Ce que je veux

Que l'erreur de validation soit déclenché losque je modifit les propiétés de mon entité et par consequent que le save() ne s'execute pas.

Ce que j'obtiens

Globalement, lorsque je modifie une propriété de l’instance Entity à l’aide de la méthode set(), Les valeurs ne sont visiblement pas revalidé et le save s’exécute.
Le comportement est le même si j’attaque directement la propriété $article->title = ‘’ .
En revanche toutes modifications sur le $this->request->data avant le patchEntity() va bien déclencher une erreur de validation.

4 réponses


Bonjour.
Je ne sais pas si c'est une erreur de copie/coller, mais :

public function validationDefault(Validator $validator)
{
    $validator
        ->notEmpty('title')
        ->requirePresence('title') // Il manque un `;` ici
    return $validator;
}

Ensuite, ici tu devrais mettre les caractères corrects :

$article->set(‘title’, ‘’) ;

Exemple :

$article->set('title', '');

Et puis, c'est $this->Articles->set('title', ''); et non $article->set('title', '');.
À moins que tu voulais faire : $article->title = '';.

Keneda
Auteur

merci pour cette réponse.
Oui c'est une erreur de copier/coller .... désolé
je corrige de suite

j'ai testé et

$this->Articles->set('title', '');

renvois une erreur: Unknown method "set"

code simplifier:

$article = $this->Articles->newEntity();
$article = $this->Articles->patchEntity($article, $this->request->data);
$article->set('title', '') ; 
if ($this->Articles->save($article)) { ...

sauf erreur de ma part, dans ce cas $article est une entité et $this un controller

que j'utilise $article->set('title', ''); ou $article->title = ''; m'importe peut en faite, bien qu'il me semble plus logique d'utiliser les méthodes prévu à cet effet que d’attaquer directement les propriétés. dans les deux cas la validation n'est pas faite.

je souhaite juste pouvoir manipuler mes entités dans le code et qu'elle soit valider avant la sauvegarde en base.
et je trouve surprenant que cela ne se fasse pas automatiquement.

Keneda
Auteur

Pour info, j'ai fini par opter pour cette methode:

$article = $this->Articles->newEntity();
$article = $this->Articles->patchEntity($article, $this->request->data);
$article->set('content', ''); // une valeur qui ne respecte pas les règles de validation

$validator = $this->Articles->validationDefault(new Validator());
$errors = $validator->errors($article->toArray(), false);

if (empty($errors) && $this->Articles->save($article)) { ...

je ne sais pas si c'est super propre mais cela fonctionne :)