前言
Laravel 4中,可以使用Route::filter,而在Laravel 5中,沒有了filter.php文件,官方建議使用中間件做。
下面是用戶登陸的測試例子,涉及到的一些方法和使用,先參見這里:http://www.cnblogs.com/HD/p/4569858.html
這里的例子是基於如上文章后所擴展的。
一、新建一個用戶登陸模型
app\models\Login.php
<?php namespace App\models; use App\models\BaseModel; /** * 用戶登陸模型 * @author Robin * */ class Login extends BaseModel { /** * 用戶名 * @var String */ public $username; /** * 名稱 * @var String */ public $password; /** * 轉換用戶輸入為對象模型 * @param Input $input */ public function convert($input) { //----------------------------------------------------- // 字段驗證 //----------------------------------------------------- $rule = array( "username" => "required|min:4|max:10", "password" => "required|between:3,16", ); //----------------------------------------------------- // 調用父類方法 //----------------------------------------------------- $this->init($input, $rule); } } ?>
二、新建中間件
app\Http\Middleware\CheckLoginMiddleware.php
<?php namespace App\Http\Middleware; use Closure; use Cookie; use Redirect; use Illuminate\Contracts\Routing\Middleware; /** * 檢查用戶登陸中間件 * @author Robin * */ class CheckLoginMiddleware implements Middleware { /** * 構造函數 */ public function __construct() { // TODO } /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // 取得用戶的Cookie $token = Cookie::get("TOKEN"); // 如果有Cookie if(isset($token)) { // 將cookie值轉為json對象數組 $user = json_decode($token); // 往下執行 return $next($request); } else { // 如果取不到用戶的cookie,跳轉到用戶登陸頁面 return Redirect::action("LoginController@getIndex", ["path" => $request->fullUrl()]); } } } ?>
新建的中間建需要繼承Middleware接口。
另外,必需引用Closure,不然會出錯的。
三、路由設置
新加入用戶登陸路由
app\Http\routes.php
//------------------------------------------------------------------ // Controller Group // 加入前綴my2,意思是在里頭的所有路由地址都以my2開頭 // 例如:http://localhost/my/add //------------------------------------------------------------------ Route::group(["prefix" => "my2", "middleware" => 'login'], function() { Route::controller("/", "my\MyTest2Controller"); }); /** * 控制器與路徑設置 */ Route::controllers([ // 用戶登陸 'login' => 'LoginController', ]);
看到這里,在Route::group中加入了middleware。
四、登陸控制器
新建一個登陸控制器
app\Http\Controllers\LoginController.php
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Redirect; use Route; use View; use Input; use Request; use URL; use Session; use Response; use Cookie; use App\models\Login; /** * 用戶登陸控制器 * @author Robin * */ class LoginController extends BaseController { /** * 設置路徑 */ private $path; function __construct() { $this->path = [ "getIndex" => URL::action("LoginController@getIndex"), "postIndex" => URL::action("LoginController@postIndex") ]; } /** * 登陸頁面 */ public function getIndex() { return View::make("login", [ "path" => $this->path ]); } /** * 提交登陸 * @return \Illuminate\Http\RedirectResponse */ public function postIndex() { // new一個登陸頁面的模型 $login = new Login(); // 轉換用戶輸入為用戶登陸模型對象 $login->convert(Input::All()); // 判斷用戶輸入是否合法 if ($login->isValid()) { // 判斷用戶名密碼是否正確 if ($login->username == "admin" && $login->password == "admin") { // 新增一個用戶對象數組,用於輸出到cookie $user = [ "username" => $login->username ]; // cookie輸出 Cookie::queue("TOKEN", json_encode($user), 3600); // 頁面跳轉到另一個頁面 return redirect()->action("my\MyTest2Controller@getIndex"); } else { // 用戶登陸抵賬,返回view return View::make("login", [ "login" => $login, "errorMessage" => "User name or password error.", "path" => $this->path ]); } } else { // 用戶輸入不合法,返回view return View::make("login", [ "login" => $login, "messages" => $login->messages(), "path" => $this->path ]); } } } ?>
五、登陸視圖
新建一個登陸視圖
resources\views\login.blade.php
<?php ?> <font color="red">{{isset($errorMessage) ? $errorMessage : ""}}</font> <form action="{{$path['postIndex']}}" method="post"> UserName:<input name="username" type="text" value="{{isset($login) ? $login->username : ''}}" />{!!isset($messages) ? $messages->first('username', '<span style="color:red;">:message</span>') : ""!!}<br/> Password:<input name="password" type="password" />{!!isset($messages) ? $messages->first('password', '<span style="color:red;">:message</span>') : ""!!}<br/> <input type="submit" value="Login" /> </form>
Cookie加密設置
Laravel自動已經為Cookie做了加密設置,需要修改加密密碼,可以在這里修改:
打開:config\app.php
找到:
'key' => env('APP_KEY', 'SomeRandomString'),
默認密碼為:SomeRandomString,修改為你自己的密碼。密碼長度為:16、24、32個字符。
測試驗證
訪問登陸頁面
登陸成功后可以在chrome查看cookie值
未登陸訪問/my2,會跳轉到登陸頁面
用戶登陸失敗