(16) 981791110 contato@policast.studio

O que é uma Lista em RESTful?

Uma lista em RESTful é um recurso que fornece uma coleção de outros recursos. Por exemplo, uma API RESTful de um blog pode ter uma lista de artigos, que está disponível em um endpoint específico, como “GET /articles”.

Como criar uma Lista em Symfony 3?

Em Symfony 3, podemos criar uma lista usando o componente “Serializer”. Este componente é usado para converter objetos PHP em diferentes formatos, como JSON, XML, etc.

Para criar uma Lista em Symfony 3, siga estas etapas:

  1. Crie uma classe de Entidade que representará os objetos que serão listados na coleção.

  2. // Exemplo de uma classe de Entidade Article
    namespace AppBundleEntity;
    use DoctrineORMMapping as ORM;
    /**
    * @ORMEntity
    * @ORMTable(name="articles")
    */
    class Article
    {
    /**
    * @ORMId
    * @ORMColumn(type="integer")
    * @ORMGeneratedValue(strategy="AUTO")
    */
    private $id;
    /**
    * @ORMColumn(type="string", length=100)
    */
    private $title;
    /**
    * @ORMColumn(type="text")
    */
    private $content;
    /**
    * @ORMColumn(type="datetime")
    */
    private $publishedAt;
    // getters e setters ...
    }

  3. Crie um controlador que representará o endpoint da Lista. Neste exemplo, vamos criar um controlador “ArticleController” com uma ação “listAction”.

  4. // Exemplo de uma ação "listAction" do controller "ArticleController"
    namespace AppBundleController;
    use SensioBundleFrameworkExtraBundleConfigurationRoute;
    use SymfonyBundleFrameworkBundleControllerController;
    use SymfonyComponentHttpFoundationJsonResponse;
    /**
    * @Route("/articles")
    */
    class ArticleController extends Controller
    {
    /**
    * @Route("/", name="article_list")
    */
    public function listAction()
    {
    $articles = $this->getDoctrine()
    ->getRepository('AppBundle:Article')
    ->findAll();
    $data = array('articles' => $articles);
    $jsonContent = $this->get('serializer')
    ->serialize($data, 'json');
    return new JsonResponse($jsonContent);
    }
    }

  5. Adicione uma rota no arquivo “routing.yml” para vincular a ação “listAction” do controller “ArticleController” ao endpoint “/articles”.

  6. // Exemplo de uma rota para o endpoint "/articles"
    article_list:
    path: /articles/
    defaults: { _controller: AppBundle:Article:list }
    methods: GET

  7. Agora você pode acessar a Lista em http://localhost/app_dev.php/articles

Como filtrar uma Lista em Symfony 3?

Para filtrar uma Lista em Symfony 3, podemos adicionar parâmetros à URL do endpoint. Por exemplo, se quisermos filtrar a lista de artigos por um autor específico, podemos adicionar um parâmetro “?author=nome_do_autor” ao endpoint.

Para obter o parâmetro na ação “listAction” do controller “ArticleController”, podemos usar o serviço “request_stack” do Symfony.


// Exemplo de uma ação "listAction" do controller "ArticleController" com filtro
public function listAction(Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
$queryBuilder = $entityManager->createQueryBuilder()
->select('a')
->from('AppBundle:Article', 'a');
$author = $request->query->get('author');
if ($author) {
$queryBuilder->andWhere('a.author = :author')
->setParameter('author', $author);
}
$articles = $queryBuilder->getQuery()->getResult();
$data = array('articles' => $articles);
$jsonContent = $this->get('serializer')
->serialize($data, 'json');
return new JsonResponse($jsonContent);
}

Como ordenar uma Lista em Symfony 3?

Para ordenar uma Lista em Symfony 3, podemos adicionar parâmetros à URL do endpoint. Por exemplo, se quisermos ordenar a lista de artigos por data de publicação, podemos adicionar um parâmetro “?order=publishedAt” ao endpoint.

Para obter o parâmetro na ação “listAction” do controller “ArticleController”, podemos usar o serviço “request_stack” do Symfony.


// Exemplo de uma ação "listAction" do controller "ArticleController" com ordenação
public function listAction(Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
$queryBuilder = $entityManager->createQueryBuilder()
->select('a')
->from('AppBundle:Article', 'a');
$order = $request->query->get('order');
if ($order) {
$queryBuilder->orderBy('a.'.$order, 'DESC');
}
$articles = $queryBuilder->getQuery()->getResult();
$data = array('articles' => $articles);
$jsonContent = $this->get('serializer')
->serialize($data, 'json');
return new JsonResponse($jsonContent);
}

Como paginar uma Lista em Symfony 3?

Para paginar uma Lista em Symfony 3, podemos usar o componente “KnpPaginatorBundle”. Este componente fornece uma classe “Pagination” que encapsula os resultados da consulta e fornece informações sobre a página atual, o número total de páginas, etc.

Para usar o “KnpPaginatorBundle”, siga estas etapas:

  1. Instale o “KnpPaginatorBundle” usando o Composer

  2. composer require knplabs/knp-paginator-bundle

  3. Configure o “KnpPaginatorBundle” no arquivo “config.yml”.

  4. // Exemplo de configuração do "KnpPaginatorBundle"
    knp_paginator:
    page_range: 5
    default_options:
    page_name: page # page query parameter name
    sort_field_name: sort # sort field query parameter name
    sort_direction_name: direction # sort direction query parameter name
    distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements
    filter_field_name: filterField # filter field query parameter name
    filter_value_name: filterValue # filter value query parameter name
    template:
    pagination: "@KnpPaginator/Pagination/twitter_bootstrap_v3_pagination.html.twig"
    sortable: "@KnpPaginator/Pagination/sortable_link.html.twig"
    filtration: "@KnpPaginator/Pagination/filtration.html.twig"

  5. Modifique a ação “listAction” do controller “ArticleController” para usar o “KnpPaginatorBundle”.

  6. // Exemplo de uma ação "listAction" do controller "ArticleController" com paginação
    public function listAction(Request $request)
    {
    $entityManager = $this->getDoctrine()->getManager();
    $queryBuilder = $entityManager->createQueryBuilder()
    ->select('a')
    ->from('AppBundle:Article', 'a');
    $order = $request->query->get('order');
    if ($order) {
    $queryBuilder->orderBy('a.'.$order, 'DESC');
    }
    $pagination = $this->get('knp_paginator')->paginate(
    $queryBuilder,
    $request->query->getInt('page', 1),
    10
    );
    $data = array('articles' => $pagination->getItems());
    $jsonContent = $this->get('serializer')
    ->serialize($data, 'json');
    return new JsonResponse($jsonContent);
    }

  7. Neste exemplo, estamos exibindo 10 artigos por página. Você pode alterar isso alterando o segundo parâmetro no método “paginate” do “KnpPaginatorBundle”.