silverstripe-framework/docs/en/reference/cookies.md
2014-10-10 09:28:11 +13:00

118 lines
3.3 KiB
Markdown

# 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](http://www.php.net/manual/en/function.setcookie.php) 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