Laravel 5.4 表单请求唯一验证:如何访问 id?
Posted
技术标签:
【中文标题】Laravel 5.4 表单请求唯一验证:如何访问 id?【英文标题】:Laravel 5.4 Form Request unique validation: how to access id? 【发布时间】:2019-07-07 17:33:46 【问题描述】:我有这个表单请求如下:
<?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
来做唯一验证?
【问题讨论】:
【参考方案1】:除非您有带有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');
【讨论】:
很棒的答案!你刚刚度过了我的情人节!但是请注意,$this->route()
本身指向当前路由,而参数 sociallink
在这种情况下是路由参数的名称,而不是路由的名称。因此,$this->route('sociallink')
返回传递给路由的参数,因此,在后面的代码中,$sociallink->id
不是必需的,而是分配值的变量的名称,在本例中为 '$sociallink `就够了。因此验证码:'required|unique:sociallinks,seq,' . $sociallink . ',id'
.以上是关于Laravel 5.4 表单请求唯一验证:如何访问 id?的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 laravel 表单请求更新数据时验证电子邮件的唯一性?