退出会话的原理也非常简单,我们在前面检验是否登录都是通过 Session
来判断,现在只需要删除对应的 Session
就大功告成了.
首先修改前端,添加一个退出的按钮
resources\views\_layout\header.blade.php
:
~
<a class="btn btn-outline-success my-2 my-sm-0"
href="{{ url('user/auth/read', ['id' => session('user.id')]) }}">
{{ session('user.name') }}
</a>
~
@if(session('user'))
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle"
type="button"
id="dropdownMenuButton"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false">
{{ session('user.name') }}
</button>
<div class="dropdown-menu"
aria-labelledby="dropdownMenuButton">
<a class="dropdown-item"
href="{{ url('user/auth/read', ['id' => session('user.id')]) }}">个人主页</a>
<a class="dropdown-item">
<form action="{{ url('user/session/delete', ['id' => session('user.id')]) }}"
method="POST">
<input type="hidden"
name="__token__"
value="{{ $token }}" />
<button class="btn btn-block"
type="submit"
name="button">退出</button>
</form>
</a>
</div>
</div>
@else
<a class="btn btn-outline-success my-2 my-sm-0"
href="{{ url('user/auth/create') }}">注册</a>
<a class="btn btn-outline-success my-2 my-sm-0"
href="{{ url('user/session/create') }}">登录</a>
@endif
此时再刷新页面,会提示 token
未定义,我们需要为 read
方法添加 token
application\user\controller\Auth.php
:
public function read($id)
{
if (Session::has('user')) {
$user = User::find($id);
$token = $this->request->token('__token__', 'sha1');
$this->assign([
'user' => $user,
'token' => $token
]);
return $this->fetch();
} else {
return redirect('user/session/create')->with('validate','请先登录');
}
}
现在再次刷新前端页面,可以正常输出了.
在前端的 退出
按钮里,我们创建了一个 DELETE
方法的表单,现在需要实现退出功能.
application\user\controller\Session.php
:
public function delete($id)
{
if (SessionFacade::has('user') && $id === SessionFacade::get('user.id')) {
SessionFacade::delete('user');
return redirect('user/session/create')->with('validate','您已退出');
} else {
return '非法请求';
}
}
删除 Session
并重定向到登录页面,退出功能已经完成.