试图在Laravel 5.2.15中将Validation从Controller转移到Request Class

Pan*_*kaj 11 php laravel laravel-5.2

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

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

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

题:

正如我们在rule方法中看到的那样,有4个表单字段.有没有办法将部门管理员的检查从Controller Action方法转移到request类?

Iva*_*ych 7

Laravel的Request具有after可正常验证完成后运行挂钩.这就是你如何在你的情况下使用它:

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.');
        }
}
Run Code Online (Sandbox Code Playgroud)

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

此代码在Laravel 5.1中使用,但我相信它在5.2中的工作方式相同.