Я нашел несколько подсказок, которые могут указать вам правильное направление:
Symfony поставляется с пятью определителями значений в компоненте HttpKernel:
...
RequestValueResolver
Внедряет текущий запрос, если подсказывает тип с помощью Request или класса, расширяющего Request.
см. https://symfony.com/doc/current/controller/argument_value_resolver.html
Затем страница переходит к описанию реализации пользовательского RequestAttributeValueResolver.Этот пользовательский распознаватель может быть зарегистрирован в вашем services.yml
.Хотя в этом примере создается один класс для одного типа атрибута (пользователь), существуют способы создания более динамичной реализации.
В этом примере параметр ArgumentMetadata
имеет метод $argument->getType()
, который должен содержать строковое представление проверяемого типа:
if (User::class !== $argument->getType()) {
return false;
}
Ничто не мешает проверитьмассив поддерживаемых типов запросов.Этот массив может управляться как член класса в вашем пользовательском RequestValueResolver
.Единственное требование для вашего пользовательского класса RequestValueResolver
заключается в том, что метод supports()
возвращает true
для поддерживаемых типов запросов, а функция resolve()
возвращает экземпляр этого поддерживаемого типа запросов.Это должно быть простым, потому что оба метода предоставляют «нужный» класс через параметр ArgumentMetaData
.
В качестве альтернативы вы можете реализовать пользовательский RequestValueResolver
для каждого пользовательского типа запроса, который вы хотите поддерживать, ноэто не очень элегантно.
Я не могу гарантировать, что это сработает, и я также не уверен в различиях между реализацией RequestAttributeValueResolver
в примере и реализацией пользовательского RequestValueResolver
, но у меня естьощущение, что это может сработать, с небольшим количеством смазки для локтя.
Для справки: https://api.symfony.com/4.1/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestValueResolver.html