web-dev-qa-db-fra.com

Laravel: valide l'objet json

C'est la première fois que j'utilise la validation dans laravel. J'essaie d'appliquer la règle de validation sur l'objet JSON ci-dessous. Le nom de l'objet json est payload et l'exemple est donné ci-dessous.

payload = {
  "name": "jason123",
  "email": "[email protected]",
  "password": "password",
  "gender": "male",
  "age": 21,
  "mobile_number": "0322 8075833",
  "company_name": "xyz",
  "verification_status": 0,
  "image_url": "image.png",
  "address": "main address",
  "lattitude": 0,
  "longitude": 0,
  "message": "my message",
  "profession_id": 1,
  "designation_id": 1,
  "skills": [
    {
      "id": 1,
      "custom" : "new custom1"
    }
   ]
}

Et le code de validation est comme ci-dessous, à des fins de test, je valide le nom en chiffres. Lorsque j'ai exécuté le code ci-dessous, l'objet JSON ci-dessus est approuvé et inséré dans ma base de données. Au lieu de cela, cela devrait me donner une exception parce que je passe un nom avec une valeur alphanumérique, est-ce que je fais quelque chose de mal:

public function store(Request $request)
{

    $this->validate($request, [
        'name' => 'digits',
        'age' => 'digits',
        ]);
}
3
MTA

S'il vous plaît essayer de cette façon

use Validator;

public function store(Request $request)
{
    //$data = $request->all();
    $data = json_decode($request->payload, true);
    $rules = [
        'name' => 'digits:8', //Must be a number and length of value is 8
        'age' => 'digits:8'
    ];

    $validator = Validator::make($data, $rules);
    if ($validator->passes()) {
        //TODO Handle your data
    } else {
        //TODO Handle your error
        dd($validator->errors()->all());
    }
}

chiffres: valeur

Le champ en cours de validation doit être numérique et avoir une longueur exacte de la valeur.

8
Quỳnh Nguyễn

Je vois quelques réponses utiles ici, je veux juste ajouter - que ma préférence est que les fonctions de contrôleur ne traitent que les requêtes valides. Je garde donc toute la validation dans la demande. Laravel injecte la demande dans la fonction de contrôleur après avoir validé toutes les règles de la demande. Avec un petit tweak (ou mieux encore un trait), le formulaire standard FormRequest est idéal pour valider les publications JSON.

Client example.js

var data = {first: "Joe", last: "Dohn"};
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("POST",'//laravel.test/api/endpoint');
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send(JSON.stringify(data));

projet/routes/api.php

Route::any('endpoint', function (\App\Http\Requests\MyJsonRequest $request){
    dd($request->all());
});

app/Http/Requests/MyJsonRequest.php (tel que généré par php artisan make:request MyJsonRequest)

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TrafficRequest extends FormRequest{

    public function authorize(){
        return true;//you'll want to secure this
    }

    public function rules(){
        return [
            'first' => 'required',
            'last'  => 'required|max:69',
        ];
    }

    //All normal laravel request/validation stuff until here
    //We want the JSON...
    //so we overload one critical function with SOMETHING LIKE this
    public function all($keys = null){
        if(empty($keys)){
            return parent::json()->all();
        }

        return collect(parent::json()->all())->only($keys)->toArray();
    }
}
2
Tarek Adam

Utilisez plutôt la classe d'usine Validator à l'aide de la méthode validate dérivée du trait du contrôleur. Il accepte un tableau pour la charge utile, vous devez donc le décoder d'abord

\Validator::make(json_decode($request->payload, true), [
    'name' => 'digits',
    'age' => 'digits',
]);
0
Chay22

Votre charge utile devrait être payload: { alors vous pouvez faire

$this->validate($request->payload, [
    'name' => 'required|digits:5',
    'age' => 'required|digits:5',
    ]);

ou si vous n'envoyez pas la clé de charge, vous pouvez simplement utiliser $ request-> all ()

0
rchatburn