简体   繁体   中英

How to create custom validation rule in Laravel 6 API

I need to use my custom validation rule for validating API requests.

Request Class:

This is my request validation rule.

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class LoginRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            'username' => 'required',
            'password' => 'required'
        ];
    }
    public function messages()
    {
        return [
            'username.required' => 'The Username field is required',
            'password.required'  => 'The Password field is required'
        ];
    }
}

API Controller:

This is my API controller and method.

use Illuminate\Http\Request;
use App\Http\Controllers\API\BaseController as BaseController;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\LoginRequest;

class LoginController extends BaseController
{
    public function login(LoginRequest $request)
    {
        print_r($validatorMsg);
        die();
    }
}

Unable to get error message.

Your code looks good. A JSON response will be returned automatically for an AJAX call. Remember that you can't reach the controller method if validation errors occur, so in your case, print_r($validatorMsg); will not be executed if any validation errors occur.

Instead check the response returned for your request. In axios, you can get the errors like this:

axios.post('/your-route', data).then((res) => {
    console.log('Request succeeded.');
}).catch((err) => {
    console.log(err.response.data.errors);
});

This is just an example. You should check the appropriate response returned for your API call to catch the resulted errors.

use Illuminate\Support\Facades\Validator;
use Illuminate\Http\JsonResponse; 
public function login(LoginRequest $request)
    {

$validator = Validator::make($request->all(), [
            'user_name' => 'required',
            'password' => 'required',

        ]);
        if ($validator->fails()) {

            $message = $validator->errors()->first();
        $errors=$validator->errors();
        $code='200';

        $response = array(
            'success' => false,
            'message' => $message,
            "errors" => $errors
        );

        return new JsonResponse($response, $code);
        }
}

guys, I resolved the problem this is the solution:

public function login(Request $request)
{
    $LoginRequest = New LoginRequest;
    $validator = Validator::make($request->all(), $LoginRequest->rules(),$LoginRequest->messages());

    if($validator->fails()){
        return response()->json($validator->errors(), 422);      
    }
}

In your controller you can check if request has validation errors, if yes you can send json response with you validation errors. Try code bellow

public function login (Request $request) {
  if(!$request->validated()) {
     return response()->json($request->validator->messages());
  } 
}

In order to display error messages in your API's, use response() method in your LoginRequest class, so you always return JSON. Something like this:

public function response(array $errors)
{
     // Always return JSON.
     return response()->json($errors, 422);
}

Now try to submit empty form, and you should be able to view the error message.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM