silverstripe-framework/docs/en/02_Developer_Guides/16_Execution_Pipeline/01_Flushable.md
Aaron Carlino 6888901468
NEW: Update docs to be compliant with Gatsby site (#9314)
* First cut

* Temporarily disable composer.json for netlify build

* POC

* New recursive directory query, various refinements

* Fix flexbox

* new styled components plugin

* Apply frontmatter delimiters

* Mobile styles, animation

* Search

* Redesign, clean up

* Nuke the cache, try again

* fix file casing

* Remove production env file

* ID headers

* Move app to new repo

* Add frontmatter universally

* Hide children changelogs

* Add how to title

* New callout tags

* Revert inline code block change

* Replace note callouts

* Fix icons

* Repalce images

* Fix icon

* Fix image links

* Use proper SQL icon
2019-11-18 17:58:33 +13:00

2.3 KiB

title summary
Flushable Allows a class to define it's own flush functionality.

Flushable

Introduction

Allows a class to define it's own flush functionality, which is triggered when flush=1 is requested in the URL. FlushMiddleware is run before a request is made, calling flush() statically on all implementors of Flushable.

[notice] Flushable implementers might also be triggered automatically on deploy if you have SS_FLUSH_ON_DEPLOY environment variable 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. [/notice]

Usage

To use this API, you need to make your class implement Flushable, and define a flush() static function, this defines the actions that need to be executed on a flush request.

Using with Cache

This example uses Cache in some custom code, and the same cache is cleaned on flush:

use SilverStripe\ORM\DataObject;
use SilverStripe\Core\Injector\Injector;
use SilverStripe\Core\Flushable;
use Psr\SimpleCache\CacheInterface;

class MyClass extends DataObject implements Flushable
{

    public static function flush()
    {
        Injector::inst()->get(CacheInterface::class . '.mycache')->clear();
    }

    public function MyCachedContent()
    {
        $cache = Injector::inst()->get(CacheInterface::class . '.mycache')
        $something = $cache->get('mykey');
        if(!$something) {
            $something = 'value to be cached';
            $cache->set('mykey', $something);
        }
        return $something;
    }

}

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.

use SilverStripe\ORM\DataObject;
use SilverStripe\Core\Flushable;

class MyClass extends DataObject implements Flushable
{

    public static function flush()
    {
        foreach(glob(ASSETS_PATH . '/_tempfiles/*.jpg') as $file) {
            unlink($file);
        }
    }

}