Contributed by
Roland Franssen
in #21027.

在命令行控制台中生成URL 是需要技巧的,因为 console context(控制台上下文)并不知道有关 HTTP requests(请求), virtual hosts(虚拟主机)和 domain names(域名)的任何信息。 这意味着在命令行中生成一个绝对链接将始终用 http://localhost 作为主机名。

Symfony 利用 router.request_context.* 参数(parameters)解决了此问题,该参数帮 console commands 定义了 hostname, HTTP scheme 以及 base URL。 当在一个命令中利用 asset() 函数生成资源链接时,会发生同样的事。

例如,如果你的程序安装在子目录中并且配置了这个参数:

1
2
# app/config/parameters.yml
router.request_context.base_url: '/subfolder'

一个对 asset('/foo/image.jpg') 的调用将导致 /foo/image.jpg 链接,而不是预期的 /subfolder/foo/image.jpg

这就是为什么在 Symfony 3.4 中我们引入了两个全新参数,叫做 asset.request_context.base_pathasset.request_context.secure,以定义 assets 默认的请求上下文(default request context)。同样的程序中,如果你这样定义这个新参:

1
2
# app/config/parameters.yml
asset.request_context.base_path: '/subfolder'

现在,asset('/foo/image.jpg') 函数将生成预期的 /subfolder/foo/image.jpg URL。