我有一个用于创建数据的端点。
请求为“名称”。我需要生成“ 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',
];
}
}
答案 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'
]
}