【问题标题】:Lumen FatalThrowableError on validation验证时流明 FatalThrowableError
【发布时间】:2016-12-11 14:48:14
【问题描述】:

我已经为此苦苦挣扎了一段时间。 这是我得到的代码。

public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|max:100'
    ]);
    if ($validator->fails()) {
        //do something
    }
}

问题是我收到了 FatalThrowableError 并显示以下消息:

调用数组上的成员函数parameter()

我找不到我做错了什么。我很感激这里的一些帮助。 而且,我之前做过这个验证:

    $this->validate($request, [
        'name' => 'required|unique:developers|max:100'
    ]);

但是这个问题是,当验证失败时,我不知道如何捕捉。以这种方式使用时是否可以捕获验证失败?

使用版本:“laravel/lumen-framework”:“5.2.*”

【问题讨论】:

  • 你使用的是什么版本的 Lumen?
  • "laravel/lumen-framework": "5.2.*"
  • 我下面的答案是 5.2

标签: php validation fatal-error lumen


【解决方案1】:

FatalThrowableError 异常是低级异常,通常由 symfony 调试 ErrorHandler 抛出。在 lumen 中,队列工作者、PhpEngine、控制台内核和路由管道也使用它。

确保以下几点

  1. 您已将.env.example 复制到.env
  2. 如果您使用的是 Facades,请确保您在 bootstrap/app.php 中通过取消注释该行来启用它。

$app->withFacades();

在 Lumen 5.2.8 中,以下任何一种都可以工作。

以下内容实际上将返回带有错误的有效 JSON 对象。您没有详细说明您的用例为什么这还不够。像这样使用validate 调用的好处在于它实际上返回了一个422 http 状态代码,这意味着一个未处理的实体。

$app->get('/', function (Request $request) {
    $this->validate($request, [
        'name' => 'required'
    ]);
});

使用外观也可以,尽管它返回一个200 状态码。

$app->get('/', function (Request $request) {        
    $validator = Validator::make($request->only(['name']), [
        'name' => 'required'
    ]);

    if ($validator->fails()) {
        return ['error' => 'Something went wrong'];
    }
});

如果您仍然没有正确使用Validator::make,您可以使用捕获默认验证异常。感觉有点hacky。

$app->get('/', function (Request $request) {
    try {
        $this->validate($request, [
            'name' => 'required'
        ]);
    } catch (\Illuminate\Validation\ValidationException $e) {
        // do whatever else you need todo for your use case
        return ['error' => 'We caught the exception'];
    }
});

【讨论】:

  • .env 文件和外墙已经到位,没有问题。然后我用 $validator->fails() 尝试了你的第二个例子。我注意到的一件事是它与我的完全相同,但有一个区别,那就是你只需要 1 个请求变量。所以我得到了 $request->all() 的错误。我真的很想知道为什么不能这样做?还有一个问题,在您的示例中,验证是在路由中,我的控制器中有我的,这是一个问题吗?
  • 这很奇怪, $request->all() 和 $request->only(['name', 'surname']) 都会返回数组。但是, $request->all() 使用 array_replace_recursive 并将输入与上传的文件结合起来。那么将验证移到控制器上就没有区别了,它会使用相同的 Request 对象。
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2016-07-31
  • 2019-05-22
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多