You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Lumen使用第三方FormRequest库提交合法数据触发方法不存在异常

Lumen 中使用 Pearl\RequestValidate 库时 validated() 方法不存在的问题解决

问题场景

你在Lumen应用里用Pearl\RequestValidate库实现FormRequest功能,已经按文档完成了安装配置,但遇到了奇怪的问题:提交非法数据时Postman能正常返回验证错误,可提交合法数据时却抛出BadMethodCallException,提示App\Http\Requests\CommentFormRequest::validated方法不存在。

你的验证类代码:

<?php
namespace App\Http\Requests;
use Pearl\RequestValidate\RequestAbstract;
use Illuminate\Validation\Rule;
use Illuminate\Http\Response;
class CommentFormRequest extends RequestAbstract {
    /**
     * 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 [
            'name' => 'required',
            'title' => 'required|max:255',
            'body' => 'required',
        ];
    }
    /**
     * Get custom messages for validator errors.
     *
     * @return array
     */
    public function messages() {
        return [
            //
        ];
    }
}

控制器代码:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests\CommentFormRequest;
class CommentController extends Controller {
    public function add(CommentFormRequest $request) {
        $request->validated();
        return response()->json(['Success']);
    }
}

问题原因

这个问题其实很好理解:Laravel原生的FormRequest类自带validated()方法,但Pearl\RequestValidate库提供的RequestAbstract基类并没有实现这个方法。非法数据能正常返回错误,是因为验证逻辑在请求注入控制器之前就执行了;而合法数据通过验证后,你调用了一个不存在的方法,自然就抛出了异常。

解决方案

这里有几个可行的解决办法,你可以选最适合自己的:

方法1:使用库自带的替代方法

Pearl\RequestValidate库其实提供了获取验证后数据的方法,叫getValidated(),直接把控制器里的代码替换成下面这样就行:

public function add(CommentFormRequest $request) {
    $validatedData = $request->getValidated();
    // 后续用$validatedData处理业务逻辑
    return response()->json(['Success']);
}

方法2:给自定义Request类添加validated()方法

如果你习惯Laravel的validated()写法,也可以在自己的CommentFormRequest里手动实现这个方法,让它调用库的getValidated()

// 在CommentFormRequest类里添加这个方法
public function validated()
{
    return $this->getValidated();
}

这样你控制器里的$request->validated()就能正常工作了。

方法3:直接获取全部请求数据(简单但不推荐)

因为请求已经通过了验证,所以也可以直接用$request->all()获取所有数据,但这种方法不如前两种严谨——毕竟getValidated()只会返回你在rules里定义过的字段,而all()会返回所有请求参数。如果你的业务不需要过滤字段,也可以这么用:

public function add(CommentFormRequest $request) {
    $data = $request->all();
    return response()->json(['Success']);
}

内容的提问来源于stack exchange,提问作者Mahesh.D

火山引擎 最新活动