通过在控制器中添加新数据来动态更新验证规则
Update dynamically validation rules by adding new data in the controller
我正在开发一个基于网络的应用程序,技术堆栈是:VueJS,对于表示层,Laravel(PHP) 用于 RESTFUL API 服务,以及一个名为 neo4j[=61= 的基于 nosql 图形的数据库].这是问题的上下文,我有一个名为 Post 的模型,这里定义的属性是所有 post 类型共享的,所以它们都有它:
use NeoEloquent;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use Vinelab\NeoEloquent\Eloquent\SoftDeletes;
class Post extends NeoEloquent
{
protected $label = 'Post';
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'title',
'slug',
'body',
'status',
'image',
'published_at',
'read_time',
'isModerate',
'link',
'external_id'
];
/**
protected $hidden = ['remember_token'];
/**
* relations
*/
public function authors()
{
return $this->belongstoMany('App\User', 'AUTHOR');
}
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()->generateSlugsFrom('title')->saveSlugsTo('slug');
}
//Post type
public function contentType(){
return $this->hasOne('App\ContentType','IS_OF_TYPE');
}
}
PostType : 这里的类型可以是 File,Link ,事件,etc.Eg:[name=>'Event','description'=>'description','slug'=>'event']
class PostType extends NeoEloquent
{
protected $label='ContentType';
protected $dates=['created_at','updated_at','deleted_at'];
protected $fillable=[
"name",
"description",
"slug"
];
//Ce input contentype sera associe a plusieurs input fields
public function customFields(){
return $this->belongsToMany('App\CustomField',"HAS_FIELD");
}
public function post(){
return $this->belongsToMany('App\Post','IS_OF_TYPE');
}
}
最后是 CustomField 模型:
class CustomField extends NeoEloquent
{
protected $label="CustomType";
protected $dates=["created_at","updated_at","deleted_at"];
protected $fillable=[
"field_name",
"field_type",
"field_order",
"validation_rules"
];
public function contentTypes(){
return $this->belongsToMany('App\CustomField','HAS_FIELD');
}
}
流程如下:
1 - 在 UI 当用户第一次打开 post 创建 post Form 时,他作为 [=16] 中定义的公共字段来填写=] Post
model.And 的属性,已经有一个用于验证的表单请求定义如下:
class StorePost extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'title' => 'required|string|min:1',
'body' => 'required',
'status' => 'required',
'image' => 'sometimes|image',
'published_at' => 'required',
'link' => 'required_if:type,==,RSS|required_if:type,==,LINK',
'external_id' => 'sometimes'
];
}
}
2 - 在相同的表单中,用户在 <select>
中有 type
字段,它从 database(throug ajax)
中的 ContentType
模型加载所有内容类型。Eg : Event,Link,File,...
,一旦他选择了一个类型,另一个 request(ajax)
就会去检索 CustomField
。请注意,这里的自定义字段意味着,对于类型 Event
字段,将以以下格式发送['field_name'=>'name','field_type'=>'string','field_order'=>'1',validation_rules=>'required|max:200']
,等等,我使用这些字段属性在 Front-End
中动态构建我的 PostType fields
,一旦用户填写表单并在后端发送数据 server:I不知道如何处理 validation.What 我首先做的是为我所有的自定义 inputs field
创建一个表单请求,但我想如果不是只有 Event,File and Link
Post types
我添加 20.I 不会创建 20 个验证 rules.At 这点我的控制器只知道如何验证 'Post' 像这样:
public function store(StorePost $request)
{
$data = $request->validated();
...
}
我想做的是根据来自前端的数据使用新字段和新规则更新现有商店Post验证-end.So我不知道如何在我的控制器的 Requests 文件夹中更新现有的 Form Request
定义,并根据来自前端的数据创建新的验证规则,这些规则基于前面定义和填充的字段 -end.I'有一个想法,包括根据前端发送给我的 post 类型获取所有 input_fields 验证规则,然后更新现有的验证规则。
注意:我定义关系的方式与 Eloquent
不同,因为我使用的 Neoloquent
实现了 neo4j
数据库。
您可以使用请求中的数据动态构建验证规则:
use Illuminate\Http\Request;
class StorePost extends FormRequest
{
public function authorize()
{
return true;
}
public function rules(Request $request)
{
$rules = [
'title' => 'required|string|min:1',
'body' => 'required',
'status' => 'required',
'image' => 'sometimes|image',
'published_at' => 'required',
'link' => 'required_if:type,==,RSS|required_if:type,==,LINK',
'external_id' => 'sometimes'
];
if($typeSlug = $request->get('type'))
{
$type = PostType::where('slug', $typeSlug)->with('customFields');
// map custom fields into a `['name' => 'rules']` format
$customFieldRules = $type->customFields->mapWithKeys(function($customField) {
return [$customField->field_name => $customField->validation_rules];
});
$rules = array_merge($rules, $customFieldRules);
}
return $rules;
}
}
我正在开发一个基于网络的应用程序,技术堆栈是:VueJS,对于表示层,Laravel(PHP) 用于 RESTFUL API 服务,以及一个名为 neo4j[=61= 的基于 nosql 图形的数据库].这是问题的上下文,我有一个名为 Post 的模型,这里定义的属性是所有 post 类型共享的,所以它们都有它:
use NeoEloquent;
use Spatie\Sluggable\HasSlug;
use Spatie\Sluggable\SlugOptions;
use Vinelab\NeoEloquent\Eloquent\SoftDeletes;
class Post extends NeoEloquent
{
protected $label = 'Post';
protected $dates = ['created_at', 'updated_at', 'deleted_at'];
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'title',
'slug',
'body',
'status',
'image',
'published_at',
'read_time',
'isModerate',
'link',
'external_id'
];
/**
protected $hidden = ['remember_token'];
/**
* relations
*/
public function authors()
{
return $this->belongstoMany('App\User', 'AUTHOR');
}
public function getSlugOptions(): SlugOptions
{
return SlugOptions::create()->generateSlugsFrom('title')->saveSlugsTo('slug');
}
//Post type
public function contentType(){
return $this->hasOne('App\ContentType','IS_OF_TYPE');
}
}
PostType : 这里的类型可以是 File,Link ,事件,etc.Eg:[name=>'Event','description'=>'description','slug'=>'event']
class PostType extends NeoEloquent
{
protected $label='ContentType';
protected $dates=['created_at','updated_at','deleted_at'];
protected $fillable=[
"name",
"description",
"slug"
];
//Ce input contentype sera associe a plusieurs input fields
public function customFields(){
return $this->belongsToMany('App\CustomField',"HAS_FIELD");
}
public function post(){
return $this->belongsToMany('App\Post','IS_OF_TYPE');
}
}
最后是 CustomField 模型:
class CustomField extends NeoEloquent
{
protected $label="CustomType";
protected $dates=["created_at","updated_at","deleted_at"];
protected $fillable=[
"field_name",
"field_type",
"field_order",
"validation_rules"
];
public function contentTypes(){
return $this->belongsToMany('App\CustomField','HAS_FIELD');
}
}
流程如下:
1 - 在 UI 当用户第一次打开 post 创建 post Form 时,他作为 [=16] 中定义的公共字段来填写=] Post
model.And 的属性,已经有一个用于验证的表单请求定义如下:
class StorePost extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'title' => 'required|string|min:1',
'body' => 'required',
'status' => 'required',
'image' => 'sometimes|image',
'published_at' => 'required',
'link' => 'required_if:type,==,RSS|required_if:type,==,LINK',
'external_id' => 'sometimes'
];
}
}
2 - 在相同的表单中,用户在 <select>
中有 type
字段,它从 database(throug ajax)
中的 ContentType
模型加载所有内容类型。Eg : Event,Link,File,...
,一旦他选择了一个类型,另一个 request(ajax)
就会去检索 CustomField
。请注意,这里的自定义字段意味着,对于类型 Event
字段,将以以下格式发送['field_name'=>'name','field_type'=>'string','field_order'=>'1',validation_rules=>'required|max:200']
,等等,我使用这些字段属性在 Front-End
中动态构建我的 PostType fields
,一旦用户填写表单并在后端发送数据 server:I不知道如何处理 validation.What 我首先做的是为我所有的自定义 inputs field
创建一个表单请求,但我想如果不是只有 Event,File and Link
Post types
我添加 20.I 不会创建 20 个验证 rules.At 这点我的控制器只知道如何验证 'Post' 像这样:
public function store(StorePost $request)
{
$data = $request->validated();
...
}
我想做的是根据来自前端的数据使用新字段和新规则更新现有商店Post验证-end.So我不知道如何在我的控制器的 Requests 文件夹中更新现有的 Form Request
定义,并根据来自前端的数据创建新的验证规则,这些规则基于前面定义和填充的字段 -end.I'有一个想法,包括根据前端发送给我的 post 类型获取所有 input_fields 验证规则,然后更新现有的验证规则。
注意:我定义关系的方式与 Eloquent
不同,因为我使用的 Neoloquent
实现了 neo4j
数据库。
您可以使用请求中的数据动态构建验证规则:
use Illuminate\Http\Request;
class StorePost extends FormRequest
{
public function authorize()
{
return true;
}
public function rules(Request $request)
{
$rules = [
'title' => 'required|string|min:1',
'body' => 'required',
'status' => 'required',
'image' => 'sometimes|image',
'published_at' => 'required',
'link' => 'required_if:type,==,RSS|required_if:type,==,LINK',
'external_id' => 'sometimes'
];
if($typeSlug = $request->get('type'))
{
$type = PostType::where('slug', $typeSlug)->with('customFields');
// map custom fields into a `['name' => 'rules']` format
$customFieldRules = $type->customFields->mapWithKeys(function($customField) {
return [$customField->field_name => $customField->validation_rules];
});
$rules = array_merge($rules, $customFieldRules);
}
return $rules;
}
}