Php 检查RegisterController Laravel中是否存在用户,并重定向回注册页面

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

如何在laravel默认身份验证系统中重定向回。例如在Auth\RegisterController中

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)就在
返回之前$检查用户以检查发生了什么。你得到了什么?