Пример создания пользовательских операций и контроллеров не работает

#api-platform.com

#api-platform.com

Вопрос:

Я только что попробовал https://api-platform.com/docs/core/operations/#recommended-method пример.

  1. Я сгенерировал Book.class , как описано
  2. Добавить CreateBookPublication класс
  3. Если я вызываю API, я получаю следующую ошибку:

(1/1) Исключение RuntimeException Не может автоматически подключить службу «App Controller CreateBookPublication»: аргумент «$bookPublishingHandler» метода «__construct()» имеет тип «App Controller BookPublishingHandler», но этот класс не найден.

У вас есть какие-либо идеи? Я хотел бы сгенерировать собственный жестко запрограммированный ответ без doctrine для целей тестирования.

Ответ №1:

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

Ошибка говорит, что DI пытается найти AppControllerCreateBookPublication , но он не существует или не зарегистрирован как сервис. Я предполагаю, что вы используете конфигурацию по умолчанию, и она автоматически регистрирует службы, найденные в src/ каталоге.

Итак, создайте каталог src/Handler , внутри создайте файл класса BookPublishingHandler.php

 <?php

namespace AppHandler;

use AppEntityBook;

class BookPublishingHandler
{
    public function handle(Book $book): array
    {
        // your logic for publishing book or/and eg. return your custom data
    }
}
  

и добавьте импорт в ваш контроллер CreateBookPublication

 <?php

namespace AppController;

use AppHandlerBookPublishingHandler;
  

Или вы можете просто для проверки вернуть жестко закодированный массив непосредственно из контроллера.

Комментарии:

1. Привет, большое спасибо за ваш ответ. У меня все еще есть проблемы.

2. @Ludi Я обновил ответ, в моем примере вы должны поместить свой BookPublishingHandler класс в src/ папку src/Handler/

3. Привет, теперь кажется, что все работает нормально. У меня все еще есть один вопрос. Почему необходимо создать контроллер CreateBookPublication и обработчик BookPublishingHandler? Я легко мог бы разместить весь код в контроллере.

4. В этом нет необходимости, вы можете выполнять всю работу в контроллере, но рекомендуется разделять код на классы с единой ответственностью ( en.wikipedia.org/wiki/Single_responsibility_principle ), это первый из en.wikipedia.org/wiki/SOLID принципы