Я пытаюсь написать API в Symfony 4. У меня возникла проблема с методами моего контроллера при попытке использовать DependencyInjection для созданного мной класса API службы. Я пробовал несколько разных способов написать код и не могу понять.
https://symfony.com/doc/current/components/dependency_injection.html
Я могу создать метод getNext () (вместо get () ниже), и код будет работать должным образом, но если я попытаюсь использовать метод get (), я получу сообщение об ошибке. Это основные задействованные классы. Большая часть кода удалена.
class AppointmentController extends AbstractController
{
/**
* @Route("/appointment/getNext", name = "appointment/getNext")
*
*/
public function get(string $id = null, CernerFhir $fhirApi)
{
$request = Request::createFromGlobals();
...more code...
}
}
class CernerFhir
{
public function __construct(LoggerInterface $logger, ParameterBagInterface $params)
{
$this->logger = $logger;
$this->params = $params;
}
}
}
Предупреждение: объявление App \ Controller \ AppointmentController :: get (? String $ id, App \ Service \ CernerFhir $ fhirApi) должно быть совместимо с Symfony \ Bundle \ FrameworkBundle \ Controller \ AbstractController :: get (string $ id)
Как указано выше - вы выбрали имя метода, которое уже существует.
AbstractController использует интерфейс, который определяет метод get () с определенным количеством параметров и типом возвращаемого значения. Если вы не хотите перезаписывать его метод get (что я не рекомендую), вы должны написать его так, чтобы он был совместим с его определением в интерфейсе.
http://php.net/manual/en/language.oop5.interfaces.php
Я понимаю ошибку, но не знаю, как ее исправить. Похоже, что объекты внедрения зависимостей не должны учитываться при подсчете количества параметров, но они это делают. Чтобы исправить это, следует ли мне отказаться от внедрения зависимостей, а затем попытаться создать объекты вручную? Я не уверен, как получить или создать объекты глобального регистратора и пакета параметров.
1) Переименуйте свой метод во что-нибудь другое, например getNext () 2) Внедрение зависимостей работает только в конструкторе класса, добавьте метод __construct, который хранит ваш api в переменной в вашем контроллере, и все будет в порядке.
Я пробовал делать метод «2» отдельным классом; общедоступная функция __construct (CernerFhir $ api) {...}, но затем я получаю ошибку двух нескольких аргументов. Я думаю, что он жалуется на регистратор и пакет параметров. «Слишком мало аргументов для функции App \ Service \ CernerFhirAppointment :: __ construct ()»
Спасибо, Натрий. Я наконец смог это понять. Внедрение зависимостей действительно работало в конструкторе контроллера, но не в конструкторе моего класса обслуживания. Не знаю почему.
Автоматическое подключение зависимостей должно работать из коробки для любого класса, хранящегося в вашей папке src, только исключения, о которых я знаю, - это сущности и слушатели сущностей. Если вам нужна помощь с этим, вы должны опубликовать ее в новой теме.
Ошибка связана с тем, что у AbstractController уже есть метод с именем get. И хотя это напрямую не связано с вашим вопросом, нет необходимости создавать объект запроса внутри действия контроллера. Просто введите это.