试图在Laravel 5.2.15中将验证从控制器转移到请求类


Trying to shift the Validation from Controller to Request Class in Laravel 5.2.15

我在请求类中有一个非常简单的Rule方法,如下所示

public function rules()
{
    return [
        'Subject'           => 'required|max:50',
        'Description'       => 'required|max:500',
        'DepartmentID'      => 'required|integer|min:1',
        'PriorityID'        => 'required|integer|min:1'
    ];
}

Inside Controller Action方法,下面是代码

private function SaveChanges('App'Http'Requests'TicketRequest $request) {
    $v = 'Validator::make($request->all(), [
    ]);
    $DepartmentAdmins = $this->getDepartmentAdmins();
    //Check if department admin missing then no need to add the record
    if($DepartmentAdmins == null || count($DepartmentAdmins) == 0) {
        $v->errors()->add('MissingAdmins', 'Department admin missing.');
        return redirect()->back()->withErrors($v->errors());
    }
}

问题:

正如我们在rule方法中看到的,有4个表单字段。是否有任何方法可以将对部门管理员是否存在的检查从控制器操作方法转移到request类?

Laravel的Requestafter钩子,可以在正常验证完成后运行。这就是你可以在你的情况下使用它的方法:

namespace App'Http'Requests;
use App'Http'Requests'Request;
use App'Models'Property;
use Illuminate'Validation'Validator;
class SomeRequest extends Request
{
    /**
     * Get the validator instance for the request.
     *
     * @return Validator
     */
    protected function getValidatorInstance()
    {
        $instance = parent::getValidatorInstance();
        $instance->after(function ($validator) {
            $this->validateDepartmentAdmins($validator);
        });
        return $instance;
    }
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'Subject'           => 'required|max:50',
            'Description'       => 'required|max:500',
            'DepartmentID'      => 'required|integer|min:1',
            'PriorityID'        => 'required|integer|min:1'
        ];
    }
    /**
     * @param Validator $validator
     */
    public function validateDepartmentAdmins(Validator $validator)
    {
        $DepartmentAdmins = $this->getDepartmentAdmins();
        //Check if department admin missing then no need to add the record
        if($DepartmentAdmins == null || count($DepartmentAdmins) == 0) {
            $validator->errors()->add('MissingAdmins', 'Department admin missing.');
        }
}

这样,您就不必在SaveChanges控制器方法中进行任何验证。

这个代码在Laravel 5.1中使用,但我相信它在5.2中也会起作用。

Form Request类基本上有两个方法。"授权"answers"规则"。改变对Department Admin existense检查的最佳方法是添加您自己的自定义验证器(例如,名为"adminCountValidator"),并实现您的逻辑来检查那里的管理员数量。然后在"规则"方法中使用新定义的验证器,如下所示:

public function rules()
{
    return [
        'Subject'           => 'required|max:50',
        'Description'       => 'required|max:500',
        'DepartmentID'      => 'required|integer|min:1|adminCountValidator',
        'PriorityID'        => 'required|integer|min:1'
    ];
}

如果定义了自定义验证规则,还可以定义相关的错误消息,那么控制器的操作将更加干净。这是定义您自己的自定义验证器的链接
自定义验证规则

以下是在服务提供商中添加自定义验证器的示例代码

    class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Validator::extend('adminCountValidator', function($attribute, $value, $parameters, $validator) {
            /*
           implement your getDepartmentAdmins() 
           function here and return true or false
            */
            });
    }