【问题标题】:Call to a member function fails() on array调用数组上的成员函数失败()
【发布时间】:2019-09-18 12:04:44
【问题描述】:

我的 laravel 验证有问题。

在数组上调用成员函数失败()

Symfony\Component\Debug\Exception\FatalThrowableError 抛出消息“调用数组上的成员函数失败()”

堆栈跟踪:

`#0 Symfony\Component\Debug\Exception\FatalThrowableError in C:\laragon\www\frontine\app\Http\Controllers\authController.php:37

public function postRegister(Request $request)
{
    $query = $this->validate($request, [
        'user' => 'string|required|unique:users|min:4|max:24',
        'email' => 'email|string|required|unique:users',
        'pass' => 'string|required|min:8',
        'cpass' => 'string|required|min:8|same:pass',
        'avatar' => 'image|mimes:jpeg,jpg,png|max:2048',
    ]);

    if ($query->fails())
    {
        return redirect('/registrar')
            ->withErrors($query)
            ->withInput();
    }
}

【问题讨论】:

  • 不确定这是否是一个错误,但是:注册商可能是一个未命名的路由。
  • 同一条路线
  • 无论$this->validate() 返回一个数组,而不是一个对象。您应该检查文档,我怀疑它可能会返回一组验证错误(如果没有,则返回一个空数组)。
  • 我做了同样的 laravel 文档

标签: php laravel


【解决方案1】:

错误是因为->validate() 方法在应用于Request 类时返回带有验证数据的array。另一方面,您正在使用 ->fails() 方法,该方法用于手动创建验证器。

来自documentation

手动创建验证器

如果您不想在请求上使用validate 方法,您可以 使用Validator 门面手动创建验证器实例。这 门面上的make 方法生成一个新的验证器实例:

use Validator; // <------
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [ // <---
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

        if ($validator->fails()) {
            return redirect('post/create')
                        ->withErrors($validator)
                        ->withInput();
        }

        // Store the blog post...
    }
}

-&gt;fails() 在返回 Validator 实例的 Validator::make([...]) 方法的响应中被调用。当您尝试手动处理错误响应时,此类具有fails() 方法。

另一方面,如果您在$request 对象上使用validate() 方法,则结果将是一个包含已验证数据的数组,以防验证通过,或者它将处理错误并将错误详细信息添加到您的回复将显示在您的视图中,例如:

    public function store(Request $request)
    {
       $validatedData = $request->validate([
            'attribute' => 'your|rules',
        ]);

       // I passed!

     }

Laravel 会自动处理验证错误:

如您所见,我们将所需的验证规则传递给 validate 方法。同样,如果验证失败,正确的响应将 自动生成。如果验证通过,我们的控制器 将继续正常执行。

【讨论】:

  • 不用$validator-&gt;fails()read this
  • @GameO7er 这就是我的意思。正如您在我的回复中所看到的,我告诉他您在manually creating validators 时使用该方法(fails())。对于这些情况,是的,您可以调用该方法以您希望的方式处理响应。希望这会有所帮助。
【解决方案2】:

这个错误告诉你的是,通过执行$query-&gt;fails,你正在调用一个方法fails()(即$query),它不是一个对象,而是一个数组。如documentation 中所述,$this-&gt;validate() 返回一个错误数组。

在我看来,您似乎在代码中混入了validation hooks 上的一些示例代码。


如果验证规则通过,您的代码将继续正常执行; 但是,如果验证失败,则会抛出异常并且 正确的错误响应将自动发送回用户。在 对于传统的 HTTP 请求,重定向响应将是 生成,[...] -Laravel Docs

下面的代码应该可以解决问题。然后,您只需在视图中显示错误。您猜对了,您可以在...the docs 中阅读所有相关信息。

public function postRegister(Request $request)
{
    $query = $request->validate($request, [
        'user' => 'string|required|unique:users|min:4|max:24',
        'email' => 'email|string|required|unique:users',
        'pass' => 'string|required|min:8',
        'cpass' => 'string|required|min:8|same:pass',
        'avatar' => 'image|mimes:jpeg,jpg,png|max:2048',
    ]);
}

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2013-01-26
    • 2021-09-04
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多