不覆盖symfony2.6和FOSUserBundle 1.3中的模板有什么问题

时间:2015-05-22 20:22:42

标签: symfony templates override fosuserbundle

我试图使用'简单'来覆盖FOSUserBundle的基本布局。将克隆路径设为.app/Resources/FOSUserBundle/views/layout.html.twig的选项,但symfony2.6继续从供应商目录中呈现模板。

我的作曲家需要:

"require": {
    "php": ">=5.3.3",
    "symfony/symfony": "2.6.*",
    "doctrine/orm": "~2.2,>=2.2.3,<2.5",
    "doctrine/dbal": "<2.5",
    "doctrine/doctrine-bundle": "~1.2",
    "twig/extensions": "~1.0",
    "symfony/assetic-bundle": "~2.3",
    "symfony/swiftmailer-bundle": "~2.3",
    "symfony/monolog-bundle": "~2.4",
    "sensio/distribution-bundle": "~3.0,>=3.0.12",
    "sensio/framework-extra-bundle": "~3.0,>=3.0.2",
    "incenteev/composer-parameter-handler": "~2.0",
    "friendsofsymfony/user-bundle": "~1.3"
},

我检查了以下常见问题:

  • 文件系统区分大小写 - 看起来不错
  • 拥有正确的路径 - 似乎没问题
  • 清除缓存:手动和从应用程序/控制台清除 - 这里没问题

其他信息:   - 使用ubuntu-trusty-64在vagrant实例上运行   - 同步文件夹是通过NFS

我接下来应该做什么或做什么的想法?

1 个答案:

答案 0 :(得分:0)

问题主要与Symfony2或FOSUserBundle无关,而是与PHP缓存文件统计信息的方式有关。

要找到要加载的正确模板,标准Symfony2使用Symfony\Component\HttpKernel\Kernel->locateResource,首先检查.app\Resources目录中是否存在覆盖,如果$first参数设置为true,则返回来自foreach循环内部。

在我的配置中,PHP决定继续使用filecache并对file_exists回答no,即使该文件存在。

要绕过/解决此问题,我的AppKernel.php会覆盖locateResource类的Symfony\Component\HttpKernel\Kernel

<?php
class AppKernel extends Kernel
{
    // .. other methods here

    public function locateResource($name, $dir = null, $first = true)
    {
        clearstatcache(true);
        return parent::locateResource($name, $dir, $first);
    }
}

不漂亮,但确实有效。