【问题标题】:Laravel 5.4 Form Request unique validation: how to access id?Laravel 5.4 表单请求唯一验证:如何访问 id?
【发布时间】:2023-04-06 16:53:01
【问题描述】:

我有这个表单请求如下:

<?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-&gt;id 不存在于dd($this)。我的网址是:http://prj.test/sociallink/2/edit。这里的许多示例都使用了$this-&gt;id,但我无法在代码中的任何位置访问该变量,因为它似乎不存在。当我在本例中将$this-&gt;id 替换为物理id(如2)时,验证工作正常。但是动态地,我如何使用当前行的id 来做唯一验证?

【问题讨论】:

    标签: laravel validation laravel-5 request unique


    【解决方案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-&gt;route() 本身指向当前路由,而参数 sociallink 在这种情况下是路由参数的名称,而不是路由的名称。因此,$this-&gt;route('sociallink') 返回传递给路由的参数,因此,在后面的代码中,$sociallink-&gt;id 不是必需的,而是分配值的变量的名称,在本例中为 '$sociallink `就够了。因此验证码:'required|unique:sociallinks,seq,' . $sociallink . ',id'.
    猜你喜欢
    • 2023-03-27
    • 2021-03-22
    • 2018-06-26
    • 2016-05-20
    • 2016-09-02
    • 2019-11-11
    • 2016-05-23
    • 2016-03-11
    相关资源
    最近更新 更多