我正在制作一个处理子域的网站,我设置了一个名为 base_host 的环境变量,现在我想将其使用到 Symfony 4 中的
@route
注释中。
到目前为止我已经尝试过:
@Route("/", name="homepage", host="{afdeling}.{domain}", defaults={"domain"="%env(base_host)%"}, requirements={"domain"="%env(base_host)%"})
但这给了我一个错误:using %env(base_host)% is not allowed in routing configuration
我也尝试过:
@Route("/", name="homepage", host="{afdeling}.%env(base_host)%")
这根本不起作用。
我也尝试过的是:
@Route("/", name="homepage", host="{afdeling}.{domain}", defaults={"domain"="%base_host%"}, requirements={"domain"="%base_host%"})
但这给了我错误消息:The parameter "base_host" must be defined.
我怎样才能实现这个目标?
路由配置内部尚不支持环境变量。作为解决方法,您可以创建一个“proxy”容器参数来实现它:
# app/config/config.yml <= Sf 3.4 >= config/services.yaml
parameters:
base_host: '%env(BASE_HOST)%'
然后使用
%base_host%
选择任何路线选项。
如果您正在构建 Docker 映像,然后需要在运行时更改 BASE_HOST 的值,则接受的答案有一个显着的缺点。
问题的核心是,在您预热缓存时(=最有可能在构建映像时)可用的
BASE_HOST
值将被烘焙到您的预编译路由中。
因此,如果您使用
BASE_HOST=example1.com
构建映像,然后使用 BASE_HOST=somethingelse.com
在环境中运行它,您的应用程序仍将在其路由中包含 example1.com
。
这将会导致重定向、路由匹配等方面出现不良行为。
我当前的解决方案不是在构建过程中预热缓存,而是依赖于容器在目标环境中启动时构建缓存。这样做的缺点是我无法再在完全只读的文件系统上运行我的应用程序。