Installation
composer require bigpaulie/cachebundle "dev-master" --prefer-dist
Add to AppKernel.php:
new bigpaulie\CacheBundle\BigpaulieCacheBundle(),
Configure
In config.yml:
imports:
- { resource: "@BigpaulieCacheBundle/Resources/config/services.yml" }
In parameters.yml:
memcached_servers:
- { host: 127.0.0.1, port: 11211 }
Enable Caching
In config_dev.yml (or environment-specific YAML):
bigpaulie_cache:
enable: true
First Use Case
Inject the cache service into a controller or service:
use Symfony\Component\DependencyInjection\ContainerInterface;
public function __construct(ContainerInterface $container)
{
$this->cache = $container->get('bigpaulie.cache');
}
Cache a query result:
$key = 'user_list';
$data = $this->cache->get($key);
if (!$data) {
$data = $this->entityManager->getRepository('App:User')->findAll();
$this->cache->set($key, $data, 3600); // Cache for 1 hour
}
Query Caching
Use the CacheTrait in repositories or services:
use bigpaulie\CacheBundle\Cache\CacheTrait;
class UserRepository extends ServiceEntityRepository
{
use CacheTrait;
public function findAllCached()
{
return $this->cacheGet('user_list', function() {
return $this->findAll();
}, 3600);
}
}
Environment-Specific Caching
Disable caching in config_dev.yml:
bigpaulie_cache:
enable: false
Doctrine Integration
Configure Memcached for Doctrine caches in config.yml:
doctrine:
orm:
metadata_cache_driver: { type: service, id: doctrine.cache.driver.memcached }
query_cache_driver: { type: service, id: doctrine.cache.driver.memcached }
result_cache_driver: { type: service, id: doctrine.cache.driver.memcached }
Custom Cache Keys Generate dynamic keys based on query parameters:
$key = 'user_list_' . $this->getParameter('locale');
$this->cache->get($key, function() use ($locale) {
return $this->findBy(['locale' => $locale]);
});
bigpaulie.cache service for manual caching.3600 for 1 hour) to avoid stale data.$this->cache->delete('user_list_' . $userId);
Service Not Found
If bigpaulie.cache is unavailable, ensure:
services.yml is imported.memcached_servers parameter is defined.AppKernel.php.Doctrine Cache Misconfiguration If Doctrine caches fail silently, verify:
127.0.0.1:11211 by default).doctrine.cache.driver.memcached service is correctly referenced in config.yml.Environment Overrides
Caching may be disabled in config_dev.yml but enabled in config_prod.yml. Test locally with:
bigpaulie_cache:
enable: true # Force-enable for testing
Key Collisions
Avoid generic keys (e.g., users). Use namespaced keys:
$key = 'app.users.active_' . $this->getParameter('env');
php bin/console debug:cache to inspect cached items.CacheTrait to log:
use Psr\Log\LoggerInterface;
protected $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
protected function cacheGet($key, $callback, $ttl)
{
$data = $this->cache->get($key);
if ($data) {
$this->logger->info('Cache HIT', ['key' => $key]);
} else {
$this->logger->info('Cache MISS', ['key' => $key]);
$data = $callback();
$this->cache->set($key, $data, $ttl);
}
return $data;
}
Custom Cache Drivers Override the default Memcached driver by defining a custom service:
services:
app.cache.driver:
class: AppBundle\Cache\CustomDriver
arguments: ['@memcached']
Then reference it in Doctrine config:
doctrine:
orm:
result_cache_driver: { type: service, id: app.cache.driver }
Cache Events
Listen for cache events (e.g., cache.clear) to invalidate related data:
// In a service
public function onCacheClear(CacheClearEvent $event)
{
$this->cache->delete('user_list_*'); // Wildcard delete
}
Tag-Based Invalidation Implement tagging for granular invalidation:
$this->cache->set('user:123', $user, 3600, ['users', 'admin']);
$this->cache->invalidateTags(['users']); // Clear all tagged items
How can I help you explore Laravel packages today?