在Laravel 5.2中登录后的postLogin()方法重定向

时间:2016-07-04 16:24:16

标签: php laravel-5.2

我希望我的AuthController检查几个条件并相应地重定向到受尊重的路由。我想检查登录用户的DB是否有特定列不为空。如果它不是空的我将重定向到主页,否则我将重定向到另一条路线。我使用了postLogin方法。这里的问题是它根本不检查条件并直接重定向到家,即使条件失败。我尝试使用未填写数据库中的详细信息的新用户登录,然后将其重定向到主页,同样的情况发生在用DB填写个人详细信息的用户

这是我的AuthController的代码

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Registration & Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users, as well as the
    | authentication of existing users. By default, this controller uses
    | a simple trait to add these behaviors. Why don't you explore it?
    |
    */

    use AuthenticatesAndRegistersUsers, ThrottlesLogins;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    //protected $redirectTo = '/user-prof';


    public function postLogin(Request $request)
    {


        $email = $request->email;
        $user = \Auth::user();

        if(($user->username && $user->phone && $user->bio && $user->dobday && $user->dobmonth && $user->dobyear && $user->firstname 
            && $user->lastname && $user->topics && $user->nationality)!= NULL)
        {
            redirect('home');
        }

        else
        {
            redirect('/user-prof');
        }

        return $this->login($request);
    }

    /**
     * Create a new authentication controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware($this->guestMiddleware(), ['except' => 'logout']);
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
}

我还想知道我是否在postLogin()方法中的IF条件下以正确的方式检查数据库列数据。

2 个答案:

答案 0 :(得分:2)

您可能希望在用户经过身份验证后进行这些检查&#39;您可以在AuthController上定义一个authenticated方法,该方法将在用户通过身份验证后由handleUserWasAuthenticated调用。

或许这样的事情。 (获取用户的属性,只获取我们要检查的属性,使用array_filter删除空值,查看是否存在所有必填字段。)

protected function authenticated($request, $user)
{
    $required = [
        'username', 'phone', 'bio', 'dobday', 'dobmonth', 'dobyear',
        'firstname', 'lastname', 'topics', 'nationality'
    ];

    $userAtts = array_filter(array_only($user->toArray(), $required));

    if (count($userAtts) != count($required)) {
        return redirect('/user-prof');
    }

    return redirect('home');
}

这并没有改变AuthController通过特征已经拥有的任何方法,它只是添加handleUserWasAuthenticated将检查是否存在的方法,如果存在,则会调用它。

Illuminate\Foundation\Auth\AuthenticatesUsers@login -> @handleUserWasAuthenticated

如果您打算“囚禁”&#39;在填写这些字段之前的用户,然后我会使用类似于@Ravi的答案所说的中间件选项,但是必须应用于很多路径。

答案 1 :(得分:0)

不要覆盖Authcontroller中的方法。在postLogin路由上使用after-middleware来检查条件并相应地路由。

https://laravel.com/docs/5.2/middleware

还有另一种方法可以做到这一点;但是,我不建议你这样做。您可以修改RedirectsUsers特征。它是一个Laravel文件,在每个作曲家更新时都会被默认为原文。虽然您可以查看它以了解重定向

https://github.com/laravel/framework/blob/5.1/src/Illuminate/Foundation/Auth/RedirectsUsers.php