Session & Cookie

获取 Cookie:

  1. $request->cookie('name');

写入 Cookie:

  1. $response->withCookie($key, $value = '', $expire = 0, $path = '/', $domain = '', $secure = false, $httponly = false);

方法和php原生的 set_cookie 一致。

完整示例:

  1. use Cabal\Core\Http\Server;
  2. use Cabal\Core\Http\Response;
  3. use Cabal\Core\Http\Request;
  4. $route->get('/', function (Server $server, Request $request, $vars = []) {
  5. $response = new Response();
  6. $times = intval($request->cookie('times', 1));
  7. // 要重新赋值,PSR-7要求消息每次被修改都是一个新的对象
  8. $response = $response->withCookie('times', ++$times);
  9. return $response;
  10. });

Session

要使用session的话首先需要添加中间件 Cabal\Core\Http\Middleware\EnableSession,在routes.php 中加入以下代码:

  1. use Cabal\Core\Http\Middleware\EnableSession;
  2. //...
  3. $dispatcher->addMiddleware('enableSession', EnableSession::class);

Session 持久化存储依赖缓存服务,所以还要修改 usr/boot.php,取消 Boot 类中的 use Cabal\Core\Cache\ServerHasCache 注释:

  1. class Boot extends Cabal\Core\Application\Boot
  2. {
  3. //...
  4. use Cabal\Core\Cache\Boot\HasCache;
  5. //...
  6. }

接着需要使用session的路由控制器上使用该中间件,然后你就可以通过 $request->session() 方法获取到和 $_SESSION 一样方便一个变量:

  1. $route->any('/', function (Server $server, Request $request, $vars = []) {
  2. $response = new Response();
  3. $session = $request->session();
  4. if ($request->has('username')) {
  5. // 写入
  6. $session['username'] = $request->input('username');
  7. }
  8. $response->getBody()->write(
  9. isset($session['username']) ? ('已登录: ' . $session['username']) : '未登录'
  10. );
  11. return $response;
  12. })->middleware(['enableSession']);

$request->session() 返回的是一个实现了 \Iterator, \ArrayAccess, \Countable, \JsonSerializableCabal\Core\Session 对象,所以你可以和使用 $_SESSION 一样使用它,也可以作为一个对象使用。

?> enableSession 中间件会在请求结束前将session中的数据持久化。

!> 不建议用 $_SESSION 作为变量名接收 $request->session() 的返回值。