如何根据表单请求为唯一验证 (UPDATE/PATCH) 创建条件

Posted

技术标签:

【中文标题】如何根据表单请求为唯一验证 (UPDATE/PATCH) 创建条件【英文标题】:How To Create Conditional for Unique Validation (UPDATE/PATCH) on Form Request 【发布时间】:2018-06-11 06:19:53 【问题描述】:

我试图通过将“验证请求”移动到名为“BookRequest”的表单请求中来让我的控制器更清洁。

问题出在更新过程中,我尝试创建一个条件来检查,是PATCH还是POST,代码如下

MyRequest.php

public function rules()
    

        // Check Create or Update
        if ($this->method() == 'PATCH') 
        
            $a_rules = 'required|string|size:6|unique:books,column2,' .$this->get('id');
            $b_rules = 'sometimes|string|size:10|unique:books,column3,' .$this->get('id');
        

        else 
        
            $a_rules = 'required|string|size:6|unique:books,column2';
            $b_rules = 'sometimes|string|size:10|unique:books,column3';
        

        return [
            'column1'             => 'required|string|max:100',
            'column2'             => $a_rules,
            'column3'              => $b_rules,
            'column4'    => 'required|date',
            'column5'            => 'required|in:foo,bar',
            'column6'        => 'required',
            'column7'       => 'required',
            'column8'       => 'required',
        ];

    

.$this->get('id') 失败了,表单仍然在更新时处理唯一性。

控制器@更新

public function update($id, BookRequest $request)

    $book = Book::findOrFail($id);
    $input = $request->all();
    $book->update($request->all());
    return view('dashboards.book');

控制器@edit

public function edit($id)


    $book = Book::findOrFail($id);


    return view('dashboards.edit', compact('book'));

Controller@create

public function create()


    return view('dashboards.create');

控制器@存储

public function store(BookRequest $request)



    $input = $request->all();
    $book = Book::create($input);

    return redirect('dashboards/book/index');

我尝试了替代方案.$book->id,但它抛出了一个ErrorException 未定义变量:book

有什么建议吗?顺便说一句,我正在使用 Laravel 5.2

【问题讨论】:

dd($this->get('id')) 给出了什么 @Sohel0415 你的意思是我应该试试dd($this->get('id')) 吗?它给了我一个null 这就是为什么表单仍然在更新时处理唯一性。 向我们展示您的控制器代码,我们可以提供帮助 @Sohel0415 请检查我的控制器 【参考方案1】:

您使用 book 作为路线参数,但尝试使用 id。试试这个-

if ($this->method() == 'PATCH') 
    
        $a_rules = 'required|string|size:6|unique:books,column2,' .$this->route()->parameter('book');
        $b_rules = 'sometimes|string|size:10|unique:books,column3,' .$this->route()->parameter('book');
    

希望对你有帮助:)

【讨论】:

我应该把代码放在哪里?我把它放在if ($this->method() == 'PATCH') 之前,它仍然是一样的 感谢表单在更新时似乎成功,它已保存到数据库中,但是有一个问题,当我提交更新表单时,它会将我重定向到错误页面E:\...testrequest\storage\framework\views\...,但是当我去的时候浏览器/dashboards/book/book 上不同选项卡上的现有页面有什么建议吗? 你的更新功能正常吗,你检查过你的数据库记录了吗?? 我不确定更新功能,但在我将验证移至表单请求之前它运行良好。正如您在控制器上看到的@update 如果你把你的规则方法放在上面,dd($this->method()) 会得到什么

以上是关于如何根据表单请求为唯一验证 (UPDATE/PATCH) 创建条件的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在表单请求上创建唯一验证(UPDATE / PATCH)的条件

表单请求验证中的 Laravel“独特”自定义消息验证

如何根据请求的范围自定义 KeyCloak 身份验证流程

如何根据输入请求规则在 laravel 刀片中显示错误消息

如何根据请求方式设置不同的权限?