我对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();
}
}
答案 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()
方法,该方法在手动创建验证器时使用。
手动创建验证器
如果您不想在请求上使用
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将自动处理验证错误:
如您所见,我们将所需的验证规则传递到验证中 方法。同样,如果验证失败,则正确的响应将 自动生成。如果验证通过,我们的控制器 将继续正常执行。