web-dev-qa-db-ja.com

Laravel:JSONオブジェクトの検証

Laravelで検証を使用するのは初めてです。以下のjsonオブジェクトに検証ルールを適用しようとしています。 jsonオブジェクト名はペイロードであり、例を以下に示します。

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"
    }
   ]
}

検証コードは次のようになります。テストのために、名前を数字として検証しています。以下のコードを実行すると、上記のjsonオブジェクトが承認され、データベースに挿入されます。代わりに、名前に英数字を渡しているので、何か間違ったことをしているので、例外が発生するはずです:

public function store(Request $request)
{

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

この方法を試してください

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());
    }
}

桁:値

検証中のフィールドは数値である必要があり、値の正確な長さが必要です。

12

ここに追加したい役に立つ答えがいくつかあります-私の好みはコントローラー機能が有効なリクエストのみを処理することです。そのため、すべての検証をリクエストに含めます。 Laravelは、リクエスト内のすべてのルールを検証した後、リクエストをコントローラー関数に挿入します。1つの小さなTweak(またはより良い特性)で、標準FormRequestはjson投稿の検証に最適です。

クライアント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));

project/routes/api.php

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

app/Http/Requests/MyJsonRequest.php(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

ペイロードはpayload: {その後、あなたはできる

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

または、ペイロードキーを送信しない場合は、$ request-> all()を使用できます。

1
rchatburn

代わりに、コントローラの特性から派生したValidatorメソッドを使用して、validateファクトリクラスを使用します。ペイロードの配列を受け入れるため、最初にデコードする必要があります

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