pinkcrab / memoize-trait
Simple Memoize based object cache, used as a trait.
Requires
- php: >=7.1.0
Requires (Dev)
- phpstan/phpstan: ^0.12.6
- phpunit/phpunit: ^7.0
- pinkcrab/phpunit-helpers: dev-master
- symfony/var-dumper: ^5.0
- yoast/phpunit-polyfills: ^0.1.0
This package is auto-updated.
Last update: 2024-10-25 04:36:52 UTC
README
Simple trait for adding a Memoize object cache to your class
Version
Release 1.0.0
Why?
Adds an internal cache with a memoize interface. Creates a cache of results based on a hash of the arguments used for the call.
Setup
$ composer require pinkcrab/memoize-trait
use PinkCrab\Memoize\Memoizable; class CategoryRepository { /** * Gives access to the Memoize cache */ use Memoizable; /** * Will call the database on the first call. * Creates a cache based on the hash of $id & $parent (concatinated) */ public function getCategory($id, $parent): ?CategoryTerm { return $this->memoize( $this->generateHash($id, $parent), function () use ($id, $parent): ?CategoryTerm { return $this->slowDataSource->someExpensiveQuery($id, $parent); } ) } }
All the methods are protected and are not intended as part of an objects inteface.
Methods
memoize( string $hash, callable $fetch ): mixed
The hash value should be unique and repeatable/pure, based on the parameters. You can use the built in generateHash(...$scarla). The callable passed, should carry out your operation, before the result is returned, it is passed to the internal cache.
public function doExpensiveCall($param1, $param2): Result { return $this->memoize( // Generate Hash $this->generateHash($param1, $param2), // The fetch/call callable. function() use ($param1, $param2) : Result { return $this->service ->expensiveCall($param1, $param2); } ); }
generateHash(...$parts): string
Allows the passing of any number of serializable variables and being returned a repeatable hash. This only uses MD5 under the hood, you can create a custom hash generator
flushMemoize(): void
Clears the internal cache array.
Dependencies
- --NONE--
License
MIT License
http://www.opensource.org/licenses/mit-license.html