[FrameworkBundle] Add command to delete an item from a cache pool
This commit is contained in:
parent
6651087a98
commit
fd43e81fd7
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bundle\FrameworkBundle\Command;
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
use Symfony\Component\Console\Style\SymfonyStyle;
|
||||
use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
|
||||
|
||||
/**
|
||||
* Delete an item from a cache pool.
|
||||
*
|
||||
* @author Pierre du Plessis <pdples@gmail.com>
|
||||
*/
|
||||
final class CachePoolDeleteCommand extends Command
|
||||
{
|
||||
protected static $defaultName = 'cache:pool:delete';
|
||||
|
||||
private $poolClearer;
|
||||
|
||||
public function __construct(Psr6CacheClearer $poolClearer)
|
||||
{
|
||||
parent::__construct();
|
||||
|
||||
$this->poolClearer = $poolClearer;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setDefinition(array(
|
||||
new InputArgument('pool', InputArgument::REQUIRED, 'The cache pool from which to delete an item'),
|
||||
new InputArgument('key', InputArgument::REQUIRED, 'The cache key to delete from the pool'),
|
||||
))
|
||||
->setDescription('Deletes an item from a cache pool')
|
||||
->setHelp(<<<'EOF'
|
||||
The <info>%command.name%</info> deletes an item from a given cache pool.
|
||||
|
||||
%command.full_name% <pool> <key>
|
||||
EOF
|
||||
)
|
||||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$io = new SymfonyStyle($input, $output);
|
||||
$pool = $input->getArgument('pool');
|
||||
$key = $input->getArgument('key');
|
||||
$cachePool = $this->poolClearer->getPool($pool);
|
||||
|
||||
if (!$cachePool->hasItem($key)) {
|
||||
$io->note(sprintf('Cache item "%s" does not exist in cache pool "%s".', $key, $pool));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!$cachePool->deleteItem($key)) {
|
||||
throw new \Exception(sprintf('Cache item "%s" could not be deleted.', $key));
|
||||
}
|
||||
|
||||
$io->success(sprintf('Cache item "%s" was successfully deleted.', $key));
|
||||
}
|
||||
}
|
@ -38,6 +38,11 @@
|
||||
<tag name="console.command" command="cache:pool:prune" />
|
||||
</service>
|
||||
|
||||
<service id="console.command.cache_pool_delete" class="Symfony\Bundle\FrameworkBundle\Command\CachePoolDeleteCommand">
|
||||
<argument type="service" id="cache.global_clearer" />
|
||||
<tag name="console.command" command="cache:pool:delete" />
|
||||
</service>
|
||||
|
||||
<service id="console.command.cache_warmup" class="Symfony\Bundle\FrameworkBundle\Command\CacheWarmupCommand">
|
||||
<argument type="service" id="cache_warmer" />
|
||||
<tag name="console.command" command="cache:warmup" />
|
||||
|
@ -0,0 +1,122 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Symfony\Bundle\FrameworkBundle\Tests\Command;
|
||||
|
||||
use Psr\Cache\CacheItemPoolInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Command\CachePoolDeleteCommand;
|
||||
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
|
||||
use Symfony\Component\Console\Tester\CommandTester;
|
||||
use Symfony\Component\HttpKernel\CacheClearer\Psr6CacheClearer;
|
||||
use Symfony\Component\HttpKernel\KernelInterface;
|
||||
|
||||
class CachePoolDeleteCommandTest extends TestCase
|
||||
{
|
||||
private $cachePool;
|
||||
|
||||
protected function setUp()
|
||||
{
|
||||
$this->cachePool = $this->getMockBuilder(CacheItemPoolInterface::class)
|
||||
->getMock();
|
||||
}
|
||||
|
||||
public function testCommandWithValidKey()
|
||||
{
|
||||
$this->cachePool->expects($this->once())
|
||||
->method('hasItem')
|
||||
->with('bar')
|
||||
->willReturn(true);
|
||||
|
||||
$this->cachePool->expects($this->once())
|
||||
->method('deleteItem')
|
||||
->with('bar')
|
||||
->willReturn(true);
|
||||
|
||||
$tester = $this->getCommandTester($this->getKernel());
|
||||
$tester->execute(array('pool' => 'foo', 'key' => 'bar'));
|
||||
|
||||
$this->assertContains('[OK] Cache item "bar" was successfully deleted.', $tester->getDisplay());
|
||||
}
|
||||
|
||||
public function testCommandWithInValidKey()
|
||||
{
|
||||
$this->cachePool->expects($this->once())
|
||||
->method('hasItem')
|
||||
->with('bar')
|
||||
->willReturn(false);
|
||||
|
||||
$this->cachePool->expects($this->never())
|
||||
->method('deleteItem')
|
||||
->with('bar');
|
||||
|
||||
$tester = $this->getCommandTester($this->getKernel());
|
||||
$tester->execute(array('pool' => 'foo', 'key' => 'bar'));
|
||||
|
||||
$this->assertContains('[NOTE] Cache item "bar" does not exist in cache pool "foo".', $tester->getDisplay());
|
||||
}
|
||||
|
||||
public function testCommandDeleteFailed()
|
||||
{
|
||||
$this->cachePool->expects($this->once())
|
||||
->method('hasItem')
|
||||
->with('bar')
|
||||
->willReturn(true);
|
||||
|
||||
$this->cachePool->expects($this->once())
|
||||
->method('deleteItem')
|
||||
->with('bar')
|
||||
->willReturn(false);
|
||||
|
||||
if (method_exists($this, 'expectExceptionMessage')) {
|
||||
$this->expectExceptionMessage('Cache item "bar" could not be deleted.');
|
||||
} else {
|
||||
$this->setExpectedException('Exception', 'Cache item "bar" could not be deleted.');
|
||||
}
|
||||
|
||||
$tester = $this->getCommandTester($this->getKernel());
|
||||
$tester->execute(array('pool' => 'foo', 'key' => 'bar'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return \PHPUnit_Framework_MockObject_MockObject|KernelInterface
|
||||
*/
|
||||
private function getKernel()
|
||||
{
|
||||
$container = $this
|
||||
->getMockBuilder('Symfony\Component\DependencyInjection\ContainerInterface')
|
||||
->getMock();
|
||||
|
||||
$kernel = $this
|
||||
->getMockBuilder(KernelInterface::class)
|
||||
->getMock();
|
||||
|
||||
$kernel
|
||||
->expects($this->any())
|
||||
->method('getContainer')
|
||||
->willReturn($container);
|
||||
|
||||
$kernel
|
||||
->expects($this->once())
|
||||
->method('getBundles')
|
||||
->willReturn(array());
|
||||
|
||||
return $kernel;
|
||||
}
|
||||
|
||||
private function getCommandTester(KernelInterface $kernel): CommandTester
|
||||
{
|
||||
$application = new Application($kernel);
|
||||
$application->add(new CachePoolDeleteCommand(new Psr6CacheClearer(array('foo' => $this->cachePool))));
|
||||
|
||||
return new CommandTester($application->find('cache:pool:delete'));
|
||||
}
|
||||
}
|
@ -28,6 +28,15 @@ class Psr6CacheClearer implements CacheClearerInterface
|
||||
return isset($this->pools[$name]);
|
||||
}
|
||||
|
||||
public function getPool($name)
|
||||
{
|
||||
if (!$this->hasPool($name)) {
|
||||
throw new \InvalidArgumentException(sprintf('Cache pool not found: %s.', $name));
|
||||
}
|
||||
|
||||
return $this->pools[$name];
|
||||
}
|
||||
|
||||
public function clearPool($name)
|
||||
{
|
||||
if (!isset($this->pools[$name])) {
|
||||
|
Reference in New Issue
Block a user