3.3 KiB
Cookies
Accessing and Manipulating Cookies
Cookies can be set/get/expired using the Cookie
class and its static methods
setting:
:::php
Cookie::set('CookieName', 'CookieValue');
getting:
:::php
Cookie::get('CookieName'); //returns null if not set or the value if set
expiring / removing / clearing:
:::php
Cookie::force_expiry('CookieName');
The Cookie_Backend
The Cookie
class manipulates and sets cookies using a Cookie_Backend
. The backend is in charge of the logic
that fetches, sets and expires cookies. By default we use a the CookieJar
backend which uses PHP's
setcookie function.
The CookieJar
keeps track of cookies that have been set by the current process as well as those that were recieved
from the browser.
By default the Cookie
class will load the $_COOKIE
superglobal into the Cookie_Backend
. If you want to change
the initial state of the Cookie_Backend
you can load your own backend into the CookieJar
service registered with
the Injector
.
eg:
:::php
$myCookies = array(
'cookie1' => 'value1',
);
$newBackend = new CookieJar($myCookies);
Injector::inst()->registerService($newBackend, 'Cookie_Backend');
Cookie::get('cookie1'); //will return 'value1'
Resetting the Cookie_Backend state
Assuming that your application hasn't messed around with the $_COOKIE
superglobal, you can reset the state of your
Cookie_Backend
by simply unregistering the CookieJar
service with Injector
. Next time you access Cookie
it'll
create a new service for you using the $_COOKIE
superglobal.
eg:
:::php
Injector::inst()->unregisterNamedObject('Cookie_Backend');
Cookie::get('cookiename'); // will return $_COOKIE['cookiename'] if set
Alternatively, if you know that the superglobal has been changed (or you aren't sure it hasn't) you can attempt to use
the current CookieJar
service to tell you what it was like when it was registered.
eg:
:::php
//store the cookies that were loaded into the `CookieJar`
$recievedCookie = Cookie::get_inst()->getAll(false);
//set a new `CookieJar`
Injector::inst()->registerService(new CookieJar($recievedCookie), 'CookieJar');
Using your own Cookie_Backend
If you need to implement your own Cookie_Backend you can use the injector system to force a different class to be used.
example:
:::yml
---
Name: mycookie
After: '#cookie'
---
Injector:
Cookie_Backend:
class: MyCookieJar
To be a valid backend your class must implement the Cookie_Backend
interface.
Advanced Usage
Sent vs Received Cookies
Sometimes it's useful to be able to tell if a cookie was set by the process (thus will be sent to the browser) or if it came from the browser as part of the request.
Using the Cookie_Backend
we can do this like such:
:::php
Cookie::set('CookieName', 'CookieVal');
Cookie::get('CookieName'); //gets the cookie as we set it
//will return the cookie as it was when it was sent in the request
Cookie::get('CookieName', false);
Accessing all the cookies at once
One can also access all of the cookies in one go using the Cookie_Backend
:::php
Cookie::get_inst()->getAll(); //returns all the cookies including ones set during the current process
Cookie::get_inst()->getAll(false); //returns all the cookies in the request