超薄3框架+饼干

ski*_*zzo 4 php cookies slim

我一直在使用Slim Framework 2但是想要切换到最新的版本3.在阅读升级指南时,我对他们有点沮丧只是说" 已经从核心中删除了cookie "并且指的是图片github repo包含的代码片段根本不适用于Slim.

任何人都可以共享一些工作代码片段,使用Slim 3设置和获取一些虚拟cookie吗?谢谢.

dAm*_*m2K 7

我知道我被要求回答 slim 3 上的 cookie,但由于我在任何地方都找不到如何在 slim 4 上执行此操作,所以我告诉了如何执行此操作,以防对其他人有用。

如果您将 Slim 4 与 slim/psr7 一起使用,您可以从中间件或路由器内部设置 cookie,如下所示:

设置 cookie(在浏览器上放置 cookie):

$cookies = new \Slim\Psr7\Cookies();
$cookies->setDefaults(['hostonly' => true, 'secure' => true, 'httponly' => true, 'samesite' => 'Lax']);
$cookies->set('MyCookieName', ['value' => '', 'samesite' => 'Strict']); // this way I can ovveride the samesite attribute for this cookie only
$response=$response->withHeader('Set-Cookie', $cookies->toHeaders());
unset($cookies);
Run Code Online (Sandbox Code Playgroud)

取消设置 cookie(从浏览器中删除 cookie)

$cookies = new \Slim\Psr7\Cookies();
$cookies->setDefaults(['hostonly' => true, 'secure' => true, 'httponly' => true, 'samesite' => 'Lax']);
$cookies->set('MyCookieName', ['value' => '', 'expires' => 1); // this way I can delete this cookie, setting it already expired the first sec in 1970
$response=$response->withHeader('Set-Cookie', $cookies->toHeaders());
unset($cookies);
Run Code Online (Sandbox Code Playgroud)

获取cookie(获取浏览器发送的cookie)

$cookies = new \Slim\Psr7\Cookies($request->getCookieParams());
echo "cookie value is: " . $cookies->get('MyCookieName');
Run Code Online (Sandbox Code Playgroud)


jen*_*ose 6

如果您不想使用经过测试的PSR-7库FIG Cookies,您可以使用:

namespace Your\App;

use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

class Cookie
{
    /**
     * @param Response $response
     * @param string $key
     * @param string $value
     * @return Response
     */
    public function deleteCookie(Response $response, $key)
    {
        $cookie = urlencode($key).'='.
            urlencode('deleted').'; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; httponly';
        $response = $response->withAddedHeader('Set-Cookie', $cookie);
        return $response;
    }

    /**
     * @param Response $response
     * @param string $cookieName
     * @param string $cookieValue
     * @return Response
     */
    public function addCookie(Response $response, $cookieName, $cookieValue)
    {
        $expirationMinutes = 10;
        $expiry = new \DateTimeImmutable('now + '.$expirationMinutes.'minutes');
        $cookie = urlencode($cookieName).'='.
            urlencode($cookieValue).'; expires='.$expiry->format(\DateTime::COOKIE).'; Max-Age=' .
            $expirationMinutes * 60 . '; path=/; secure; httponly';
        $response = $response->withAddedHeader('Set-Cookie', $cookie);
        return $response;
    }

    /**
     * @param Request $request
     * @param string $cookieName
     * @return string
     */
    public function getCookieValue(Request $request, $cookieName)
    {
        $cookies = $request->getCookieParams();
        return isset($cookies[$cookieName]) ? $cookies[$cookieName] : null;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 好答案.但是,删除cookie时,请使用空文本作为已删除cookie的值.当你试图通过`deleteCookie`删除cookie时,你自己的方法`getCookieValue`将返回null.更一致(至少对我来说). (2认同)

Nor*_*man 5

我遇到了同样的问题,但经过几次尝试后,我想通了!首先你需要使用:

$cookies = Dflydev\FigCookies\Cookies::fromRequest($request);
Run Code Online (Sandbox Code Playgroud)

获取客户端发送的所有cookie。或者:

$cookie = FigRequestCookies::get($request, $cookiename);
Run Code Online (Sandbox Code Playgroud)

获取单个 cookie。但是“奇怪”的部分是如何设置 cookie,所以这里有一个小例子:

function setCookie($response, $name, $value){
    $response = FigResponseCookies::set($response, SetCookie::create($name)
                                                            ->withValue($value)
                                                            ->rememberForever()
                                            );
    return $response;
}
Run Code Online (Sandbox Code Playgroud)

和 :

$response = FigResponseCookies::set($response, SetCookie::create($name)
                                                            ->withValue($value)
                                                            ->rememberForever()
                                            );
Run Code Online (Sandbox Code Playgroud)

您将向请求添加一个新 cookie,此方法返回一个包含新 cookie 的新请求对象。因此,对于所有其他操作,您需要使用新请求而不是旧请求。我希望这将有所帮助。如果你想发布你的代码,我们会尝试调试它。


Ehs*_*shi 5

Slim 3 有 Cookies 类。您不必使用外部库来设置 cookie:

$setcookies = new Slim\Http\Cookies();
$setcookies->set('auth',['value' => $jwt, 'expires' => time() + $expire, 'path' => '/','domain' => 'example.com','httponly' => true,'hostonly' => false,'secure' => true,'samesite' => 'lax']);
$setcookies->set('tracking', "$value");
$response = $response->withHeader('Set-Cookie', $setcookies->toHeaders());
Run Code Online (Sandbox Code Playgroud)

获取 cookie :

$jwt = $request->getCookieParam('auth');
Run Code Online (Sandbox Code Playgroud)