2015-04-18 60 views
-1

我對Laravel相當陌生,我正在製作一個小測試應用程序。 但現在我被困在以下問題。laravel強制用戶添加額外的用戶信息

在用戶登錄到應用程序後,我希望他/她看到一個表單,他/她必須填寫更多關於他/她自己的信息才能繼續。

我的問題是,我不知道在哪裏把這個代碼,我試着把它放在Controller.php,但它似乎並沒有工作(它確實只在主頁但不是在配置文件頁面),我也試圖把它放在AppServiceProvider.php中,因爲我的主菜單總是從數據庫中收集一些數據,但這似乎也沒有工作。

有沒有人有一個想法在哪裏放置下面的代碼?

if (\Request::path() !== 'info' && (\Auth::User()->firstname === NULL || \Auth::User()->lastname === NULL) 
{ 
    return \Redirect::to('info'); 
} 

該信息頁面將是用戶將看到附加信息表單的頁面。

+0

用戶此時是否可以跳過此步驟,還是必須填寫表單才能使用該應用程序? – lukasgeiter

+0

@lukasgeiter在訪問任何其他頁面之前,他需要填寫它,但只有在用戶有賬戶時才需要填寫。否則,他可以看到頁面 – Szenis

回答

1

我認爲你應該爲此創建一個middleware

首先運行php artisan make:middleware AccountInfoMiddleware來創建所需的文件。

然後打開app/Http/Middleware/AccountInfoMiddleware.php和你的代碼添加到handle()方法:

public function handle($request, Closure $next) 
{ 
    $user = \Auth::user(); 
    if($request->path() !== 'info' && $user && ($user->firstname === NULL || $user->lastname === NULL) 
    { 
     return redirect('info'); 
    } 
    return $next($request); 
} 

之後,你有不同的方式來使用你的中間件:

  1. 添加App\Http\Middleware\AccountInfoMiddleware$middleware陣列app/Http/Kernel.php。這意味着中間件將運行每個請求
  2. 將名稱與$routeMiddleware相同的東西添加到Kernel.php中,並將其用於特定路線或從控制器啓用它。欲瞭解更多信息,請訪問Laravel documentation
1

如果你的意思是你想重定向用戶,如果用戶沒有名字和姓氏,你可以使用中間件來解決你的問題。將您的代碼放在中間件文件中。

創建中間件文件

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Contracts\Routing\Middleware; 

class UserMiddleware implements Middleware { 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (\Request::path() !== 'info' && (\Auth::User()->firstname === NULL || \Auth::User()->lastname === NULL) 
     { 
      return \Redirect::to('info'); 
     } 

     return $next($request); 
    } 
} 

註冊中間件路線在app/HTTP/Kernel.php

/** 
* The application's global HTTP middleware stack. 
* 
* @var array 
*/ 
/** 
* The application's route middleware. 
* 
* @var array 
*/ 
protected $routeMiddleware = [ 
    'auth' => 'App\Http\Middleware\Authenticate', 
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth', 
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated', 
    'user' => 'App\Http\Middleware\UserMiddleware' // Register this new middleware 
]; 

使用中間件的路線,你想

Route::get('/', [ 
    'middleware' => 'user', 
    'uses' => '[email protected]' 
]); 

爲路由添加中間件後,將會運行中間件文件中的每個請求,handle()函數以檢查用戶是否有姓或名。如果用戶沒有,它將重定向到信息,如果用戶擁有所有的信息,它將處理下一個請求。

+0

只有解釋說明我不想爲每個路由都這樣做,所以我把代碼放在$ middleware中而不是$ routeMiddleware – Szenis

+0

No..you必須放$ routeMiddleware.Dont放在$ middleware中,因爲它會按照每個非常的要求運行。如果你放入$ routeMiddleware,中間件將運行在你指定的路由上。示例Route :: get('/ login',['middleware'=>'user','uses'=>'ExampleController @ index']);.中間件只能在此路由上運行「/ login」。 – Faiz