2015-09-01 32 views
4

我有一个服务需要访问当前的应用程序基址(在Twig视图中返回app.request.getBaseURL())。目前,我的配置是这样的:从服务获取Symfony基本URL?

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

因此,作为第二个参数,我想注入基础URL。可能吗?如果不是,那么适当的解决方案是什么?

回答

5

据我所知,没有内置的基地网址服务。这实际上是一个红旗,可能让你的组件取决于它可能不是一个好主意。但我想不出一个很好的理由。

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

相反,注入@request_stack服务和拉从它的网址:

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

如果你发现自己需要的的baseUrl在多个服务,那么你可以定义您自己的工厂类型服务以生成它。但是,这又意味着你的设计需要重新思考。

1

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

这个例子应该做你想要什么:

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

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

您需要在您的WigetModel中为基准网址添加第二个参数。

+0

你试过吗?直接作为服务访问请求很少按预期工作。它绝对不会在S3.x中工作。它可能使用request_stack工作。 – Cerad

+0

是的,我使用OP的'WidgetModel'类创建了一个简单的Symfony 2.7项目,并且只能注入基本URL。你是否有链接显示3.x的迁移路径? – StuBez

+1

“在Symfony 3.0中,我们将通过从容器中删除请求服务来彻底解决问题。” http://symfony.com/blog/new-in-symfony-2-4-the-request-stack。你可以在这里跟上Symfony中发生的事情:http://symfony.com/blog/ – Cerad

0

要完成答案,Symfony的3你可以使用request_stack获得使用expressions languages (updated link)如基础网址:

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