首页 > 解决方案 > laravel 5.4 中的自定义表单验证,不使用 AppServiceProvider boot() 方法

问题描述

目前我有一个我正在验证的表格,如下所示:

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        \Validator::extend('custom_validation',function($attribute, $value, $parameters){
             //validation logic
      });
    }
...

但是有没有一种方法可以避免将这种方法放在AppServiceProvider(或为此提供的任何服务)中?

例如,我有没有办法将它插入控制器类中的某个位置(为简单起见)?

我喜欢使用创建请求类(扩展FormRequest)之类的变体,但不确定如何将自定义方法添加到请求类。

任何建议将不胜感激。谢谢

标签: laravelvalidationlaravel-5php-7

解决方案


将验证规则分解为实现Illuminate\Contracts\Validation\Rule合同的类。(参见“使用规则对象”一节1。)

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class CustomValidation implements Rule
{
    public function passes($attribute, $value) 
    {
        // validation logic
    }

    public function message()
    {
        return 'validation error';
    }
}

然后有一个自定义表单请求扩展Illuminate\Foundation\Http\FormRequest 2

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Rules\CustomValidation;

class CustomFormRequest extends FormRequest
{

    public function rules()
    {
        return [
            // include rules for other fields
            'custom' => new CustomValidation,
        ];
    }
}

使用自定义表单请求中声明的规则在相关控制器中执行验证,通过类型提示控制器方法上的请求

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class CustomActionController extends Controller
{

    protected function create(CustomFormRequest $request)
    {

    }
}

推荐阅读