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