php 管线标注中的环境变量

fnvucqvd  于 2023-11-16  发布在  PHP
关注(0)|答案(2)|浏览(145)

我正在制作一个处理子域的网站,我已经设置了一个名为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.
我怎样才能做到这一点?

c90pui9n

c90pui9n1#

路由配置中不支持环境变量。作为解决方案,您可以创建一个“proxy”容器参数来实现它:

# app/config/config.yml <= Sf 3.4 >= config/services.yaml
parameters:
    base_host: '%env(BASE_HOST)%'

字符串
然后对任何路由选项使用%base_host%

nfg76nw0

nfg76nw02#

接受的答案有一个显著的缺点,例如,如果你正在构建一个Docker镜像,然后需要在运行时更改BASE_HOST的值。
问题的核心是,在预热缓存时(很可能在构建映像时)可用的BASE_HOST值将被烘焙到预编译的路由中。
因此,如果您使用BASE_HOST=example1.com构建映像,然后在使用BASE_HOST=somethingelse.com的环境中运行它,您的应用程序仍然会在其路由中包含example1.com
这将导致重定向、路由匹配等不期望的行为。
我目前的解决方案不是在构建过程中预热该高速缓存,而是依赖于容器在目标环境中启动时构建它。这样做的缺点是我无法再在完全只读的文件系统上运行应用程序。

相关问题