You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Symfony 6.4:如何使自定义APP_ENV=qual环境与prod环境表现完全一致

Symfony 6.4:如何使自定义APP_ENV=qual环境与prod环境表现完全一致

嘿,我来帮你搞定这个Symfony环境的问题!针对你想让APP_ENV=qual和prod表现完全一致的需求,有两个实用的方案,你可以根据自己的实际情况选:

方案一:让qual环境继承prod的配置(灵活可控)

如果你之后可能需要给qual环境加一些独有的配置(比如不同的数据库连接),但大部分逻辑和prod保持一致,那这个方案最适合你:

  • 先在项目根目录新建.env.qual文件,内容不用太复杂,只需要指定环境标识就行,其他变量如果和prod一样就不用额外写,要改的话再单独加:
# .env.qual
APP_ENV=qual
# 比如如果qual的数据库地址不同,就加DATABASE_URL=xxx,没有的话空着也没关系
  • 接下来在config/packages/下创建qual目录,里面的每个配置文件都先导入prod对应文件的配置,这样qual就会先复用prod的所有设置,再应用你需要的自定义配置。举个例子,config/packages/qual/framework.yaml可以这么写:
# config/packages/qual/framework.yaml
imports:
    - { resource: '../prod/framework.yaml' }

# 这里可以加你需要单独调整的配置项,不需要的话就留空

要是大部分配置都和prod一样,你甚至不用创建所有prod有的配置文件,只需要创建你要改的那几个就行。

  • 最后说下错误页面的问题:Symfony的Twig错误模板是按环境区分的,你有两个简单的解决办法:
    • Templates/bundles/TwigBundle/Exception/下的prod专属模板(比如error404_prod.html.twig)复制一份,改名为error404_qual.html.twig,这样qual环境就会自动用这个模板;
    • 或者在config/packages/qual/twig.yaml里配置一下,让qual直接用prod的错误模板路径:
# config/packages/qual/twig.yaml
imports:
    - { resource: '../prod/twig.yaml' }

twig:
    paths:
        '%kernel.project_dir%/templates/bundles/TwigBundle/Exception': TwigBundle:Exception

这样不管是prod还是qual,都会用你放在Exception目录下的通用错误模板了。

方案二:直接在入口文件替换环境(完全复用prod)

如果你完全不想给qual搞任何特殊配置,就想让它100%和prod一模一样,那这个方案最省事,直接在入口文件把qual环境替换成prod就行:

  • 打开public/index.php,在文件最开头加上这段代码:
// public/index.php
use App\Kernel;

// 把qual环境替换为prod
if ($_SERVER['APP_ENV'] === 'qual') {
    $_SERVER['APP_ENV'] = 'prod';
    $_ENV['APP_ENV'] = 'prod';
}

require_once dirname(__DIR__).'/vendor/autoload_runtime.php';

return function (array $context) {
    return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};
  • 同样的,打开bin/console,在文件开头也加上这段替换逻辑:
// bin/console
#!/usr/bin/env php
<?php

use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;

// 把qual环境替换为prod
if ($_SERVER['APP_ENV'] === 'qual') {
    $_SERVER['APP_ENV'] = 'prod';
    $_ENV['APP_ENV'] = 'prod';
}

require_once dirname(__DIR__).'/vendor/autoload.php';

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$application = new Application($kernel);
$application->run();

这样不管部署时设置的是APP_ENV=qual还是prod,Symfony都会直接按prod环境来运行,你自定义的错误页面自然也会正常显示了。

对了,顺便说下你之前的方法为啥没生效:你之前创建了qual目录并把when@prod改成when@qual,但因为没导入prod的基础配置,导致qual环境用的是Symfony默认的配置逻辑(和dev类似的错误页面),而不是prod的配置,用上面的方案就能完美解决这个问题啦。

备注:内容来源于stack exchange,提问作者MxM

火山引擎 最新活动