Php 检查RegisterController Laravel中是否存在用户,并重定向回注册页面
如何在laravel默认身份验证系统中重定向回。例如在Auth\RegisterController中Php 检查RegisterController Laravel中是否存在用户,并重定向回注册页面,php,laravel,Php,Laravel,如何在laravel默认身份验证系统中重定向回。例如在Auth\RegisterController中 protected function validator(array $data) { return Validator::make($data, [ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|u
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'contact_no' => 'required|unique:users',
'password' => 'required|string|min:6|confirmed',
]);
}
protected function create(array $data)
{
$email = $data['email'];
$token = $data['token'];
$checkUser = Invitation::where('email', $email)
->where('token', $token)
->first();
if (!$checkUser) {
return redirect()->back()->with('error', 'Credentials not matched !');
}
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'contact_no' => $data['contact_no'],
'password' => bcrypt($data['password']),
]);
在创建用户之前,我想使用来自另一个表的令牌检查该用户是否存在。我使用查询检查用户,如果在创建方法之前使用该方法
if (!$checkUser) {
return redirect()->back()->with('error', 'Credentials not matched !');
}
它抛出了一个错误
Type error: Argument 1 passed to Illuminate\Auth\SessionGuard::login() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of Illuminate\Http\RedirectResponse given,
if条件内的重定向出现问题。if i dd('error')in if在检查用户返回null时显示错误使用isset检查用户是否存在
if (!isset($checkUser)) {
return redirect()->back()->with('error', 'Credentials not matched !');
}
最后,我建议使用更流畅的flash消息。所以你的代码应该是这样的
flash()->error('Credentials not matched.');
return redirect()->back();
总结我的建议:
if (!isset($checkUser)) {
flash()->error('Credentials not matched.');
return redirect()->back();
}
您可以在
注册表控制器的验证程序方法中添加逻辑,如下所示:
protected function validator(array $data)
{
\Validator::extend('has_invitation', function($attribute, $value, $parameters) use($data){
$checkUser = Invitation::where('email', $data['email'])
->where('token', $value)
->first();
return !$checkUser;
}, "Credentials not matched !");
return Validator::make($data, [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
'token' => 'required|has_invitation'
]);
}
如果验证中出现错误,laravel将自动重定向到注册页面。在RegisterController的受保护函数create(array$data)中更改If条件
if (!$checkUser) {
return null;
}
public function register(Request $request)
{
$this->validator($request->all())->validate();
$user = $this->create($request->all());
if(!$user) return redirect()->back()->with('error','Credentials Not Matched! ');
event(new Registered($user));
$this->guard()->login($user);
return $this->registered($request, $user)
?: redirect($this->redirectPath());
}
并覆盖RegisterController中trait RegisterUsers的register方法
if (!$checkUser) {
return null;
}
public function register(Request $request)
{
$this->validator($request->all())->validate();
$user = $this->create($request->all());
if(!$user) return redirect()->back()->with('error','Credentials Not Matched! ');
event(new Registered($user));
$this->guard()->login($user);
return $this->registered($request, $user)
?: redirect($this->redirectPath());
}
我们需要查看完整的控制器代码。身份验证控制器将自动为您执行此操作。它不会用相同的电子邮件地址注册两个用户。为什么不直接使用<代码>'email'=>'必需| email |唯一:用户'
?我使用了validator.,但这里有一个不同的场景。我编辑我的代码,如上所述。您可能没有从您发布的代码中获得此错误。使用重定向发布,而不是查询检查。您得到了什么?如果邀请表中没有用户,则该代码不起作用,并且用户已注册。您可以添加dd($checkUser)代码>就在返回之前$检查用户代码>以检查发生了什么。你得到了什么?