Я использую платформу API в своем приложении Symfony4, чтобы раскрыть свои ресурсы. Это отличный фреймворк, но он вынуждает вас по умолчанию иметь всю вашу бизнес-логику на стороне интерфейса, потому что он предоставляет все ваши сущности, а не бизнес-объект.
Мне это не нравится, и я предпочитаю, чтобы моя бизнес-логика находилась на стороне сервера.
Мне нужно создать пользователей, но есть разные типы пользователей. Итак, я создал UserFactory на внутренней стороне. Таким образом, передняя часть просто должна подтолкнуть бизнес-объект, а серверная часть позаботится обо всем.
Передний фронт никогда не может сохранять пользовательский объект непосредственно в БД. Это роль серверной части
Следуя этому руководству по использованию DTO для чтения: https://api-platform.com/docs/core/dto/#how-to-use-a-dto-for-reading
Я пытаюсь сделать то же самое для публикации. И это работает. Вот мой код контроллера:
/**
* @Route(
* path = "/create/model",
* name = "create-model",
* methods = {"POST"},
* defaults = {
* "_api_respond"=true,
* "_api_normalization_context" = {"api_sub_level"=true},
* "_api_swagger_context" = {
* "tags" = {"User"},
* "summary" = "Create a user Model",
* "parameters" = {
*
* },
* "responses" = {
* "201" = {
* "description" = "User Model created",
* "schema" = {
* "type" = "object",
* "properties" = {
* "firstName" = {"type" = "string"},
* "lastName" = {"type" = "string"},
* "email" = {"type" = "string"},
* }
* }
* }
* }
* }
* }
* )
* @param Request $request
* @return \App\Entity\User
* @throws \App\Exception\ClassNotFoundException
* @throws \App\Exception\InvalidUserException
*/
public function createModel(Request $request)
{
$model = $this->serializer->deserialize($request->getContent(), Model::class, 'json');
$user = $this->userFactory->create($model);
$this->userRepository->save($user);
return $user;
}
Он отлично работает, но мне бы хотелось, чтобы мой новый ресурс работал в пользовательском интерфейсе Swagger, поэтому я могу создавать с помощью метода POST новые ресурсы прямо в веб-интерфейсе.
Для этого, я думаю, мне нужно заполнить раздел параметров в моем _api_swagger_context. Но у меня нет никаких документов по этому поводу.
Как я могу это сделать?
@IwanWijaya Я знаю. Я просто говорю о бизнес-объекте.




Нашел ответ здесь: https://github.com/api-platform/docs/issues/666
Вы можете заполнить такие параметры:
"parameters" = {
{
"name" = "data",
"in" = "body",
"required" = "true",
"schema" = {
"type" = "object",
"properties" = {
"firstName" = {"type" = "string"},
"lastName" = {"type" = "string"},
"email" = {"type" = "string" }
}
},
},
},
Больше документов о параметрах чванства здесь: https://swagger.io/docs/specification/2-0/describing-parameters/
«по умолчанию, чтобы вся ваша бизнес-логика находилась на стороне внешнего интерфейса…» Это неправда, вы можете выполнять бизнес-логику внутри события symfony / doctrine.