我有一个需要访问当前应用程序基本URL的服务(在Twig视图中由app.request.getBaseURL()
返回的内容)。目前,我的配置是这样的:
services:
WidgetModel:
class: AppBundle\Model\WidgetModel
scope: prototype
arguments: ['%widgets%']
所以作为第二个参数,我想注入基本URL。可能吗?如果没有,那么什么是合适的解决方案?
答案 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()"