本文概述
对于已经与Symfony合作并且突然不得不与基于Silex的项目一起工作的开发人员, 尽管大多数情况是相同的, 但显然有些事情并没有。 Silex中最繁琐的任务之一(例如, 当你实现Twig时)是需要清除缓存, 但是必须手动完成, 删除/ cache文件夹的内容。如前所述, 如果你来自纯Symfony环境, 那么你会知道项目中已经有一个CLI命令, 即cache:clear可以为你完成此操作。 Silex没有此功能, 但是你可以自己实现, 因此无需在每次退出开发环境时都自行删除缓存文件夹的内容!
在本文中, 我们将向你展示如何轻松地将cache:clear命令添加到你的Silex应用程序。
重要
在本教程中, 我们假设你已经为silex实现了console.php文件, 你可以在其中注册新的控制台命令, 如果你没有这样做, 请参考Symfony的控制台组件以获取更多信息。
1.创建cache:clear命令
我们将为你提供清除Silex项目缓存文件夹的命令, 但是你需要知道如何在应用程序中加载该命令。这通常是在项目的console.php文件中完成的(遵循默认的Silex Skeleton结构), 在该文件中你应该已经找到一个Symfony控制台应用程序。如果没有, 则可以创建它。以下示例添加了cache:clear命令, 该命令在console.php文件中创建一个基本的控制台应用程序:
<?php
// src/console.php
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Finder\Finder;
// Your application, this is just an example of initialization, this should be different in your app ...
$console = new Application('My Silex Application', 'n/a');
$console->getDefinition()->addOption(new InputOption('--env', '-e', InputOption::VALUE_REQUIRED, 'The Environment name.', 'dev'));
$console->setDispatcher($app['dispatcher']);
$console
->register('my-command')
->setDefinition(array(
// new InputOption('some-option', null, InputOption::VALUE_NONE, 'Some help'), ))
->setDescription('My command description')
->setCode(function (InputInterface $input, OutputInterface $output) use ($app) {
// do something
})
;
// Register the cache:clear command !
$console
->register('cache:clear')
->setDescription('Clears the cache')
->setCode(function (InputInterface $input, OutputInterface $output) use ($app) {
if (!isset($app['cache.path']))
{
$output->writeln(sprintf("<error>ERROR:</error> could not clear the cache: <info>\$app['cache.path']</info> is not set.", 'cache:clear'));
return false;
}
$cacheDir = $app['cache.path'];
$finder = new Finder();
$finder
->in($cacheDir)
->notName('.gitkeep')
;
//--- from Filesystem::remove()
$remove = function ($files, $recurse) {
$files = iterator_to_array($files);
$files = array_reverse($files);
foreach ($files as $file) {
if (!file_exists($file) && !is_link($file)) {
continue;
}
if (is_dir($file) && !is_link($file)) {
$recurse(new \FilesystemIterator($file), $recurse);
if (true !== @rmdir($file)) {
throw new \Exception(sprintf('Failed to remove directory %s', $file));
}
} else {
// https://bugs.php.net/bug.php?id=52176
if (defined('PHP_WINDOWS_VERSION_MAJOR') && is_dir($file)) {
if (true !== @rmdir($file)) {
throw new \Exception(sprintf('Failed to remove file %s', $file));
}
} else {
if (true !== @unlink($file)) {
throw new \Exception(sprintf('Failed to remove file %s', $file));
}
}
}
}
};
$remove($finder, $remove);
$output->writeln("Cache succesfully cleared!");
return true;
})
;
return $console;
将更改保存到文件, 然后继续下一步。
2.全局定义缓存路径
否则, 你将发现异常”错误:无法清除缓存:未设置$ app [‘cache.path’]”。如果你尝试运行命令而不执行此步骤。要定义cache.path属性, 你可能需要在项目的app.php文件中进行操作, 只需将新密钥分配给$ app变量, 并指定Silex项目的cache文件夹的路径:
注意
根据项目的结构, 路径可能会更改, 因此请确保提供正确的路径。
// Define the cache.path property to the cache directory of your Silex Project.
// app.php
$app['cache.path'] = __DIR__.'/../var/cache';
3.测试命令
最后一步, 保存更改后, 你将可以从终端在项目的根文件夹上运行命令:
php bin/console cache:clear
从终端运行命令后, 假设一切正常, 你将看到”缓存已成功清除”消息。
编码愉快!
评论前必须登录!
注册