如何强制我的PHP Symfony项目保持开发模式


How do I force my PHP Symfony project to stay in dev mode?

如果我访问symfonyproject.local/app.php,它将使用生产环境。如果我访问symfonyproject.local/app_dev.php,它将使用dev环境。我想快速开发和测试,所以我需要任何URL来加载app_dev.php.

但是,当我在开发环境中单击一个链接(如<a href='/users'>Link</a>(时,它显然加载了symfonyproject.local/users,而不是我需要的symfonyproject.local/app_dev.php/users。如何强制单击开发环境中的链接以自动留在开发环境中?有没有重写所有URL的功能,或者我必须自己创建它?

如果使用路由器生成URL,则它们会自动包含/app_dev.php/。请参见Symfony Twig Extensions-path((。

我个人不直接使用app_dev.php。我使用了一个修改后的.htaccess,它指向app_dev.php而不是app.php.

您应该使用url()方法来正确生成链接

$this->url('@route');

或者更快的方法,您可以更改文件app.php中的环境变量,但我不建议使用这种方法。

您可以考虑在httpd-vhosts.conf 中使用类似的东西

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "YOUR DOCUMENT ROOT"
    DirectoryIndex app_dev.php
    <Directory "YOUR DOCUMENT ROOT">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
        <IfModule mod_rewrite.c>
            RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteRule ^(.*)$ /app_dev.php [QSA,L]
        </IfModule>
    </Directory>
</VirtualHost>

它将添加一条规则,使所有请求都将通过app_dev.php

  • 这只是前面提到的另一个答案

在Symfony 3中,您可以通过更新app.dev并更改以下内容来强制系统以开发模式运行:

$kernel=新的AppKernel('prod',false(;

$kernel=新的AppKernel('dev',true(;

然后,当您访问您的网站时,您将不必在URL中传递app_dev.php。

对于Symfony 4,您可以更新.env文件。

您需要编辑Symfony安装的/web文件夹中的.htaccess文件。

您将在该文件的几个位置看到它引用了app.php。将其更改为app_dev.php,整个项目将默认为开发模式!

返回实时模式,将其更改回app.php

我更喜欢修改前端控制器,使其使用环境变量,而不是硬编码的环境和调试模式。这种工作方式还完全降低了意外将开发前端控制器部署到生产服务器的风险,这是一个额外的好处。我刚从我的项目中删除app_dev.php

app.php

<?php
use Composer'Autoload'ClassLoader;
use Symfony'Component'Debug'Debug;
use Symfony'Component'HttpFoundation'Request;
/**
 * @var ClassLoader $loader
 */
$loader = require __DIR__ . '/../app/autoload.php';
$env = getenv('SYMFONY_ENV') ?: 'prod';
$debug = getenv('SYMFONY_DEBUG') === '1' && $env !== 'prod';
if (!$debug) {
    require __DIR__ . '/../var/bootstrap.php.cache';
}
if ($debug) {
    Debug::enable();
}
$kernel = new AppKernel($env, $debug);
$kernel->loadClassCache();
//$kernel = new AppCache($kernel);
// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
//Request::enableHttpMethodParameterOverride();
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

现在我只需要设置环境变量,这可以通过Apache SetEnv指令(例如虚拟主机配置(来完成。

SetEnv SYMFONY_ENV dev
SetEnv SYMFONY_DEBUG 1

到目前为止有一些不错的答案,但我不喜欢和.htaccess混在一起。太神奇了。所以我只是:

cd web
mv app.php app_prod.php
cp app_dev.php app.php

如果我需要返回生产,我只需将app_prod.php复制回app.php。