Laravel |验证产生的价值

时间:2018-10-03 07:41:05

标签: laravel validation request

我有一个用于创建数据的端点。

请求为“名称”。我需要生成“ slug”并验证该Slug是唯一的。 所以,让我们说

book_genres表。

id |名称| sl

请求为["name" => "My first genre"]。 我有一个带有规则的自定义请求: “ name” =>“ string | unique:book_genres,name”。 我需要相同的支票来检查。 $slug = str_slug($name);

如何将此验证添加到我的自定义请求中?

自定义请求类别:

 class BookGenreCreate extends FormRequest
{

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            "name" => 'required|string|unique:book_genres,name',
        ];
    }

}

2 个答案:

答案 0 :(得分:1)

因此,基本上,您想要做的是尝试在验证发生之前操纵请求数据。您可以在FormRequest类中通过重写验证发生之前调用的方法之一来执行此操作。我发现通过覆盖getValidatorInstance可以达到最佳效果。然后,您可以获取现有数据,向其中添加块,然后在请求中替换数据,所有操作均在验证之前进行:

protected function getValidatorInstance()
{
    $data = $this->all();
    $data['slug'] = str_slug($data['name']);
    $this->getInputSource()->replace($data);

    return parent::getValidatorInstance();
}

您还可以将子弹的规则添加到您的rules方法中:

public function rules()
{
    return [
        "name" => 'required|string|unique:book_genres,name',
        "slug" => 'required|string|unique:book_genres,slug',
    ];
}

所以您的课程看起来像这样:

class BookGenreCreate extends FormRequest
{

    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'name' => 'required|string|unique:book_genres,name',
            'slug' => 'required|string|unique:book_genres,slug',
        ];
    }

    protected function getValidatorInstance()
    {
        $data = $this->all();
        $data['slug'] = str_slug($data['name']);
        $this->getInputSource()->replace($data);

        return parent::getValidatorInstance();
    }
}

现在,当请求到达您的控制器时,它已经被验证,您可以从请求对象访问该段:

class YourController extends Controller
{
    public function store(BookGenreCreate $request)
    {
        $slug = $request->input('slug');

        // ...
    }
}

答案 1 :(得分:0)

您可以将'slug'添加到请求中,然后照常使用验证。

rules() {

    // set new property 'slug' to the request object.
    $this->request->set('slug', str_slug($request->name));

    // rules
    return [
        'name' => 'string|unique:book_genres,name',
        'slug' => 'string|unique:book_genres,slug'
    ]
}