Bonjour,

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

Ce que je fais

J'essais de forcer à ignorer la règle 'unique' quand je suis dans une situation de mise à jours d'un contenu

// List des règles de validation de mon fichier ProjectRequest
$rules = [
            'name' => 'required|min:5|max:255',
            'slug' => 'required|min:5|max:255|unique:projects',
            'content' => 'required|min:10',
            'website' => 'nullable|url',
            'client_name' => 'nullable',
            'video' => 'nullable|url'
        ];

Ce que je veux

Si on modifier pas le slug et que on est dans un status "update". La règle 'unique sois ignoré'. Si on modifier le champ slug la règle va s'appliquer.

J'ai regardé dans la documentation de Laravel à propos des règle de validation. Il est est voici la syntaxe pour la règle de validation unique "

unique:table,column,except,idColumn

The field under validation must be unique in a given database table. If the column option is not specified, the field name will be used.

Dans mon ProjectsRequest j'ai essayé de suivre cette syntaxe :

$this['slug'] = str_slug($this->input('slug'));
        $rules = [
            'name' => 'required|min:5|max:255',
            'slug' => 'required|min:5|max:255|unique:projects',
            'content' => 'required|min:10',
            'website' => 'nullable|url',
            'client_name' => 'nullable',
            'video' => 'nullable|url'
        ];
        // If it's update case  and
        // $project return the ID
        if ($project = $this->route('project')) {
            $rules['slug'] .= ',slug,' . $project;
        }
        return $rules;

J'utilise dans mon controller ProjectsController la ProjetRequest

 public function update(ProjectRequest $request, Project $project)
    {
        $project->update($request->all());
        return redirect(route('backend.projects.index'))->with('success', "Your project has been updated");
    }

Ce que j'obtiens

La règle n'est pas ignorée et j'ai une erreur de validation disans que ce slug est déjà pris.

Merci de votre aide.

4 réponses


lakamark
Auteur
Réponse acceptée

Étrangement le problème c'est réglé :

J'ai remplacer ceci :

if ($project = $this->route('project')) {
            $rules['slug'] .= ',slug,' . $this->get('id');
        }

par ceci :

if ($project = $this->route('project')) {
            $rules['slug'] .= ',slug,' . $project->id;
        }

Merci de votre aide. Si vous avez une meilleure solution je suis partent. Merci pour votre aide.

Moi perso je ne modifie pas les slug et je ne crois pas que ça soit conseiller(même s'il n'est pas interdi de le faire) de modifier les sulg surtout pour des critères de référencements.

Tu créés 2 classes request, une pour la création et une pour l'ajout avec des régles différentes.

lakamark
Auteur

Bonjour,
Je modifie le slug car l'utililisateur ne doit pas être oubligé d'écrire son slug mon-slug dans le champs. Ma classe le fait à sa place. Pour répondre à Palvich4, j'ai mis un système de brouillons. Dès que tu clique sur créer un nouveau projet. J'ai une fonctionalité qui fait un findOrCreate dans mon model projet :

 public static function draft() {
        return self::firstOrCreate(['name' => null], ['content' => '', 'draft' => 1]);
    }

    // Dans ma fonction create

    public function create()
    {
        $project = Project::draft();
        return redirect(route('backend.projects.edit', $project));
    }

Je prévois mettre un système de fichier attachés. Je prépare juste le terrain.

Je me suis inspirée d'un code trouver sur gitub :
https://github.com/Grafikart/BlogMVC-Laravel/blob/9100f751598ad7adfd87410fb9ae650052b4f95e/app/Http/Requests/PostRequest.php