会画
由于 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 | /login | SessionsController@create | 显示登录页面 |
POST | /login | SessionsController@store | 创建新会话(登录) |
DELETE | /logout | SessionsController@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 中有特殊含义,借助我们在前面章节中定义的消息提示局部视图,可以使得页面上的消息提示更加美观