Я использую платформу API в своем приложении Symfony4 для демонстрации своих ресурсов.Это отличная структура, но она заставляет по умолчанию использовать всю вашу бизнес-логику на стороне интерфейса, поскольку она предоставляет все ваши сущности, а не бизнес-объекты.
Мне это не нравится, и я предпочитаю, чтобы моя бизнес-логика была на заднем плане.
Мне нужно создавать пользователей, но есть разные типы пользователей.Итак, я создал UserFactory в бэк-энде.Таким образом, переднему фронту нужно всего лишь протолкнуть бизнес-объект, а бэкенд позаботится обо всем.
Передний фронт никогда не сможет сохранить пользовательский объект непосредственно в БД.Это роль бэк-энда
Следуя этому руководству, использовать DTO для чтения: https://api -platform.com / docs / core / dto / # how-to-use-a-dto-for-read
Я пытаюсь сделать то же самое для публикации.И это работает.Вот мой код контроллера:
/**
* @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.Но я не делаю никаких документов по этому поводу.
Как я могу это сделать?