2014-10-20 10:57:35 +02:00
title: Flushable
summary: Allows a class to define it's own flush functionality.
2019-02-27 02:50:49 +01:00
2014-08-16 02:51:17 +02:00
# Flushable
## Introduction
Allows a class to define it's own flush functionality, which is triggered when `flush=1` is requested in the URL.
2017-07-03 03:22:12 +02:00
[FlushMiddleware ](api:SilverStripe\Control\Middleware\FlushMiddleware ) is run before a request is made, calling `flush()` statically on all
implementors of [Flushable ](api:SilverStripe\Core\Flushable ).
2014-08-16 02:51:17 +02:00
2019-02-27 02:50:49 +01:00
< div class = "notice" >
Flushable implementers might also be triggered automatically on deploy if you have `SS_FLUSH_ON_DEPLOY` [environment
variable](../configuration/environment_variables) defined. In that case even if you don't manually pass `flush=1` parameter, the first request after deploy
will still be calling `Flushable::flush` on those entities.
< / div >
2014-08-16 02:51:17 +02:00
## Usage
2017-07-03 03:22:12 +02:00
To use this API, you need to make your class implement [Flushable ](api:SilverStripe\Core\Flushable ), and define a `flush()` static function,
2014-08-16 02:51:17 +02:00
this defines the actions that need to be executed on a flush request.
2016-09-09 08:43:05 +02:00
### Using with Cache
2014-08-16 02:51:17 +02:00
2017-07-03 03:22:12 +02:00
This example uses [Cache ](api:Cache ) in some custom code, and the same cache is cleaned on flush:
2014-08-16 02:51:17 +02:00
2017-08-03 02:51:32 +02:00
```php
2017-10-27 04:38:27 +02:00
use SilverStripe\ORM\DataObject;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Flushable;
use Psr\SimpleCache\CacheInterface;
2017-08-05 00:45:24 +02:00
2019-02-27 02:50:49 +01:00
class MyClass extends DataObject implements Flushable
2017-10-27 04:38:27 +02:00
{
2019-02-27 02:50:49 +01:00
public static function flush()
2017-08-07 05:11:17 +02:00
{
2017-10-27 04:38:27 +02:00
Injector::inst()->get(CacheInterface::class . '.mycache')->clear();
}
2019-02-27 02:50:49 +01:00
public function MyCachedContent()
2017-10-27 04:38:27 +02:00
{
$cache = Injector::inst()->get(CacheInterface::class . '.mycache')
$something = $cache->get('mykey');
if(!$something) {
$something = 'value to be cached';
$cache->set('mykey', $something);
2017-08-07 05:11:17 +02:00
}
2017-10-27 04:38:27 +02:00
return $something;
2017-08-07 05:11:17 +02:00
}
2017-10-27 04:38:27 +02:00
}
2017-08-03 02:51:32 +02:00
```
2014-08-16 02:51:17 +02:00
### Using with filesystem
Another example, some temporary files are created in a directory in assets, and are deleted on flush. This would be
useful in an example like `GD` or `Imagick` generating resampled images, but we want to delete any cached images on
flush so they are re-created on demand.
2017-08-03 02:51:32 +02:00
```php
2017-10-27 04:38:27 +02:00
use SilverStripe\ORM\DataObject;
use SilverStripe\Core\Flushable;
2019-02-27 02:50:49 +01:00
class MyClass extends DataObject implements Flushable
2017-10-27 04:38:27 +02:00
{
2017-08-05 00:45:24 +02:00
2019-02-27 02:50:49 +01:00
public static function flush()
2017-08-07 05:11:17 +02:00
{
2017-10-27 04:38:27 +02:00
foreach(glob(ASSETS_PATH . '/_tempfiles/*.jpg') as $file) {
unlink($file);
2017-08-07 05:11:17 +02:00
}
}
2017-10-27 04:38:27 +02:00
}
```