Laravel 5.4表单请求唯一验证:如何访问ID?

时间:2019-02-13 19:12:32

标签: laravel validation laravel-5 request unique

我收到以下表单请求:

<?php

namespace App\Http\Requests;

use App\Sociallink;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class SociallinkRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
          'seq' => 'required|unique:sociallinks,seq,' . $this->id . ',id',
          'social_name' => 'required|unique:sociallinks,social_name,' . $this->id . ',id',
          'cssclass' => 'required',
          'url' => 'nullable|active_url'
        ];
    }

我需要字段seqsocial_name唯一。当我尝试编辑时,此代码不起作用。我发现$this->id中不存在dd($this)。我的网址是:http://prj.test/sociallink/2/edit。这里的许多示例都使用$this->id,但由于似乎不存在变量,因此无法在代码中的任何位置访问该变量。在此示例中,当我将$this->id替换为id之类的物理2时,验证就可以正常进行。但是动态地,如何使用当前行的id进行唯一验证?

1 个答案:

答案 0 :(得分:4)

除非您使用id输入表单,否则它实际上不在$request中(在您的请求代码中为$this中)。您可以通过从控制器返回整个请求来验证这一点:

return request()->all(); 

假设您已将此路线定义为类似的内容:

sociallink/{sociallink}/edit ...

然后在您的请求中可以执行以下操作:

public function rules()
{
    $sociallink = $this->route('sociallink');
    return [
      'seq'         => 'required|unique:sociallinks,seq,' . $sociallink . ',id',
      'social_name' => 'required|unique:sociallinks,social_name,' . $sociallink . ',id',
      'cssclass'    => 'required',
      'url'         => 'nullable|active_url'
    ];
}

Form Request documentation中有一个示例:

  

还要注意上面示例中对route方法的调用。通过此方法,您可以访问在被调用路由上定义的URI参数,例如以下示例中的{comment}参数:

     

Route::post('comment/{comment}');