tedivm/stash-bundle
Symfony bundle integrating the Stash caching library. Provides cache pool services, Web Profiler toolbar info, and Doctrine Common Cache integration. Supports multiple cache backends with simple YAML configuration and easy access to default or custom pools.
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require tedivm/stash-bundle
Add to config/bundles.php (Symfony 4+):
return [
// ...
Tedivm\StashBundle\TedivmStashBundle::class => ['all' => true],
];
Basic Configuration (config/packages/stash.yaml):
stash:
drivers: [FileSystem]
FileSystem: ~
First Use Case: Inject the cache pool into a service/controller:
use Stash\Pool;
class MyService
{
public function __construct(private Pool $cachePool) {}
public function getCachedData(string $key): mixed
{
$item = $this->cachePool->getItem($key);
if (!$item->isMiss()) {
return $item->get();
}
$data = $this->fetchFreshData($key);
$item->set($data, 3600); // Cache for 1 hour
return $data;
}
}
Pool interface for type-hinting.dev/test environments.registerDoctrineAdapter: true for ORM caching.Leverage composite drivers for fallback logic (e.g., APC → Filesystem):
stash:
drivers: [Apc, FileSystem]
Apc: ~
FileSystem:
path: "%kernel.cache_dir%/stash_fallback"
Use %kernel.environment% for dynamic backends:
stash:
drivers: [%env(STASH_DRIVER)%]
Redis:
servers: ["%env(REDIS_URL)%"]
Use tags for bulk invalidation (Stash v0.12+):
$item = $pool->getItem('user:123', ['users', 'premium']);
$item->set($userData, 3600);
$pool->invalidateTags(['users']); // Clears all tagged items
Configure in config/packages/doctrine.yaml:
doctrine:
orm:
metadata_cache_driver: stash.adapter.doctrine.default_cache
query_cache_driver: stash.adapter.doctrine.default_cache
Enable session adapter:
stash:
registerSessionHandler: true
framework:
session:
handler_id: stash.adapter.session.default_cache
Stash\Pool as a drop-in replacement for PSR-6 caches where supported.new \DateTime('+1 hour')3600 (seconds)set($data, $data['expires_at'])).user:123 vs. product:456).cache1:key vs. cache2:key).Key Collisions:
cache1:key vs. cache2:key).stash.caches.{name}.namespace in config.TTL Precision:
3600.5) may behave unexpectedly across drivers.DateTime objects.Doctrine Adapter Quirks:
Doctrine\Common\Cache\CacheProvider interfaces.stash.adapter.doctrine.default_cache).Session Adapter Limitations:
Tracking Overhead:
tracking_values: true logs sensitive data.stash.tracking: false).stash:
logger: monolog.logger.cache
stash.tracking: true to verify TTL application.Driver Order Matters:
[Apc, FileSystem] checks APC first, falls back to filesystem.Filesystem Permissions:
dirPermissions: 0770 may fail on shared hosting.umask in your deployment script.Redis Connection:
php-redis extension and proper server configuration.php -m | grep redis and test connection manually.Memcached Options:
remove_failed_servers must be enabled in php.ini for the option to work.memcache.remove_failed_servers = 1 to php.ini.Custom Drivers:
Stash\Driver\DriverInterface and register via stash.drivers service tag.services:
App\Cache\MyDriver:
tags: ['stash.driver']
Event Listeners:
stash.cache_item_miss or stash.cache_item_hit events for analytics.use Stash\Event\CacheEvent;
$dispatcher->addListener('stash.cache_item_miss', function (CacheEvent $event) {
// Log miss with metadata
});
Encoder Overrides:
Native encoder with Json or Php:
FileSystem:
encoder: Json
Cache Warmers:
Stash\CacheWarmerInterface for pre-loading critical data.class ProductCacheWarmer implements CacheWarmerInterface
{
public function warmUp(Pool $pool): array
{
$keys = ['product:1', 'product:2'];
foreach ($keys as $key) {
$pool->getItem($key)->set($this->fetchProduct($key), 3600);
}
return $keys;
}
}
Register as a service tagged with kernel.cache_warmer.inMemory: true for CLI scripts to avoid memory leaks.Pool::getItems() for multiple keys to reduce overhead:
$items = $pool->getItems(['key1', 'key2']);
foreach ($items as $item) {
if ($item->isMiss()) {
$item->set($this->fetchData($item->getKey()));
}
}
compression: true).AppKernel.php with config/bundles.php.getItem($key, $tags) instead of getItem($key) for tagged caching.Doctrine\Common\Cache\CacheProvider compatibility.
---
How can I help you explore Laravel packages today?