Проблема с symfony 4 abstractcontroller с количеством параметров

Я пытаюсь написать 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. И хотя это напрямую не связано с вашим вопросом, нет необходимости создавать объект запроса внутри действия контроллера. Просто введите это.

Cerad 13.09.2018 23:20

Как указано выше - вы выбрали имя метода, которое уже существует.

benlumley 13.09.2018 23:53
0
2
1 068
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

AbstractController использует интерфейс, который определяет метод get () с определенным количеством параметров и типом возвращаемого значения. Если вы не хотите перезаписывать его метод get (что я не рекомендую), вы должны написать его так, чтобы он был совместим с его определением в интерфейсе.

http://php.net/manual/en/language.oop5.interfaces.php

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

jjwdesign 14.09.2018 14:26

1) Переименуйте свой метод во что-нибудь другое, например getNext () 2) Внедрение зависимостей работает только в конструкторе класса, добавьте метод __construct, который хранит ваш api в переменной в вашем контроллере, и все будет в порядке.

Magnesium 14.09.2018 14:32

Я пробовал делать метод «2» отдельным классом; общедоступная функция __construct (CernerFhir $ api) {...}, но затем я получаю ошибку двух нескольких аргументов. Я думаю, что он жалуется на регистратор и пакет параметров. «Слишком мало аргументов для функции App \ Service \ CernerFhirAppointment :: __ construct ()»

jjwdesign 14.09.2018 14:45

Спасибо, Натрий. Я наконец смог это понять. Внедрение зависимостей действительно работало в конструкторе контроллера, но не в конструкторе моего класса обслуживания. Не знаю почему.

jjwdesign 14.09.2018 15:25

Автоматическое подключение зависимостей должно работать из коробки для любого класса, хранящегося в вашей папке src, только исключения, о которых я знаю, - это сущности и слушатели сущностей. Если вам нужна помощь с этим, вы должны опубликовать ее в новой теме.

Magnesium 14.09.2018 16:14

Другие вопросы по теме