Una cookie HTTP (cookie web, cookie de navegador) es un pequeño fragmento de datos que un servidor
envía al navegador web del usuario. El navegador puede almacenarlo y enviarlo de vuelta más tarde.
solicitudes al mismo servidor. Normalmente, se utiliza para saber si dos solicitudes provienen de
el mismo navegador, manteniendo a un usuario conectado, por ejemplo.
Recuerda información con estado para el protocolo HTTP sin estado.
Las cookies se utilizan principalmente con tres finalidades:
Gestión de sesiones: inicios de sesión, carritos de compras, puntuaciones de juegos o cualquier otra cosa que el servidor deba recordar
Personalización: preferencias de usuario, temas y otras configuraciones
Seguimiento: Registrar y analizar el comportamiento del usuario
Para ayudarle a enviar cookies de manera eficiente a los navegadores,
Higgs proporciona la clase Higgs\Cookie\Cookie para abstraer el
interacción de cookies.
Actualmente existen cuatro (4) formas de crear un nuevo objeto de valor Cookie.
<?phpuseHiggs\Cookie\Cookie;useDateTime;// Using the constructor$cookie=newCookie('remember_token','f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',['expires'=>newDateTime('+2 hours'),'prefix'=>'__Secure-','path'=>'/','domain'=>'','secure'=>true,'httponly'=>true,'raw'=>false,'samesite'=>Cookie::SAMESITE_LAX,]);// Supplying a Set-Cookie header string$cookie=Cookie::fromHeaderString('remember_token=f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6; Path=/; Secure; HttpOnly; SameSite=Lax',false,// raw);// Using the fluent builder interface$cookie=(newCookie('remember_token'))->withValue('f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6')->withPrefix('__Secure-')->withExpires(newDateTime('+2 hours'))->withPath('/')->withDomain('')->withSecure(true)->withHTTPOnly(true)->withSameSite(Cookie::SAMESITE_LAX);// Using the global function `cookie` which implicitly calls `new Cookie()`$cookie=cookie('remember_token','f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6');
Al construir el objeto Cookie, solo se requiere el atributo nombre. Todo lo demás es opcional.
Si los atributos opcionales no se modifican, sus valores se completarán con los valores predeterminados guardados en
la clase Cookie.
Para anular los valores predeterminados actualmente almacenados en la clase, puede pasar una Config\Cookie
instancia o una matriz de valores predeterminados al método estático Cookie::setDefaults().
<?phpuseHiggs\Cookie\Cookie;useConfig\CookieasCookieConfig;// pass in a Config\Cookie instance before constructing a Cookie classCookie::setDefaults(newCookieConfig());$cookie=newCookie('login_token');// pass in an array of defaults$myDefaults=['expires'=>0,'samesite'=>Cookie::SAMESITE_STRICT,];Cookie::setDefaults($myDefaults);$cookie=newCookie('login_token');
Pasar la instancia Config\Cookie o una matriz a Cookie::setDefaults() efectivamente
sobrescribirá sus valores predeterminados y persistirá hasta que se pasen nuevos valores predeterminados.
Cambiar los valores predeterminados por un tiempo limitado
Si no quieres esto
comportamiento pero solo desea cambiar los valores predeterminados por un tiempo limitado, puede aprovechar
Cookie::setDefaults() devuelve la matriz de valores predeterminados anterior.
<?phpuseHiggs\Cookie\Cookie;useConfig\CookieasCookieConfig;$oldDefaults=Cookie::setDefaults(newCookieConfig());$cookie=newCookie('my_token','muffins');// return the old defaultsCookie::setDefaults($oldDefaults);
Una vez creada una instancia, puede acceder fácilmente al atributo de una Cookie utilizando uno de sus métodos de obtención.
<?phpuseHiggs\Cookie\Cookie;useDateTime;useDateTimeZone;$cookie=newCookie('remember_token','f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',['expires'=>newDateTime('2025-02-14 00:00:00',newDateTimeZone('UTC')),'prefix'=>'__Secure-','path'=>'/','domain'=>'','secure'=>true,'httponly'=>true,'raw'=>false,'samesite'=>Cookie::SAMESITE_LAX,]);$cookie->getName();// 'remember_token'$cookie->getPrefix();// '__Secure-'$cookie->getPrefixedName();// '__Secure-remember_token'$cookie->getExpiresTimestamp();// UNIX timestamp$cookie->getExpiresString();// 'Fri, 14-Feb-2025 00:00:00 GMT'$cookie->isExpired();// false$cookie->getMaxAge();// the difference from time() to expires$cookie->isRaw();// false$cookie->isSecure();// true$cookie->getPath();// '/'$cookie->getDomain();// ''$cookie->isHTTPOnly();// true$cookie->getSameSite();// 'Lax'// additional getter$cookie->getId();// '__Secure-remember_token;;/'// when using `setcookie()`'s alternative signature on PHP 7.3+// you can easily use the `getOptions()` method to supply the// $options parameter$cookie->getOptions();
Una nueva instancia de Cookie es una representación de objeto de valor inmutable de una cookie HTTP. siendo inmutable,
modificar cualquiera de los atributos de la instancia no afectará la instancia original. La modificación siempre
devuelve una nueva instancia. Debe conservar esta nueva instancia para poder utilizarla.
Una cookie HTTP está regulada por varias especificaciones que deben seguirse para poder ser
aceptado por los navegadores. Así, al crear o modificar determinados atributos de la Cookie,
estos se validan para comprobar si siguen las especificaciones.
Se genera una CookieException si se informan infracciones.
El nombre de una cookie puede ser cualquier carácter US-ASCII, excepto lo siguiente:
controlar personajes;
espacios o pestañas;
caracteres separadores, como ()<>@,;:\"/[]?={}
Si se establece el parámetro $raw en true, esta validación se realizará estrictamente. Esto es porque
setcookie() de PHP<https://www.php.net/manual/en/function.setcookie.php> _
y setrawcookie()<https://www.php.net/manual/en/function.setrawcookie.php> _
rechazará las cookies con nombres no válidos. Además, galleta
Los nombres no pueden ser una cadena vacía.
Cuando se utiliza el prefijo __Secure-, las cookies deben configurarse con el indicador $secure establecido en true. Si
Al utilizar el prefijo __Host-, las cookies deben presentar lo siguiente:
El atributo SameSite sólo acepta tres (3) valores:
Lax: las cookies no se envían en subsolicitudes normales entre sitios (por ejemplo, para cargar imágenes o marcos en un sitio de terceros), pero se envían cuando un usuario navega al sitio de origen (es decir cuando sigue un enlace).
Estricto: las cookies solo se enviarán en un contexto propio y no junto con solicitudes iniciadas por sitios web de terceros.
Ninguno: Las cookies se enviarán en todos los contextos, es decir en respuestas a solicitudes tanto propias como de origen cruzado.
Higgs, sin embargo, le permite establecer el atributo SameSite en una cadena vacía. Cuando una cadena vacía es
proporcionada, se utiliza la configuración predeterminada de SameSite guardada en la clase Cookie. Puedes cambiar el SameSite predeterminado
utilizando Cookie::setDefaults() como se explicó anteriormente.
Las especificaciones de cookies recientes han cambiado de modo que los navegadores modernos deben proporcionar un SameSite predeterminado
si no se proporcionó nada. Este valor predeterminado es Lax. Si ha configurado SameSite para que sea una cadena vacía y su
El SameSite predeterminado también es una cadena vacía, su cookie recibirá el valor Lax.
Si SameSite está configurado en Ninguno, debe asegurarse de que Secure también esté configurado en true.
Al escribir el atributo SameSite, la clase Cookie acepta cualquiera de los valores sin distinguir entre mayúsculas y minúsculas. Puede
También aproveche las constantes de la clase para que no sea una molestia.
<?phpuseHiggs\Cookie\Cookie;useConfig\Services;$response=Services::response();$cookie=newCookie('remember_token','f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',['max-age'=>3600*2,// Expires in 2 hours]);$response->setCookie($cookie);
También puedes usar la función auxiliar set_cookie():
<?phpuseHiggs\Cookie\Cookie;helper('cookie');$cookie=newCookie('remember_token','f699c7fd18a8e082d0228932f3acd40e1ef5ef92efcedda32842a211d62f0aa6',['max-age'=>3600*2,// Expires in 2 hours]);set_cookie($cookie);
Higgs proporciona otras tres (3) formas de crear una nueva instancia de CookieStore.
<?phpuseHiggs\Cookie\Cookie;useHiggs\Cookie\CookieStore;// Passing an array of `Cookie` objects in the constructor$store=newCookieStore([newCookie('login_token'),newCookie('remember_token'),]);// Passing an array of `Set-Cookie` header strings$store=CookieStore::fromCookieHeaders(['remember_token=me; Path=/; SameSite=Lax','login_token=admin; Path=/; SameSite=Lax',]);// using the global `cookies` function$store=cookies([newCookie('login_token')],false);// retrieving the `CookieStore` instance saved in our current `Response` object$store=cookies();
Nota
When using the global cookies() function, the passed Cookie array will only be considered
si el segundo argumento, $getGlobal, está establecido en false.
Para comprobar si existe un objeto Cookie en la instancia CookieStore, puede utilizar varias formas:
<?phpuseHiggs\Cookie\Cookie;useHiggs\Cookie\CookieStore;useConfig\Services;// check if cookie is in the current cookie collection$store=newCookieStore([newCookie('login_token'),newCookie('remember_token'),]);$store->has('login_token');// check if cookie is in the current Response's cookie collectioncookies()->has('login_token');Services::response()->hasCookie('remember_token');// using the cookie helper to check the current Response// not available to v7.1.1 and lowerhelper('cookie');has_cookie('login_token');
Recuperar una instancia de Cookie en una colección de cookies es muy fácil:
<?phpuseHiggs\Cookie\Cookie;useHiggs\Cookie\CookieStore;useConfig\Services;// getting cookie in the current cookie collection$store=newCookieStore([newCookie('login_token'),newCookie('remember_token'),]);$store->get('login_token');// getting cookie in the current Response's cookie collectioncookies()->get('login_token');Services::response()->getCookie('remember_token');// using the cookie helper to get cookie from the Response's cookie collectionhelper('cookie');get_cookie('remember_token');
Al obtener una instancia de Cookie directamente de CookieStore, aparece un nombre no válido
arrojará una CookieException.
Al obtener una instancia de Cookie de la colección de cookies de la Respuesta actual,
un nombre no válido simplemente devolverá «nulo».
<?phpcookies()->get('unknown_cookie');// null
Si no se proporcionan argumentos al obtener cookies de Respuesta, todos los objetos Cookie
en la tienda se mostrará.
<?phpuseConfig\Services;cookies()->get();// array of Cookie objects// alternatively, you can use the display methodcookies()->display();// or even from the ResponseServices::response()->getCookies();
Nota
The helper function get_cookie() gets the cookie from the current Request object, not
de Respuesta. Esta función verifica la matriz $_COOKIE si esa cookie está configurada y la recupera
de inmediato.
Como se mencionó anteriormente, los objetos CookieStore son inmutables. Necesitas guardar la instancia modificada.
para poder trabajar en ello. La instancia original no se modifica.
<?phpuseHiggs\Cookie\Cookie;useHiggs\Cookie\CookieStore;useConfig\Services;$store=newCookieStore([newCookie('login_token'),newCookie('remember_token'),]);// adding a new Cookie instance$new=$store->put(newCookie('admin_token','yes'));// removing a Cookie instance$new=$store->remove('login_token');
Nota
Removing a cookie from the store DOES NOT delete it from the browser.
Si pretendes eliminar una cookie del navegador, debes poner un valor vacío
cookie con el mismo nombre a la tienda.
Al interactuar con las cookies almacenadas en el objeto Respuesta actual, puede agregar o eliminar de forma segura
cookies sin preocuparse por la naturaleza inmutable de la colección de cookies. El objeto Respuesta reemplazará
la instancia con la instancia modificada.
<?phpuseConfig\Services;Services::response()->setCookie('admin_token','yes');Services::response()->deleteCookie('login_token');// using the cookie helperhelper('cookie');set_cookie('admin_token','yes');delete_cookie('login_token');
This method is deprecated. It will be removed in future releases.
La mayoría de las veces, no necesita preocuparse por enviar cookies manualmente. Higgs hará esto
para ti. Sin embargo, si realmente necesita enviar cookies manualmente, puede utilizar el método dispatch. Al igual que
Al enviar otros encabezados, debe asegurarse de que los encabezados aún no se hayan enviado verificando el valor.
de headers_sent().
<?phpuseHiggs\Cookie\Cookie;useHiggs\Cookie\CookieStore;$store=newCookieStore([newCookie('login_token'),newCookie('remember_token'),]);$store->dispatch();// After dispatch, the collection is now empty.
Ya existen valores predeterminados sensatos dentro de la clase Cookie para garantizar la creación fluida de cookies.
objetos. Sin embargo, es posible que desee definir sus propios ajustes cambiando los siguientes ajustes en el
Clase Config\Cookie en el archivo app/Config/Cookie.php.
En tiempo de ejecución, puede proporcionar manualmente un nuevo valor predeterminado utilizando el método Cookie::setDefaults().