Symfony2 cache:clear输出services.yml文件的内容

时间:2014-04-17 23:09:35

标签: symfony doctrine-orm

在Symfony2中,每次我通过控制台清除缓存:

php app/console cache:clear

控制台打印出services.yml文件的内容!如果我通过rm -rf app/cache/*手动删除缓存(我必须这样做,因为我的控制台用户无法访问apache用户www-data,出于某种原因,尽管因为文件属于同一组创建为640而不是660),然后公共网站也会在第一次加载页面并生成缓存时将其打印出来。

注意:即使在app / config / config.yml中没有加载services.yml,也会打印出来(只是现有的,不知何故被引用)

我们导入services.yml文件:

# /app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: "@AcmeBundle/Resources/config/services.yml" }

然后在services.yml文件中设置全局服务:

# /src/Acme/Bundle/Resources/config/services.yml
# TODO: ALERT! this prints out whenever I clear the cache...
services:
    #This is a service so that we can access the view object anywhere
    acme.view:
        class: Acme\Bundle\Controller\ViewController
        arguments: [ @doctrine.orm.entity_manager ]

问题:每次清除缓存时都会打印出这个文件的想法吗?

1 个答案:

答案 0 :(得分:0)

这是因为将/Acme/Bundle/Resources/config/services.yml服务参数从PHP更改为YAML格式(我在测试中最初创建为PHP)。

对服务参数文件的引用在两个地方的/Acme/Bundle/DependencyInjection/AcmeBundleExtension.php中进行了硬编码。

这是破碎的代码:

class AcmeBundleExtension extends Extension
{
/**
 * {@inheritDoc}
 */
public function load(array $configs, ContainerBuilder $container)
{
    $configuration = new Configuration();
    $config = $this->processConfiguration($configuration, $configs);

    $loader = new Loader\PhpFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
}

}

由于services.yml作为PHP文件加载,因此只要重新创建缓存,它就会打印出文本。令人惊讶的是,所有服务仍以某种方式实际加载......!

请注意,如果您将配置文件从PHP更改为YAML(反之亦然),则必须更新:

$loader->load('services.yml');

(我做过)

但您还必须将加载程序功能从Loader\PhpFileLoader更新为Loader\YamlFileLoader

$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));

当然这似乎很明显,但如果您是Symfony的新手,请注意转换服务配置文件的格式不仅需要更改文件名。