【问题标题】:Laravel form requests and validationLaravel 表单请求和验证
【发布时间】:2015-06-09 06:00:24
【问题描述】:

下面是我在控制器上使用一个表单验证请求创建/存储和编辑/更新方法的解决方案(Laravel 5)。

这是一种麻烦且丑陋的 hack(即,它读取 URI 段以获取正在编辑的记录的 id)。有没有更好的方法来确定请求是否从编辑/更新请求中接收信息? (不直接将 $id 和标志传递给请求)

/**
 * Sets the basic validation rules that apply to the request.
 *
 * @return array
 */
protected $rules = [    
        'trading_name' => 'required|min:3|max:50|unique:companies',
        'legal_name' => 'required|min:3|max:50|unique:companies',
        'legal_identifier' => 'required|min:3|max:50|unique:companies',
        'status' => 'required',
        'website' => 'active_url',
        'type' => 'required',
        'payment_terms' => 'required|integer|min:0|max:180',
        'credit_limit' => 'required|integer|min:0|max:500000',
        'notes' => 'max:2000',
];

/**
 * Sets addition validation rules depending on the request type (i.e. edit & update).
 * 
 * 
 * @return array
 */
public function rules()
{
    $rules = $this->rules;
    if ($this->is('companies/*') == true) #Add a ignore self-unique rule as this is a edit&update request
    {
        $id = $this->segment(2);
        $rules['trading_name'] = $rules['trading_name'].',trading_name,'.$id;
        $rules['legal_name'] = $rules['legal_name'].',legal_name,'.$id;
        $rules['legal_identifier'] = $rules['legal_identifier'].',legal_identifier,'.$id;
    }
    return $rules;
}

【问题讨论】:

  • 其实可以直接调用段名。这个控制器的路线是什么样的?我会告诉你如何调用它。
  • 控制器是一个 laravel “资源”,即 Route::resource('companies', 'CompaniesController'); @mininoz

标签: php laravel laravel-5 laravel-routing laravel-validation


【解决方案1】:

如果您遵循正确的 RESTful 路由技术 - 您可以改用请求类型 - 为任何验证提供通用解决方案

public function rules()
{
    if($request()->isMethod('put'))
    {
         // Update rules here
    }

    return $this->rules;
}

【讨论】:

  • 太棒了!使用 $this->isMethod('patch') 解决了第一个问题 - 关于如何获取 $id 的任何想法? (来自 URL 段以外的其他地方)
  • 认为你可以做$request()->id - 因为它被绑定在路线中?
  • 我刚刚阅读了您上面的评论。因为它是一个资源控制器——它可能是$request()->companiesId$this->companiesId
  • 我已经尝试了以上所有方法并且它们返回 null - 控制器没有将 id 传递给请求?
【解决方案2】:

好的,我已经用谷歌解决了我自己的问题;这里有一个很好的关于这个话题的资源https://laracasts.com/discuss/channels/requests/laravel-5-validation-request-how-to-handle-validation-on-update

以下任何一项都可以(替换上面原始代码中的段 id 行)

  • $id = $this->route()->parameters()["companies"];
  • $id = $this->route()->getParameter('companies');
  • $id = $this->route('companies');
  • $id = $this->公司

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 2016-05-23
    • 2016-03-11
    • 1970-01-01
    • 2018-02-11
    • 2020-12-11
    • 2015-11-07
    • 2020-11-06
    相关资源
    最近更新 更多