silverstripe-framework/docs/en/02_Developer_Guides/18_Cookies_And_Sessions/01_Cookies.md

152 lines
4.1 KiB
Markdown
Raw Normal View History

title: Cookies
summary: A set of static methods for manipulating PHP cookies.
# Cookies
## Accessing and Manipulating Cookies
Cookies are a mechanism for storing data in the remote browser and thus tracking or identifying return users.
2014-11-15 00:58:31 +01:00
SilverStripe uses cookies for remembering users preferences. Application code can modify a users cookies through
the [Cookie](api:SilverStripe\Control\Cookie) class. This class mostly follows the PHP API.
### set
Sets the value of cookie with configuration.
```php
use SilverStripe\Control\Cookie;
2017-10-26 02:22:02 +02:00
Cookie::set($name, $value, $expiry = 90, $path = null, $domain = null, $secure = false, $httpOnly = false);
// Cookie::set('MyApplicationPreference', 'Yes');
```
### get
Returns the value of cookie.
```php
Cookie::get($name);
// Cookie::get('MyApplicationPreference');
// returns 'Yes'
```
### force_expiry
Clears a given cookie.
```php
Cookie::force_expiry($name, $path = null, $domain = null);
// Cookie::force_expiry('MyApplicationPreference')
```
2014-11-15 00:58:31 +01:00
## Cookie_Backend
The [Cookie](api:SilverStripe\Control\Cookie) class manipulates and sets cookies using a [Cookie_Backend](api:SilverStripe\Control\Cookie_Backend). The backend is in charge of the logic
that fetches, sets and expires cookies. By default we use a [CookieJar](api:SilverStripe\Control\CookieJar) backend which uses PHP's
2014-11-15 00:58:31 +01:00
[setcookie](http://www.php.net/manual/en/function.setcookie.php) function.
The [CookieJar](api:SilverStripe\Control\CookieJar) keeps track of cookies that have been set by the current process as well as those that were received
2014-11-15 00:58:31 +01:00
from the browser.
```php
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Control\Cookie;
use SilverStripe\Control\CookieJar;
2017-10-26 02:22:02 +02:00
$myCookies = [
'cookie1' => 'value1',
];
2014-11-15 00:58:31 +01:00
$newBackend = new CookieJar($myCookies);
2014-11-15 00:58:31 +01:00
Injector::inst()->registerService($newBackend, 'Cookie_Backend');
2014-11-15 00:58:31 +01:00
Cookie::get('cookie1');
2017-08-03 05:35:09 +02:00
```
2014-11-15 00:58:31 +01:00
### Resetting the Cookie_Backend state
2014-11-15 00:58:31 +01:00
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.
```php
Injector::inst()->unregisterNamedObject('Cookie_Backend');
2014-11-15 00:58:31 +01:00
Cookie::get('cookiename'); // will return $_COOKIE['cookiename'] if set
```
2014-11-15 00:58:31 +01:00
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.
```php
//store the cookies that were loaded into the `CookieJar`
$recievedCookie = Cookie::get_inst()->getAll(false);
2014-11-15 00:58:31 +01:00
//set a new `CookieJar`
Injector::inst()->registerService(new CookieJar($recievedCookie), 'CookieJar');
```
2014-11-15 00:58:31 +01:00
### 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.
```yml
---
Name: mycookie
After: '#cookie'
---
SilverStripe\Core\Injector\Injector:
Cookie_Backend:
class: MyCookieJar
```
2014-11-15 00:58:31 +01:00
To be a valid backend your class must implement the [Cookie_Backend](api:SilverStripe\Control\Cookie_Backend) interface.
2014-11-15 00:58:31 +01:00
## 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
```
2014-11-15 00:58:31 +01:00
## API Documentation
* [Cookie](api:SilverStripe\Control\Cookie)
* [CookieJar](api:SilverStripe\Control\CookieJar)
* [Cookie_Backend](api:SilverStripe\Control\Cookie_Backend)