Symfony 4 - доступ к параметрам внутри контроллера - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь получить некоторые параметры, определенные в services.yaml, в один из моих контроллеров, но я не могу найти ничего, что работает.

Идея в том, что я хочу иметьобщая строка во всех моих контроллерах, которая определяет префикс всех маршрутов внутри моего приложения, например /api/v1/.

Я пытаюсь сохранить эту строку в файле services.yaml, так как это кажется подходящимместо для этого.

Кроме того, я хотел бы использовать содержимое этих параметров внутри аннотации метода ...

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Если вы не хотите вводить параметр, вы можете использовать это:

$this->getParameter('your.parameter');

service.yaml

parameters:
    your.parameter: /api/v1/
0 голосов
/ 28 мая 2018

Я не думаю, что доступ к параметрам из сервиса - лучший выбор.Я бы посоветовал вам определить свой параметр в разделе «bind» файла service.yaml следующим образом:

services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false

        # Bind all arguments requested by multiple services (auto-wiring)
        bind:
            $yourParameter: '%your.parameter%'

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

Затем в ваших контроллерах и во всех других службах вы можете сделать что-то вроде этого:

class RandomController extends Controller
{
    private $yourParameter;

    public function __construct(string $yourParameter)
    {
        $this->yourParameter = $yourParameter;
    }
    ...

Я ответил на ваш вопрос о параметрах ввода.Теперь, если вы хотите использовать его в аннотации вашего маршрута, я бы протестировал что-то вроде этого.

/**
 * @Route("/api/{apiVersion}/the/rest/of/your/route", name="route_name", defaults={"apiVersion"="%yourParameter%"})
 */
public function yourAction()
{}

Я не тестировал это последнее решение.Не знаю, работает ли он с Symfony 4. Если нет, то, возможно, попробуйте положить% $ yourParameter% (с '$').Расскажите мне об этом.

Редактировать:

Или даже лучше для вашей ситуации (я предполагаю, что вы используете маршрутизацию аннотаций): я полагаю, ваш параметр важен только для / api / partвашего приложения.Затем вы можете определить в своем файле config / route / annotations.yaml все ваши контроллеры, относящиеся к вашему API.Я предлагаю что-то вроде этого.

controllers:
    path: /api/{apiVersion}
    resource: ../../src/Controller/Api
    type: annotation
    defaults:
        apiVersion : '%your.parameter%'
    # And maybe add also requirements like this
    requirements:
        apiVersion: 'v0|v1|v2'

Где все ваши контроллеры API находятся в папке src / Controller / Api.Следовательно, это решение позволяет определить эту конфигурацию только один раз.

0 голосов
/ 28 мая 2018

Начиная с Symfony 4.1, вы сможете автоматически связывать параметры контейнера .

Пока вы должны явно указать компоненту внедрения зависимостей, как связать такое свойство.Вы можете создать сервис для этого, чтобы он был автоматически подключен везде, где вы хотите:

namespace App\Provider;

final class DefaultEndpointProvider
{
    private $url;

    public function __construct(string $url)
    {
        $this->url = $url;
    }

    public function getUrl()
    {
        return $this->url;
    }
}

определение сервиса:

# todo: replace with parameter bind in Sf4.1
App\Provider\DefaultEndpointProvider:
  arguments:
    $url: '%common_url_parameter%'

тогда вы можете просто потребовать этот сервис как зависимость в ваших контроллерах /услуги и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...