Salut !

Bon je n'arrive pas à faire ce que je veux avec le validator de Laravel, c'est peut-être impossible qui sait !
J'ai en gros mon controleur CommentController.
Ce controleur permet d'enregistrer un commentaire dans ma BDD. Un commentaire fait référence à une actualité OU à un film OU à un épisode. En aucun cas un commentaire peut avoir comme référence une actualité et un film par exemple.

J'ai donc 3 formulaires, un dans chaque vue (Films, Episodes, Actualités).

Et j'aimerai que le validator vérifie que j'ai que une variable retournée par le formulaire, par exemple que j'ai que id_movie ou que id_episode et que si par exemple un petit malin fait passer les deux ou voir les trois ça refuse.

J'avais fait ça avec des conditions mais c'est pas très propre, c'est pour ça que je préfère passer par le validator :

if ($request['id_news'] && $request['num'] && $request['id_movie'])
{
    return redirect()->back();
}
else
{
    ect.....
}

J'ai bien regardé sur la doc (https://laravel.com/docs/5.4/validation#available-validation-rules) mais malgrè plusieurs essais ça ne fonctionne pas

10 réponses


Salut,

Tu as tout dans la documentation, partie Validation ;)

Justement j'ai regardé mais ça ne marche pas, je trouve pas la bonne règle.
J'ai essayé ça mais ça marche pas :

Required With
Required Without

Et sinon, pourquoi ne pas simplement séparer les formulaires sur 3 pages différentes ? Enfin j'ai un peu de mal à comprendre la logique du truc là.

J'ai trois pages différentes avec 1 formulaire par page justement.
Mais j'ai qu'un controleur pour ces trois pages.

Le formulaire de la page 1 contient : id_news
Le formulaire de la page 2 contient : id_movie
Le formulaire de la page 3 contient : id_episode

Et je veux vérifier dans mon controleur avec le validator que chaque formulaire ne retourne que sa valeur, que par exemple la page 2 ne retourne que id_movie et pas id_news en plus ou id_episode.

A ce moment là, dans ton contrôleur, crée une méthode par type. Oui c'est pas opti, mais ça te permettra de gérer la validation plus facilement ;)
Tu peux aussi créer une méthode privée qui te permettra te persister les data en BD, comme ça tu ne te répète pas trop ;)

Ouais c'est ce que j'ai actuellement, c'est pas terrible mais bon

Beh au moins tu sépares la validation, donc c'est bon comme ça ;)

Bonjour,
Pour ta validation tu peux passer par FormRequest Validation, tu crées une request php artisan make:request NomRequest après tu l'injecte dans ta fonction au lieu de la reqest par défaut.
Dans la fonction rules() de la class request tu a accès aux donnés postées, et avec des conditions tu peux avoir ce que tu veux.
Exemple:

public function rules()
    {
        $rules = [
           'name' => 'required|max:255',
           'first_name' => 'max:255',
           'last_name' => 'max:255',
        ];
        if($this->get('id_news') ){
           $rules['id_news'] = 'required';
        }elseif($this->get('id_movie') ){
           $rules['id_movie'] = 'required';
        }
        return $rules;
    }

J'espère que ça ira ...

Salut,
tu peut essayé ça :

<?php

namespace App\Http;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class CommentController extends CommentController
{
    public function storeComment (Request $request)
    {
        // ici un example pour les champ qui sont communs
        $rules = [
            'name' => 'required|max:255',
            'email' => 'required|email'
        ];

        // ici on vois ce qu'il contient le variable $request
        // depond du formulaire [ 'id_news' Où 'id_movie' Où 'id_episode']
        if ($request->has('id_news')) {

            $rules['id_news'] = 'required|numeric';

        } elseif ($request->has('id_movie')) {

            $rules['id_movie'] = 'required|numeric';

        } elseif ($request->has('id_episode')) {

            $rules['id_episode'] = 'required|numeric';

        }

        // ici on valide les données
        $this->validate($request, $rules);

        // ici la validation est passé tres bien
        //sinon il va faire un redirect avec les erreurs dans le variable $errors

        //donc ici tu peut faire les traitement pour persister les donnees dans ta BDD

    }
}

mais je le probleme c'est la structure de ta table comments elle contient tout ces champ où quoi ?
si oui il est necessaire qui il sont nullable bah il est mieux que tu peut nous données ta migration

j'espere ça fonctione c'est la logique que tu est besoin .

pour afficher les erreurs tu peut utiliser ça :

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

dans ta vue pour voir les erreurs.