Symfony2 一時ファイルに関して

Symfony2アプリケーション内で一時的なファイルを作成する場合、こちらによれば、キャッシュディレクトリ内がオススメの様です。

  • Kernel::getCacheDir() でキャッシュディレクトリのパスを取得できます。
  • ExtensionInterface::getAlias() でバンドル名のエイリアスを得ることができます。
    エイリアスは、小文字+アンダースコアで構成されるので、パスに使うのに都合が良さそうです。
  • ファイル/ディレクトリ操作は、Symfony2のFilesystemコンポーネントが便利そうです。
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOException;

class TestWorkFileCommand extends ContainerAwareCommand
{

    protected function configure()
    {
        $this->setName('sample:work-file');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $kernel = $this->getContainer()->get('kernel');
        $bundle = $kernel->getBundle('XxxxSampleBundle');

        $bundleAlias = $bundle->getContainerExtension()->getAlias();
        $cacheDirPath = $kernel->getCacheDir();
        $workDirPath = $cacheDirPath . DIRECTORY_SEPARATOR . $bundleAlias;

        echo "bundleAlias  = ${bundleAlias}" . PHP_EOL;
        echo "cacheDirPath = ${cacheDirPath}" . PHP_EOL;
        echo "workDirPath  = ${workDirPath}" . PHP_EOL;

        $fs = new Filesystem();

        if (!$fs->exists($workDirPath)) {
            echo "${workDirPath} が存在しないので作ります". PHP_EOL;

            try {
                // 既に存在する場合は、例外は発生しないみたいです
                $fs->mkdir($workDirPath, 744);
            } catch (IOException $e) {
                echo $e->getMessage() . PHP_EOL;
            }
        }

        $workDir = new \SplFileInfo($workDirPath);

        if ($workDir->isDir() and $workDir->isWritable()) {
            echo 'ファイルをタッチします' . PHP_EOL;

            try {
                $fs->touch($workDirPath . DIRECTORY_SEPARATOR . 'dummy.file');
            } catch (IOException $e) {
                echo $e->getMessage() . PHP_EOL;
            }
        }
    }
}