laravel 5.5入门系列——7

向laravel 5进军——7

    • 会话

    • 实现登陆以及退出功能

    • 延长session时长

    • 向laravel 5进军7

会话

由于Http协议是一个无状态的协议,因此为在不同页面保持用户的登陆状态,我们需要借助会话在浏览器中临时存储用户的身份信息,保证用户在不同页面具有相同的登录状态。


实现登陆以及退出功能

首先创建会话控制器,然后添加路由

php artisan make:controller SessionController1
Route::get('login','SessionsController@login')->name('login');Route::post('login', 'SessionsController@store')->name('login');Route::delete('logout', 'SessionsController@destroy')->name('logout');123

其中GET方法的login返回登陆页面,POST方法的login提交登陆信息,DELETE方法的logout退出登录. 
补充一条开发环境中检测已经配置好的路由的命令php artisan route:list 
现在应反回以下信息

+--------+-----------+-------------------+---------------+-------------------------------------------------+--------------+
| Domain | Method    | URI               | Name          | Action                                          | Middleware   |
+--------+-----------+-------------------+---------------+-------------------------------------------------+--------------+
|        | GET|HEAD  | /                 |               | App\Http\Controllers\HomePageController@home    | web          |
|        | GET|HEAD  | api/user          |               | Closure                                         | api,auth:api |
|        | GET|HEAD  | login             | login         | App\Http\Controllers\SessionsController@login   | web          |
|        | POST      | login             | login         | App\Http\Controllers\SessionsController@store   | web          |
|        | DELETE    | logout            | logout        | App\Http\Controllers\SessionsController@destroy | web          |
|        | GET|HEAD  | signup            | signup        | App\Http\Controllers\UserController@signup      | web          |
|        | GET|HEAD  | users             | users.index   | App\Http\Controllers\UserController@index       | web          |
|        | POST      | users             | users.store   | App\Http\Controllers\UserController@store       | web          |
|        | GET|HEAD  | users/create      | users.create  | App\Http\Controllers\UserController@create      | web          |
|        | GET|HEAD  | users/{user}      | users.show    | App\Http\Controllers\UserController@show        | web          |
|        | PUT|PATCH | users/{user}      | users.update  | App\Http\Controllers\UserController@update      | web          |
|        | DELETE    | users/{user}      | users.destroy | App\Http\Controllers\UserController@destroy     | web          |
|        | GET|HEAD  | users/{user}/edit | users.edit    | App\Http\Controllers\UserController@edit        | web          |
+--------+-----------+-------------------+---------------+-------------------------------------------------+--------------+123456789101112131415161718

写好路由后写会话控制器的方法: 
create方法直接返回登陆的界面,store方法要验证是否符合数据库中的数据,delete方法要退出登录的状态.借助 Laravel 提供的 Authattempt方法可以让我们很方便的完成用户的身份认证操作,使用方法:

if (Auth::attempt(['email' => $email, 'password' => $password])) {    // 该用户存在于数据库,且邮箱和密码相符合}123

会话在创建的同时,也会种下一个名为 laravel_session 的 HTTP Cookie,以此 Cookie 来记录用户登录状态,最终返回 true;如果匹配后两个值不一致,则返回 false;如果用户未找到,也返回 false。引用Auth前记得对其引用.

<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use Auth;class SessionsController extends Controller{
    public function login()
    {
        return view('login');
    }     public function store(Request $request)
    {
       $credentials = $this->validate($request, [           'email' => 'required|email|max:255',           'password' => 'required'
       ]);       if (Auth::attempt($credentials)) {
           session()->flash('success', '欢迎回来!');           return redirect()->route('users.show', [Auth::user()]);
       } else {
           session()->flash('danger', '很抱歉,您的邮箱和密码不匹配');           return redirect()->back();
       }
    }    public function destroy(){
           Auth::logout();
           session()->flash('success','退出成功!');           return redirect('login');
    }
}12345678910111213141516171819202122232425262728293031323334353637

使用 session() 方法来访问会话实例。而当我们想存入一条缓存的数据,让它只在下一次的请求内有效时,则可以使用 flash 方法。flash 方法接收两个参数,第一个为会话的键,第二个为会话的值,我们可以通过下面这行代码的为会话赋值。redirect()->back();即返回了原页面.session()调用内容可以写成: 
session()->get('success');此时会返回 欢迎回来! 
值得注意的是,登陆的users.show路由是需要传参的,这里用到了Auth的Auth::user()方法,很方便.


延长session时长

如果用户登录后没有使用『记住我』功能,则登录状态默认只会被记住两个小时。如果使用了『记住我』功能,则登录状态会被延长到五年。使用 Laravel 提供的『记住我』功能来保存一个记忆令牌,用于长时间记录用户登录的状态。而 Laravel 已默认为用户生成的迁移文件中已经包含了 remember_token 字段,该字段将用于保存『记住我』令牌。

只需要将Attempt方法传入第二个参数,即可开启记住我的功能.

if (Auth::attempt($credentials, $request->has('remember'))) {
           session()->flash('success', '欢迎回来!');           return redirect()->route('users.show', [Auth::user()]);
       } else {
           session()->flash('danger', '很抱歉,您的邮箱和密码不匹配');           return redirect()->back();
       }1234567

这里需要配合前端的视图中表单添加一项remember的选项:

<div class="checkbox">
    <label><input type="checkbox" name="remember"> 记住我</label></div>