会画

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

会话控制器

php artisan make:controller SessionsController

路由配置

下面我们还需要对路由进行配置,添加一些接下来需要用到的路由,新增的路由分别对应会话控制器的三个动作:create, store, destroy
routes/web.php

<?php

.
.
.

Route::get('login', 'SessionsController@create')->name('login');
Route::post('login', 'SessionsController@store')->name('login');
Route::delete('logout', 'SessionsController@destroy')->name('logout');

新增的路由功能如下。
增的路由功能如下。

HTTP 请求URL动作作用
GET/loginSessionsController@create显示登录页面
POST/loginSessionsController@store创建新会话(登录)
DELETE/logoutSessionsController@destroy销毁会话(退出登录)

你也可以使用 Laravel 提供的 route:list 命令来查看已添加的路由。

$ php artisan route:list

app/Http/Controllers/SessionsController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SessionsController extends Controller
{
    public function create()
    {
        return view('sessions.create');
    }

    ```
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()->withInput();
    }
}

}

我们可以看到,在 `store` 动作中的数据验证与之前的有所不同,因为在这里只需要保证用户输入的值不为空且格式正确即可。

## 消息提示和页面重定向
在用户登录失败之后,我们使用以下代码来进行消息提示。

session()->flash('danger', '很抱歉,您的邮箱和密码不匹配');
```
由于 danger 在 Bootstrap 中有特殊含义,借助我们在前面章节中定义的消息提示局部视图,可以使得页面上的消息提示更加美观