commandstring/reactphp-cookies

在React/Http中操作cookie的简单方法

v1.0.1 2023-01-20 21:44 UTC

This package is auto-updated.

Last update: 2024-09-21 01:32:27 UTC


README

使用Composer安装 composer require commandstring/reactphp-cookies

对于示例,$req 是一个实现 PSR-7 ServerRequestInterface 的对象,$res 是一个实现 PSR-7 ResponseInterface 的对象

创建控制器

$cookieController = new CookieController(null);

如果您想加密cookie,可以创建一个实现 CookieEncryptionInterface 的类,或者使用 Cookie Encryption

从控制器创建Cookie对象

您需要事先创建一个实现 PSR-7 Response Interface 的对象

$cookie = $cookieController->cookie($req, $res);

设置cookie

$cookie->set("token", "123456", 1, 15, 13, "/app", "app.domain.com");

这将创建一个名为 token 的cookie,其值为 123456。此cookie将在当前时间后1小时、15分钟和13秒过期。该cookie仅在app路径和app.domain.com网站上有效。

获取cookie

$cookie->get("token");

如果设置了名为token的cookie,则返回其值。如果没有,则返回null。

删除cookie

$cookie->delete("token", "/app", "app.domain.com");

这将删除名为token的cookie,其路径设置为 /app,域设置为 app.domain.com

示例用法

<?php

use CommandString\Cookies\CookieController;
use Psr\Http\Message\ServerRequestInterface;
use React\Http\HttpServer;
use React\Http\Message\Response;
use React\Socket\SocketServer;

require_once "vendor/autoload.php";

$cookies = new CookieController();

$http = new HttpServer(function (ServerRequestInterface $req) use ($cookies) {
    $res = new React\Http\Message\Response;

    $cookie = $cookies->cookie($req, $res);

    $parts = explode("/", $req->getRequestTarget());
    $partsNum = count($parts) - 1;

    $invalidReq = function (string $message) use (&$res): Response
    {
        $res->withStatus(403);
		$res = $res->withHeader('content-type', 'text-plain');
		$res->getBody()->write($message);
    };

    if ($parts[1] === "set") {
        if ($partsNum !== 3) {
            return $invalidReq("Invalid URI, example `/set/id/123456`");
        }

        $cookie->set($parts[2], $parts[3]);
        $res->getBody()->write("Set cookie {$parts[2]} to {$parts[3]}");
    }

    if ($parts[1] === "get") {
        if ($partsNum !== 2) {
            return $invalidReq("Invalid URI, example `/get/id`");
        }

        if ($cookie->exists($parts[2])) {
            $res->getBody()->write("Found cookie {$parts[2]}, it is set to {$cookie->get($parts[2])}");
        } else {
            $res->getBody()->write("Cookie {$parts[2]} does not exist");
        }
    }

    if ($parts[1] === "delete") {
        if ($partsNum !== 2) {
            return $invalidReq("Invalid URI, example `/delete/id`");
        }

        if ($cookie->exists($parts[2])) {
            $cookie->delete($parts[2]);
            $res->getBody()->write("Deleted cookie {$parts[2]}");
        } else {
            $res->getBody()->write("Cooke {$parts[2]} does not exist");
        }
    }
    
    return $res;
});

$socket = new SocketServer('127.0.0.1:8000');
$http->listen($socket);