Laravel 5 表单请求,需要在创建时输入,但在编辑时可选
Laravel 5 Form request, require input on create, but optional on edit
我正在使用 laravel 5.6 resources controllers
和 form request
问题是我有一些输入 required
在创建时,但在编辑时是可选的,例如文件输入.所以我有这个表格请求
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProgramRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
'name.*' => 'required',
'description.*' => 'required',
'logo' => 'required|image|max:3000',
'logo_alt' => 'required|image|max:3000'
];
}
}
创建程序时必须发送 logo
和 logo_alt
字段,但编辑程序时发送 logo
是可选的。
有没有一种方法可以使用相同的 form request
来验证这两种情况,或者我必须创建一个不同的 form request
来进行编辑和创建?
您可以使用 $this->method()
检查使用了哪种请求方法,并针对每种情况显示不同的规则:
public function rules()
{
switch($this->method())
{
case 'GET':
case 'DELETE':
{
return [];
}
case 'POST':
{
return [
'name.*' => 'required',
'description.*' => 'required',
'logo' => 'required|image|max:3000',
'logo_alt' => 'required|image|max:3000'
];
}
case 'PUT':
{
return [
'description.*' => 'required',
'logo' => 'nullable|image|max:3000',
'logo_alt' => 'nullable|image|max:3000'
];
}
case 'PATCH':
{
return [];
}
default:break;
}
}
在上面的示例中,POST
将用于您的创建,PUT
将用于您的更新。
请注意,我已将 nullable
用于 PUT
验证规则,这会告诉请求对象该字段是可选的。
而不是:
return [
//
'name.*' => 'required',
'description.*' => 'required',
'logo' => 'required|image|max:3000',
'logo_alt' => 'required|image|max:3000'
];
您可以使用:
$rules = [
'name.*' => 'required',
'description.*' => 'required',
'logo' => ['image', 'max:3000'],
'logo_alt' => ['image', 'max:3000'],
];
if ($this->isMethod('POST')
{
$rules['logo'][] = 'required';
$rules['logo_alt'][] = 'required';
}
return $rules;
所以基本上你有更新规则,但除了 POST 方法之外,你还需要制作徽标和 logo_alt。您也可以使用管道语法 |
,但对规则使用数组语法更方便,这样您以后可以在需要时执行此类操作。
我知道我迟到了。但我发现了一些更好的解决方案,比如这样
$requiredOrNull = '';
switch ($this->method()) {
case 'POST':
$requiredOrNull = 'nullable';
break;
case 'PUT':
$requiredOrNull = 'required';
break;
}
return [
//
'name.*' => 'required',
'description.*' => 'required',
'logo' => $requiredOrNull . '|image|max:3000',
'logo_alt' => $requiredOrNull . '|image|max:3000'
];
}
基本上它会检查该方法是否为 post,您的 logo
和 logo_alt
将是必需的,但如果放置该方法,它将是可为空的
我正在使用 laravel 5.6 resources controllers
和 form request
问题是我有一些输入 required
在创建时,但在编辑时是可选的,例如文件输入.所以我有这个表格请求
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ProgramRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
//
'name.*' => 'required',
'description.*' => 'required',
'logo' => 'required|image|max:3000',
'logo_alt' => 'required|image|max:3000'
];
}
}
创建程序时必须发送 logo
和 logo_alt
字段,但编辑程序时发送 logo
是可选的。
有没有一种方法可以使用相同的 form request
来验证这两种情况,或者我必须创建一个不同的 form request
来进行编辑和创建?
您可以使用 $this->method()
检查使用了哪种请求方法,并针对每种情况显示不同的规则:
public function rules()
{
switch($this->method())
{
case 'GET':
case 'DELETE':
{
return [];
}
case 'POST':
{
return [
'name.*' => 'required',
'description.*' => 'required',
'logo' => 'required|image|max:3000',
'logo_alt' => 'required|image|max:3000'
];
}
case 'PUT':
{
return [
'description.*' => 'required',
'logo' => 'nullable|image|max:3000',
'logo_alt' => 'nullable|image|max:3000'
];
}
case 'PATCH':
{
return [];
}
default:break;
}
}
在上面的示例中,POST
将用于您的创建,PUT
将用于您的更新。
请注意,我已将 nullable
用于 PUT
验证规则,这会告诉请求对象该字段是可选的。
而不是:
return [
//
'name.*' => 'required',
'description.*' => 'required',
'logo' => 'required|image|max:3000',
'logo_alt' => 'required|image|max:3000'
];
您可以使用:
$rules = [
'name.*' => 'required',
'description.*' => 'required',
'logo' => ['image', 'max:3000'],
'logo_alt' => ['image', 'max:3000'],
];
if ($this->isMethod('POST')
{
$rules['logo'][] = 'required';
$rules['logo_alt'][] = 'required';
}
return $rules;
所以基本上你有更新规则,但除了 POST 方法之外,你还需要制作徽标和 logo_alt。您也可以使用管道语法 |
,但对规则使用数组语法更方便,这样您以后可以在需要时执行此类操作。
我知道我迟到了。但我发现了一些更好的解决方案,比如这样
$requiredOrNull = '';
switch ($this->method()) {
case 'POST':
$requiredOrNull = 'nullable';
break;
case 'PUT':
$requiredOrNull = 'required';
break;
}
return [
//
'name.*' => 'required',
'description.*' => 'required',
'logo' => $requiredOrNull . '|image|max:3000',
'logo_alt' => $requiredOrNull . '|image|max:3000'
];
}
基本上它会检查该方法是否为 post,您的 logo
和 logo_alt
将是必需的,但如果放置该方法,它将是可为空的