2015-05-20 3 views
1

Предположим, у меня есть форум. Эта служба нуждается в URL-адресе API-интерфейса форума. Я хочу, чтобы URL-адрес был либо внутренним, либо внешним.Symfony2 - Как ввести необязательный параметр

Если внутренний, это будет маршрут, выполненный в routing.yml и возвращаемый службой маршрутизатора.

Если внешний, было бы параметр, выполненный в parameters.yml.

подхода я думал это:

Ищет переменную FORUM_URL в parameters.yml. Если этого не существует, попробуйте получить этот маршрут. Остальное, бросьте Исключение.

services: 
    forums: 
     class: Acme\ForumsBundle\ForumService 
     arguments: ["@doctrine.orm.entity_manager","@router", "%forum_url%"] 

Проблема с этой реализации является то, что, если эта переменная не определена, она генерирует исключение, так, что мне нужно будет определить его в качестве необязательного параметра (например, вы можете сделать с услугами (. «? @ сервис»)

что бы еще лучше было бы, чтобы быть в состоянии определить, что-то вроде:

"%forum_url% ? %forum_url% : @router" 

Любые идеи о ч Чтобы достичь этого?

PS: Если есть другой подход «лучшей практики», я открыт для ввода.

ответ

3

Вы можете сделать это несколькими способами.

  1. %forum_url% сделать не необязательный, но обязательный параметр, но если вы собираетесь иметь внутренний URL-адрес просто установить null значение (~ в YML) для %forum_url% параметра. Затем вводят как %forum_url% и @router в вашу службу и проверить, если %forum_url%: если оно не равно нулю использовать его, если оно является недействительным использование маршрут

  2. Nicer способом было бы создать еще одну услугу, давайте назовем его url_resolver. Вы вводите эту новую услугу в свой ForumService. Внутри службы url_resolver вы выполняете то, что описано в пункте 1, поэтому вам необходимо ввести %forum_url% и @router. Это просто БОЛЕЕ ТВЕРДЫЙ путь, чем вариант 1

  3. Внесите весь контейнер в ForumService и проверьте, установлен ли %forum_url%. Тем не менее, обратите внимание, что инъекционное весь контейнер в эксплуатацию считается плохой практикой

+0

(ответ на решение 1) ... лучше? Спасибо за ваш вклад. Это значит, что мое текущее решение не так уж плохо, не так ли? – xDaizu

+1

проверить мои изменения и указать 2. Это более чистый способ вашего решения, и я думаю, что он достаточно чист (один Ответственность на месте) –

+0

(** Отвечая на решение 3 **) Я знаю, что 3 - это плохая практика. У моего мозга есть чесание, если я пытаюсь впрыснуть весь контейнер, и, похоже, это что-то хорошее. xD (** ответ на решение 2 **) Мне нравится этот подход. Мне это очень нравится. даже несмотря на то, что он не решает необходимость наличия этого параметра, обязательного для параметра parameters.yml. Я думаю, это не так уж плохо. Таким образом, пользователь знает, где «положить», если он решит выйти на внешний. Спасибо вам за то, что вы полностью ответили :) – xDaizu