2015-09-01 3 views
4

У меня есть служба, которая должна получить доступ к текущему URL-адресу приложения (то, что возвращается app.request.getBaseURL() в представлениях Twig). В настоящее время моя конфигурация такова:Получение базового URL Symfony из службы?

Так как в качестве второго аргумента я хотел бы ввести базовый URL. Является ли это возможным? Если нет, то что было бы правильным решением?

ответ

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

Вы можете использовать expression language в своем сервисе.

Этот пример должен делать то, что вы хотите:

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

Он выбирает услугу запроса, а затем выполняет метод getBaseUrl.

Вам нужно будет добавить второй параметр в свой WigetModel для базового URL.

+0

Пытались это вы? Доступ к запросу напрямую в качестве службы редко работает, как ожидалось. Это определенно не будет работать в S3.x. Он может работать с помощью request_stack. – Cerad

+0

Да, я создал простой проект Symfony 2.7 с классом класса WidgetModel и смог ввести только базовый 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, чтобы получить базовый URL с помощью expressions languages (updated link), таких как:

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