个性化阅读
专注于IT技术分析

如何在Silex项目中使用CLI清除缓存

本文概述

对于已经与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

从终端运行命令后, 假设一切正常, 你将看到”缓存已成功清除”消息。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Silex项目中使用CLI清除缓存

评论 抢沙发

评论前必须登录!