2016-07-04 3 views
1

Я хочу, чтобы мой AuthController проверил несколько условий и перенаправил соответствующие маршруты соответственно. Я хочу проверить, нет ли пустых входных данных в базе данных пользователя. Если он не пуст, я перенаправляюсь на домашнюю страницу, иначе я перенаправляюсь на другой маршрут. Я использовал метод postLogin. проблема здесь заключается в том, что он не проверяет состояние вообще и напрямую перенаправляется на дом, даже если сбой концессии. Я попытался войти в систему с новыми пользователями, чьи данные в БД не заполнены, а затем перенаправил меня на домашнюю страницу, а также с пользователем, у которого есть личные данные, заполненные в БДперенаправление метода postLogin() после входа в Laravel 5.2

вот код моего 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().

+0

Создайте функцию в своей модели, которая проверяет эти атрибуты и вызывает ее в состоянии. –

+0

вы не 'возвращаете эти переадресации, вы просто создаете ответ перенаправления и ничего не делаете с ним. Хотя я действительно не знаю, почему ваш маршрут postLogin пытается найти пользователя в настоящий момент, и на данный момент его не должно быть. Я чувствую, что это то, что вам нужно проверить вместо аутентификации, которая вызывается после успешной проверки подлинности с помощью 'handleUserWasAuthenticated' – lagbox

ответ

0

Не переопределяйте метод в Authcontroller. Используйте post-middleware на пути postLogin, чтобы проверить условия и маршрут соответственно.

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

Существует еще один способ сделать это; однако я бы не предложил вам это сделать. Вы можете изменить свойство RedirectsUsers. Это файл Laravel и по умолчанию будет возвращен к оригиналу при каждом обновлении композитора. Хотя вы можете взглянуть на нее, чтобы понять Перенаправление

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

+0

, это прекрасно, чтобы переопределить эти методы. элемент управления находится в вашем прикладном пространстве, и вы можете заставить его работать, как пожелаете. – lagbox

+0

Конечно. Я был просто слишком нетерпелив, чтобы прочитать весь код в вопросе и ответить на все, что появилось у меня в голове. Я нахожу ваш ответ образовательным. +1 – Ravi

2

Вы, наверное, имели в виду, чтобы сделать эти проверки после того, как пользователь был «подлинности» и входа в систему. Вы можете определить authenticated метод на вашем AuthController что будет вызван 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\[email protected] -> @handleUserWasAuthenticated

Если вы собираетесь на «арретирование» пользователе, пока эти поля не заполнены, то я бы с опцией промежуточного слоя аналогична тому, что @ ответ Рави говорят, но должен быть применен к много маршрутов.

Смежные вопросы