从服务获取Symfony基URL?

从服务获取Symfony基URL?,symfony,service,dependency-injection,base-url,Symfony,Service,Dependency Injection,Base Url,我有一个服务需要访问当前的应用程序基URL(由Twig视图中的app.request.getBaseURL()返回的内容)。目前,我的配置如下: services: WidgetModel: class: AppBundle\Model\WidgetModel scope: prototype arguments: ['%widgets%'] 因此,作为第二个参数,我想插入基本URL。可能吗?如果没有,什么是合适的解决方案?据我所知,没有

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

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

因此,作为第二个参数,我想插入基本URL。可能吗?如果没有,什么是合适的解决方案?

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

所以通常,只需注入请求对象。但这也有其自身的问题,如本文所述:

相反,插入@request_堆栈服务并从中提取url:

class WidgetModel
{
  public __construct($widgets,$requestStack)
  {
    $this->baseUrl = $requestStack->getCurrentRequest()->getBaseUrl();
如果您发现自己在多个服务中需要baseUrl,那么您可以定义自己的工厂类型服务来生成它。但同样,这可能意味着您的设计需要重新思考。

您可以在服务定义中使用

此示例应满足您的要求:

services:
    WidgetModel:
        class: AppBundle\Model\WidgetModel
        scope: prototype
        arguments: [%widgets%, "@=service('request').getBaseUrl()"]
它获取请求服务,然后执行
getBaseUrl
方法


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

要完成回答,在Symfony 3中,您可以使用请求栈获取基本URL,例如:


你试过这个吗?直接作为服务访问请求很少能像预期的那样工作。它在S3.x中肯定不起作用。是的,我用OP的
WidgetModel
类创建了一个简单的Symfony 2.7项目,并且能够只注入基本URL。您是否有任何显示3.x迁移路径的链接?“在Symfony 3.0中,我们将通过从容器中删除请求服务来一次性解决此问题。”。您可以在这里了解Symfony的动态:
services:
    WidgetModel:
        class: AppBundle\Model\WidgetModel
        scope: prototype
        arguments: [%widgets%,"@=service('request_stack').getCurrentRequest().getBaseUrl()"