我一直在使用Slim Framework 2但是想要切换到最新的版本3.在阅读升级指南时,我对他们有点沮丧只是说" 已经从核心中删除了cookie "并且指的是图片github repo包含的代码片段根本不适用于Slim.
任何人都可以共享一些工作代码片段,使用Slim 3设置和获取一些虚拟cookie吗?谢谢.
我知道我被要求回答 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)
如果您不想使用经过测试的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)
我遇到了同样的问题,但经过几次尝试后,我想通了!首先你需要使用:
$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 的新请求对象。因此,对于所有其他操作,您需要使用新请求而不是旧请求。我希望这将有所帮助。如果你想发布你的代码,我们会尝试调试它。
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)
| 归档时间: |
|
| 查看次数: |
7295 次 |
| 最近记录: |