Родитель контроллера Symfony4 API

Я реализую приложение под Symfony4 для создания API. Я хочу создать родительский контроллер для CRUD, который будет расширен на другие мои контроллеры, чтобы избежать копирования всего кода CRUD. У вас есть пример? Вот что я уже делал на контроллере.

<?php

namespace App\Controller;

use App\Entity\Article;
use App\Exception\ResourceValidationException;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Request\ParamFetcherInterface;
use Nelmio\ApiDocBundle\Annotation\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Representation\Articles;
use Symfony\Component\Validator\ConstraintViolationList;
use Swagger\Annotations as SWG;

class ArticleController extends FOSRestController
{
    /**
     * @Rest\Get(
     *     path = "/api/articles/{id}",
     *     name = "app_article_show",
     *     requirements = {"id" = "\d+"}
     * )
     * @Rest\View()
     *
     * @SWG\Response(
     *     response=200,
     *     description = "Return article."
     * )
     * @SWG\Tag(name = "Article")
     * @Security(name = "Bearer")
     */
    public function showAction(Article $article)
    {
        return $article;
    }

    /**
     * @Rest\Post(
     *     path = "/api/articles",
     *     name= "app_article_create",
     *  )
     * @Rest\View(StatusCode= 201)
     * @ParamConverter(
     *     "article", converter = "fos_rest.request_body",
     *     options = {
                "validator" = { "groups" = "Create"}
     *     }
     * )
     * @SWG\Response(
     *     response=200,
     *     description = "Create article"
     * )
     * @SWG\Tag(name = "Article")
     * @Security(name = "Bearer")
     */
    public function createAction(Article $article, ConstraintViolationList $violations)
    {
        if (count($violations)) {
            $message = 'The JSON sent contain invalid data: ';
            foreach ($violations as $violation) {
                $message .= sprintf(
                    "Field %s: %s",
                    $violation->getPropertyPath(),
                    $violation->getMessage()
                );
            }
            throw new ResourceValidationException($message);
        }

        $em = $this->getDoctrine()->getManager();

        $em->persist($article);
        $em->flush();

        return $this->view(
            $article,
            Response::HTTP_CREATED,
            [
                'Location' => $this->generateUrl('app_article_create', ['id', $article->getId()], UrlGeneratorInterface::ABSOLUTE_URL)
            ]
        );
    }

    /**
     * @Rest\Get(
     *     path = "/api/articles",
     *     name = "app_article_list"
     * )
     * @Rest\QueryParam(
     *     name = "keyword",
     *     requirements = "[a-zA-Z0-9]",
     *     nullable=true,
     *     description = "The keyword to search for."
     * )
     * @Rest\QueryParam(
     *     name = "order",
     *     requirements = "asc|desc",
     *     default = "asc",
     *     description = "Sort order (asc or desc)"
     * )
     * @Rest\QueryParam(
     *     name = "limit",
     *     requirements = "\d+",
     *     default = "16",
     *     description = "Max number of movies per page."
     * )
     * @Rest\QueryParam(
     *     name = "offset",
     *     requirements = "\d+",
     *     default = "1",
     *     description = "The pagination offset"
     * )
     * @Rest\View()
     * @SWG\Response(
     *     response=200,
     *     description = "List all articles."
     * )
     * @SWG\Tag(name = "Article")
     * @Security(name = "Bearer")
     */
    public function listAction(ParamFetcherInterface $paramFetcher)
    {
        $pager = $this->getDoctrine()->getRepository(Article::class)->search(
            $paramFetcher->get('keyword'),
            $paramFetcher->get('order'),
            $paramFetcher->get('limit'),
            $paramFetcher->get('offset')
        );

        return new Articles($pager);
    }
}

Спасибо за помощь.

Я думаю, что в этом много плохого. Слишком много всего в аннотациях. Вы также не должны помещать эту логику для получения данных из базы данных в контроллеры! Вы должны использовать Dependency Injection вместо $ this-> getDoctrine (), который является просто шаблоном локатора службы. Почему вы хотите расширить этот контроллер? Это характерно для статей. Я бы переписал все это без FosRestBundle, чтобы узнать, как это работает на самом деле, однако постараюсь провести больше исследований о дизайне API в symfony и о Symfony в целом.

Robert 18.11.2018 11:20
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
0
1
466
1

Ответы 1

До Symfony 4 вы могли использовать Функция генерации контроллера Doctrine CRUD. Просто взгляните, если вам нужен просто пример.

Теперь вы можете использовать Пакет Symfony Maker как новую альтернативу. Они говорят здесь, что есть новая команда сделать: crud и они улучшили существующую сделать: форма

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