首页 文章

Laravel 5使用参数进行表单请求验证

提问于
浏览
5

我正在使用表单请求验证,并且有一些规则需要外部值作为参数 .

以下是我在表单请求类中编辑业务配置文件的验证规则,

public function rules()
{
    return [
        'name' => 'required|unique:businesses,name,'.$business->id,
        'url' => 'required|url|unique:businesses'
    ];
}

我可以通过类型提示它在控制器上使用它 .

公共职能postBusinessEdit(BusinessEditRequest $ request,Business $ business){

}

但是如何将$ business对象作为参数传递给rules方法?

5 回答

  • 9

    让我们说这是你的模型绑定:

    $router->model('business', 'App\Business');
    

    然后你可以在 FormRequest 对象中引用 Business 类,如下所示:

    public function rules()
    {
        $business = $this->route()->getParameter('business');
        // rest of the code
    }
    

    请注意,如果您在创建和更新验证时使用表单请求,则在创建记录时,业务变量将为 null ,因为您的对象尚不存在 . 因此,在引用对象属性或方法之前,请务必进行必要的检查 .

  • 5

    有很多方法可以实现这一目标 . 我这样做如下 .

    您可以在商业表单中使用隐藏字段“id”,如下图所示,

    {!! Form::hidden('id', $business->id) !!}
    

    并且您可以在 FormRequest 中检索此 id ,如下所示,

    public function rules()
    {
        $businessId = $this->input('id');
    
        return [
            'name' => 'required|unique:businesses,name,'.$businessId,
            'url' => 'required|url|unique:businesses'
        ];
    }
    
  • 0

    对于那些转向laravel 5的人:

    public function rules()
    {
        $business = $this->route('business');
        // rest of the code
    }
    
  • 1

    至少在Laravel 5.5中(没有检查旧版本),一旦你做了明确的绑定(https://laravel.com/docs/5.5/routing#route-model-binding),你可以通过$ this直接得到你的模型:

    class StoreBussiness extends FormRequest
    {
    
        public function rules()
        {
            $rules = [];
            if ($this->type === 'a') {
            }
    
            return rules;
        }
    }
    
  • 1

    假设我们想要更改验证规则的场景取决于我们传入路径的 type . 例如:

    app.dev/business/{type}
    

    对于不同类型的业务,我们有不同的验证规则 . 我们需要做的就是在控制器方法上键入提示请求 .

    public function store(StoreBusiness $request)
    {
        // The incoming request is valid...
    }
    

    对于自定义表单请求

    class StoreBussiness extends FormRequest
    {
    
        public function rules()
        {
            $type = $this->route()->parameter('type');
    
            $rules = [];
            if ($type === 'a') {
            }
    
            return rules;
        }
    }
    

相关问题