为了账号安全,请及时绑定邮箱和手机立即绑定

通过在控制器中添加新数据来动态更新验证规则

通过在控制器中添加新数据来动态更新验证规则

PHP
呼唤远方 2021-06-11 14:23:28
我正在开发一个基于 Web 的应用程序,技术堆栈是:VueJS,用于表示层,Laravel(PHP)用于RESTFUL API服务,以及一个名为neo4j 的基于 nosql 图的数据库 。这是问题上下文,我有一个名为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 typepublic function contentType(){  return $this->hasOne('App\ContentType','IS_OF_TYPE');}}PostType:这里的类型可以是文件、链接、事件等。例如:[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 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

您可以使用请求中的数据动态构建验证规则:


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;

    }

}


查看完整回答
反对 回复 2021-06-13
  • 1 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信