gpt4 book ai didi

php - 如何在 Nova 中创建依赖验证规则?

转载 作者:行者123 更新时间:2023-12-04 17:35:13 25 4
gpt4 key购买 nike

我在 Nova 中为资源定义了如下字段:

Select::make('Type')
->options([
'video' => 'Video',
'download' => 'Download',
])
->rules('required'),

File::make('File', 'file_name')
->disk('local')
->path('/files')

我正在尝试根据类型字段的值为文件字段设置不同的验证规则。例如,如果类型为下载,则接受文件 mime 和最大大小为 1mb,而如果设置为视频,则接受视频文件 mime 和最大大小为 30mb。

我在尝试实现这一目标方面还没有取得任何进展。

我已经查看了 the docs也不是validation rule objectscustom closure rules将帮助我,因为我无法从他们那里访问类型字段的值。

同样,我想像扩展 NovaRequest 对象一样扩展 FormRequest。 ,但这不会执行 Nova 应用的前端验证。

有什么方法可以实现我所缺少的吗?

最佳答案

我现在通过提供的教程完成了这项工作 here来自 John Beales,他同样提示 Nova 没有自动接收 Laravel 表单请求。

1:为扩展 FormRequest 的 Nova 资源创建请求:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;


class StoreResourceRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
// Users authorized to make the request are:
// - users updating themselves.
// - staff
// - guests creating a new user.


return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{

$rules = self::ruleGetter($this);


if(empty($this->user())) {
$rules = array_merge_recursive($rules, self::creationRuleGetter($this));
} else {
$rules = array_merge_recursive($rules, self::updateRuleGetter($this));
}

return $rules;
}

public static function ruleGetter( $request, $rule = null ) {

$rules = [
'type' => ['required',Rule::in(['video', 'download'])],
];

if($request['type'] == 'download'){
$rules['file_name'] = ['required','mimes:jpeg,png,jpg,doc,docx,pdf','max:1000'];
}

if($request['type'] == 'video'){
$rules['file_name'] = ['required','mimes:mp4','max:50000'];
}

if(!empty($rule)) {
if(isset($rules[$rule])) {
return $rules[$rule];
}
return '';
}
return $rules;
}

public static function creationRuleGetter( $request, $rule = null ) {
$rules = [

];


if(!empty($rule)) {
if(isset($rules[$rule])) {
return $rules[$rule];
}
return '';
}
return $rules;

}

public static function updateRuleGetter( $request, $rule = null ) {


$rules = [

];

if(!empty($rule)) {
if(isset($rules[$rule])) {
return $rules[$rule];
}
return '';
}
return $rules;
}

}

2:更新 Nova Resource 以加载这些规则:

namespace App\Nova;

use App\Http\Requests\StoreResourceRequest;

//...

public function fields(Request $request)
{
return [
//...

Select::make('Type')
->options([
'video' => 'Video',
'download' => 'Download',
])
->rules(StoreResourceRequest::ruleGetter($request, 'type')),

File::make('File', 'file_name')
->rules(StoreResourceRequest::ruleGetter($request, 'file_name'))

];
}

上面的方法适用于两种类型的验证,并将正确的值存储在数据库中。 Nova 可以正常与文件交互。

很遗憾,这不是 Nova 内置的,验证逻辑必须重复。

关于php - 如何在 Nova 中创建依赖验证规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56959048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com