Autour de Laravel

Validation d'un request Json

Avatar de KYoann
KYoann

Bonjour à tous.

J'envoi en Javascript une requete post avec en data un tableau Json.

Afin de protéger au mieux l'application, je souhaite effectué un controle de ces données. J'y arrive dans le controller, mais pas dans un fichier classe étendu de FormRequest

Voici comment je procède dans mon controller :

public function store(Request $request)
    {

        $request->merge(json_decode($request->values, true));

        $validated = $request->validate([
            'id' => 'required|exists:maisons,id',
            'terrain_id' => 'nullable|exists:terrains,id',
            'objet' => 'required|min:1|max:45',
        ]);
}

Seulement, je n'ai aucune idée de comment déclarer le décodage des valeurs dans le fichier de controle, j'ai bien essayer d'ajouter une méthode prepareForValidation(), mais je patoge un peu :)

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreMaison extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
           'id' => 'required|exists:maisons,id',
            'terrain_id' => 'nullable|exists:terrains,id',
            'objet' => 'required|min:1|max:45',
        ];
    }

    /**
     * The data to be validated should be processed as JSON.
     * @return mixed
     */
    protected function prepareForValidation()
    {
        return  $data = json_decode($this->request->values, true);
    }
}

Merci

Posté il y a 1 mois
Avatar de KYoann
KYoann

Comme quoi, après un week-end a chercher la réponse, j'ai finalement trouvé, la solution était bien celle de la méthode supplémentaire, mais j'étais à l'ouest pour le contenu.

protected function prepareForValidation()
    {
        return  $this->merge(json_decode($this->value, true));
    }

Par contre, j'ai une autre difficulté a résoudre, dans mon Json de donnée, j'ai également un tableau de tableau non visible dans les exemple plus haut, et j'aimerais pouvoir valider chacunes de ces lignes. comment faire ?

Posté il y a 1 mois
Avatar de bestmomo
bestmomo

Salut,

Ca dépend si tu as les mêmes règles de validation pour toutes les lignes ou pas.

Posté il y a 1 mois
Avatar de KYoann
KYoann

Oui, chaque ligne du sous tableau est identique, entre temps j'ai trouvé comment faire, et je dois dire que c'est très commode !! Vive Laravel :)

Voici la solution complète

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreMaison extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
           'id' => 'required|exists:maisons,id',
            'terrain_id' => 'nullable|exists:terrains,id',
            'objet' => 'required|min:1|max:45',
            'professionnels' => 'array|min:1', // Ici on donne le nom du tableau, on peut même tester un min et un max !!
            'professionnels.*.professionnel_id' => 'required|exists:professionnels,id', // Ici on rentre dans les test pour chacunes des lignes
            'professionnels.*.dateIntervention' => 'required', // etc....
        ];
    }

    /**
     * The data to be validated should be processed as JSON.
     * @return mixed
     */
    protected function prepareForValidation()
    {
        return  $this->merge(json_decode($this->value, true));
    }
}
Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.