【问题标题】:Getting Symfony base URL from a service?从服务获取 Symfony 基本 URL?
【发布时间】:2015-11-26 21:19:40
【问题描述】:

我有一个需要访问当前应用程序基础 URL 的服务(在 Twig 视图中由 app.request.getBaseURL() 返回的内容)。目前,我的配置是这样的:

services:
    WidgetModel:
        class: AppBundle\Model\WidgetModel
        scope: prototype
        arguments: ['%widgets%']

作为第二个参数,我想注入基本 URL。可能吗?如果没有,什么是正确的解决方案?

【问题讨论】:

    标签: symfony service dependency-injection base-url


    【解决方案1】:

    据我所知,没有内置的基本 url 服务。这实际上是一个危险信号,可能让您的组件依赖于它可能不是一个好主意。但我想不出一个很好的理由。

    所以通常情况下,只需注入请求对象。但这有它自己的问题,如下所述:http://symfony.com/blog/new-in-symfony-2-4-the-request-stack

    相反,注入 @request_stack 服务并从中提取 url:

    class WidgetModel
    {
      public __construct($widgets,$requestStack)
      {
        $this->baseUrl = $requestStack->getCurrentRequest()->getBaseUrl();
    

    如果您确实发现自己在多个服务中需要 baseUrl,那么您可以定义自己的工厂类型服务来生成它。但同样,这可能意味着您的设计需要重新考虑。

    【讨论】:

      【解决方案2】:

      您可以在服务定义中使用expression language

      这个例子应该做你想做的:

      services:
          WidgetModel:
              class: AppBundle\Model\WidgetModel
              scope: prototype
              arguments: [%widgets%, "@=service('request').getBaseUrl()"]
      

      它获取请求服务,然后执行getBaseUrl方法。

      您需要在 WigetModel 中为基本 URL 添加第二个参数。

      【讨论】:

      • 你试过了吗?直接作为服务访问请求很少能按预期工作。它肯定不会在 S3.x 中工作。它可能使用 request_stack 工作。
      • 是的,我使用 OP 的 WidgetModel 类创建了一个简单的 Symfony 2.7 项目,并且能够仅注入基本 URL。您是否有任何显示 3.x 迁移路径的链接?
      • “在 Symfony 3.0 中,我们将通过从容器中删除请求服务来一劳永逸地解决问题。” symfony.com/blog/new-in-symfony-2-4-the-request-stack。你可以在这里了解 Symfony 的最新动态:symfony.com/blog
      【解决方案3】:

      要完成答案,在 Symfony 3 中,您可以使用 request_stack 来获取使用 expressions languages (updated link) 的基本 url,例如:

      services:
          WidgetModel:
              class: AppBundle\Model\WidgetModel
              scope: prototype
              arguments: [%widgets%,"@=service('request_stack').getCurrentRequest().getBaseUrl()"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        • 2014-05-28
        相关资源
        最近更新 更多