为什么我得到"不能重新声明课程"在Symfony2 + vagrant +移动供应商优化设置?

时间:2016-01-23 13:14:37

标签: symfony vagrant

最近,我一直致力于改善我的流浪环境,并且我偶然发现了Running the Symfony application on Vagrant without NFS below 100ms博客文章。

我已按照建议将vendor dir移到VM共享目录之外,方法是在VM中创建/tmp/app/vendor dir并设置

export COMPOSER_VENDOR_DIR=/tmp/app/vendor
export COMPOSER_BIN_DIR=/tmp/app/bin
export SF2_ENV=vagrant
运行composer install之前的

环境变量。

现在,在供应商正确安装到另一条路径的情况下,我已经修改了app/autoload.php文件,通过查找SF2_ENV环境变量来检测应用程序是否在VM内运行:

if (array_key_exists('SF2_ENV', $_SERVER) && $_SERVER['SF2_ENV'] === 'vagrant') {
    // vagrant enviroment detected
    $loader = require sys_get_temp_dir().'/app/vendor/autoload.php';
} else {
    // default
    $loader = require __DIR__.'/../vendor/autoload.php';
}

这适用于一个项目,但是在另一个项目中我一直得到

  

PHP致命错误:无法重新声明/var/www/public_html/vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity/MappedSuperclass/AbstractLogEntry.php中的类Gedmo \ Loggable \ Entity \ MappedSuperclass \ AbstractLogEntry 13

尝试初始化应用缓存php app/console cache:clear -e=prod时出现

错误。

为什么会这样?

注意:我已经自己动手了,因为这是一个Q& A风格的问题(我未来的一个注释)。

2 个答案:

答案 0 :(得分:1)

我发布此信息是为了提醒我未来的自己或其他任何感兴趣的人。问题是因为我使用Gedmo库的第二个项目和我定义的config.yml:

doctrine:
    orm:
        entity_managers:
            default:
                filters:
                    softdeleteable:
                        class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                        enabled: true
                mappings:
                    gedmo_translatable:
                        type: annotation
                        prefix: Gedmo\Translatable\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
                        alias: GedmoTranslatable
                        is_bundle: false

所以,问题显然是%kernel.root_dir%部分,它是硬编码的。

解决方案

我只是将其更改为%vendor_dir%并在我的parameters.yml中定义了此参数 - 生产为vendor_dir: '%kernel.root_dir%/../vendor',本地(dev)为vendor_dir: /tmp/app/vendor

答案 1 :(得分:0)

我已经在Vagrant上遇到了symfony2项目的问题。但我解决了这个问题,没有更改/ vendor目录的位置。

只需禁用nfs共享并直接在/ var / www

上找到您的项目

你可以在vagrantFile上使用它:

    config.vm.synced_folder '.', '/vagrant', disabled: true

与您的Vagrant合作,就像使用远程服务器一样......

在生产环境中部署autoload.php文件时会发生什么?仅在开发环境中更改此功能并不是非常有用(我不会仅仅为此文件说话而是一般性的想法)。