Включение внедрения зависимостей в механизм, отличный от механизма по умолчанию в Symfony - PullRequest
1 голос
/ 09 марта 2020

В моем приложении Symfony есть механизм, в котором мне нужно включить внедрение зависимостей на основе сервисного контейнера по умолчанию. Я нашел код в HttpKernel, где управление внедрением зависимостей осуществляется через механизм контроллеров здесь (просмотрите Sourcegraph) .

Однако я не уверен, как создать экземпляр ArgumentResolver использовать для этой цели.

Ниже я уже попробовал:

class DataSourceController
{
  public function queryDatasource(string $hash, Request $request, ArgumentResolverInterface $argument_resolver)
  {
    // Logic to construct the $datasource variable

    $arguments = $argument_resolver->getArguments($request, [$datasource, 'query']);

    $data = $datasource->query(...$arguments);

    return new JsonResponse($data);
  }
}

Однако, похоже, что ArgumentResolverInterface не может быть автоматически подключен, и я не уверен, как Я должен продолжить об этом. Итак, как мне создать экземпляр подкласса ArgumentResolverInterface или какой другой механизм я должен использовать для достижения внедрения зависимости в произвольный компонент моего приложения?

1 Ответ

0 голосов
/ 11 марта 2020

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

ПРИМЕЧАНИЕ В моем случае использования необходимо разрешить объект, который не является службой, поэтому он не может быть разрешен механизмом внедрения зависимостей, как любая другая служба. Я включил это в свой ответ, поскольку это может быть полезно для других:

$resolvers = [];
array_push($resolvers, ...ArgumentResolver::getDefaultArgumentValueResolvers());
array_push($resolvers, new class implements ArgumentValueResolverInterface {
  // implement the interface to resolve an argument with a specific type/name
});

$argument_resolver = new ArgumentResolver(new ArgumentMetadataFactory(), $resolvers);

// to use it:

$arguments = $argument_resolver->getArguments($request, [$datasource, 'query']);
$datasource->query(...$arguments);

Я надеюсь, что это будет полезно для других.


Я не могу подтвердить это как Решение, или ЛУЧШЕЕ решение, но это то, что, кажется, работает для моего варианта использования. Я приглашаю других комментировать / отвечать, чтобы мы могли вместе улучшить решение

...