【问题标题】:Laravel 5 Form request validation with parametersLaravel 5 带参数的表单请求验证
【发布时间】:2015-10-05 07:06:22
【问题描述】:

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

这是我在表单请求类中编辑业务资料的验证规则,

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

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

public function postBusinessEdit(BusinessEditRequest $request, Business $business)
{
    //
}

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

【问题讨论】:

  • 将模型(我假设 $business 是一个模型)导入您的请求类并手动获取对象
  • @NehalHasnayeen 是的,业务是一个模型,但它是类型提示到使用路由模型绑定的控制器方法。

标签: laravel laravel-5


【解决方案1】:

假设这是您的模型绑定:

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

然后您可以像这样从FormRequest 对象中引用Business 类:

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

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

【讨论】:

  • 你可以做更短的$this->route('business')
【解决方案2】:

有很多方法可以实现这一点。我这样做如下。

您可以在您的业务表单中添加一个隐藏字段“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'
    ];
}

【讨论】:

  • 我认为这个答案比公认的答案简单。
【解决方案3】:

对于那些切换到 laravel 5 的人:

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

【讨论】:

    【解决方案4】:

    假设我们有一个场景,比如我们想要更改验证规则,这取决于我们通过路由传入的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;
        }
    }
    

    【讨论】:

      【解决方案5】:

      至少在 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;
          }
      }
      

      【讨论】:

        【解决方案6】:

        从 Laravel 5.6 开始,你可以在 rules 方法中输入提示:

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

        查看docs了解更多信息:

        您可以在规则方法的签名中键入提示您需要的任何依赖项。它们将通过 Laravel 服务容器自动解析。

        【讨论】:

        • Adam ... 例如,如果您在 BusinessController.php 上有 public function update(BusinessUpdateRequest $request, Business $business) {...},您如何将 $business 传递给 BusinessUpdateRequest.php,以便您可以在“规则”中使用此参数" 像你在你的例子中那样做的方法???
        • @zacktagnan 您需要将 $business 绑定到服务器容器。它会自动解决:)
        • Adam ... 抱歉,我不知道如何“将 $business 绑定到服务器容器”你能举个例子吗?
        • @zacktagnan 创建一个服务提供者并绑定你的类。阅读laravel.com/docs/7.x/container 和laravel.com/docs/7.x/providers#the-register-method 开始使用
        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 2015-12-24
        • 2016-09-02
        • 2023-03-14
        • 2016-05-23
        • 2016-03-11
        • 2015-06-09
        相关资源
        最近更新 更多