从服务获取Symfony基本URL?

时间:2015-09-01 15:02:28

标签: symfony service dependency-injection base-url

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

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

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

3 个答案:

答案 0 :(得分:5)

据我所知,没有内置的基本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,那么您可以定义自己的工厂类型服务来生成它。但同样,这可能意味着您的设计需要重新思考。

答案 1 :(得分:1)

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

此示例应该执行您想要的操作:

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

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

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

答案 2 :(得分:0)

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

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