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:
- Crie uma classe de Entidade que representará os objetos que serão listados na coleção.
- Crie um controlador que representará o endpoint da Lista. Neste exemplo, vamos criar um controlador “ArticleController” com uma ação “listAction”.
- Adicione uma rota no arquivo “routing.yml” para vincular a ação “listAction” do controller “ArticleController” ao endpoint “/articles”.
- Agora você pode acessar a Lista em http://localhost/app_dev.php/articles
// 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 ...
}
// 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);
}
}
// Exemplo de uma rota para o endpoint "/articles"
article_list:
path: /articles/
defaults: { _controller: AppBundle:Article:list }
methods: GET
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:
- Instale o “KnpPaginatorBundle” usando o Composer
- Configure o “KnpPaginatorBundle” no arquivo “config.yml”.
- Modifique a ação “listAction” do controller “ArticleController” para usar o “KnpPaginatorBundle”.
- Neste exemplo, estamos exibindo 10 artigos por página. Você pode alterar isso alterando o segundo parâmetro no método “paginate” do “KnpPaginatorBundle”.
composer require knplabs/knp-paginator-bundle
// 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"
// 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);
}