Symfony2:如何在1命令中清除所有Symfony(以及所有第三方插件)缓存?

时间:2016-07-20 01:01:39

标签: symfony

所以我一直在测试Doctrine查询和其他Symfony代码,我必须运行几个命令才能清除Doctrine / Symfony缓存。我正在寻找网络并遇到另一个命令来清除资产资产/等。

从我读过的内容

php app/console cache:clear

只会清除Symfony缓存。它不会包括Doctrine或更多。

我知道我可以创建一个bash脚本来清除我的所有缓存,但这显然意味着我知道所有"清除缓存"命令。我偶然发现了Assetic清除缓存/资产。那些我不知道的人呢?

那么有1"清除缓存"可以为我做的命令?这将包括Symfony / Doctrine / Assetic / Twig以及我安装的任何插件。

非常感谢

1 个答案:

答案 0 :(得分:3)

您正在寻找的内容高度依赖于使用缓存的捆绑包的开发人员。标准版本的symfony附带的教义甚至没有集成其缓存清除命令。但你可以做的是使用一个监听器来扩展默认的symfony命令,该监听器运行你想要的所有缓存清除命令:

<?php
namespace DefaultBundle\Event\Listener;

use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpKernel\CacheClearer\CacheClearerInterface;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Process\Process;

class CacheClearListener implements CacheClearerInterface
{
    private $environment;

    /**
     * @return array
     */
    private static function getCommands()
    {
        return array(
            'php ./app/console doctrine:cache:clear-metadata --no-debug --flush',
            'php ./app/console doctrine:cache:clear-query --no-debug --flush',
            'php ./app/console doctrine:cache:clear-result --no-debug --flush'
        );
    }

    public function clear($cacheDir)
    {
        $output = new ConsoleOutput();
        $output->writeln('');
        $output->writeln('<info>Clearing Doctrine cache</info>');

        foreach (self::getCommands() as $command) {
            $command .= ' --env='.$this->environment;
            $success = $this->executeCommand($command, $output);

            if (!$success) {
                $output->writeln(sprintf('<info>An error occurs when running: %s!</info>', $command));
                exit(1);
            }
        }
    }

    /**
     * @param string        $command
     * @param ConsoleOutput $output
     *
     * @return bool
     */
    private function executeCommand($command, ConsoleOutput $output)
    {
        $p = new Process($command);
        $p->setTimeout(null);
        $p->run(
            function ($type, $data) use ($output) {
                $output->write($data, false, OutputInterface::OUTPUT_RAW);
            }
        );
        if (!$p->isSuccessful()) {
            return false;
        }
        $output->writeln('');

        return true;
    }

    /**
     * @param Kernel $kernel
     */
    public function setKernel(Kernel $kernel)
    {
        $this->environment = $kernel->getEnvironment();
    }
}

像这样注册听众:

<service id="cache_clear_listener" class="DefaultBundle\Event\Listener\CacheClearListener">
    <call method="setKernel">
        <argument type="service" id="kernel"/>
    </call>
    <tag name="kernel.cache_clearer"  priority="254" />
</service>

就是这样。现在您需要做的就是继续将新的cache cache命令添加到getCommands()方法中。为了找到这个命令,你可以运行类似

的东西
php app/console | grep cache

查看包含“cache”一词的所有可用命令

设置好监听器后,每次运行php app / console cache时:清除它将触发你在监听器的getCommands()方法中列出的所有命令。

希望这有帮助, 亚历