在数组上调用成员函数failure()

时间:2019-04-29 20:42:26

标签: php laravel

我对laravel验证有疑问。

  

在数组上调用成员函数fail()

     

Symfony \ Component \ Debug \ Exception \ FatalThrowableError与消息“在数组上调用成员函数fails()”一起引发

     

Stacktrace:

     

`#0 Symfony \ Component \ Debug \ Exception \ FatalThrowableError在   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();
    }
}

2 个答案:

答案 0 :(得分:0)

此错误告诉您的是,通过执行$query->fails,您将在不是对象而是数组的某事物(即fails())上调用方法$query。如documentation $this->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',
    ]);
}

答案 1 :(得分:0)

该错误是因为在应用于->validate()类时,array方法返回的Request带有已验证的数据。另一方面,您正在使用->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...
    }
}

->fails()方法的响应中调用Validator::make([...]),该方法返回一个Validator实例。尝试手动处理错误响应时,此类具有fails()方法。

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

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

       // I passed!

     }

Laravel将自动处理验证错误:

  

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