13 extensões Symfony para aprimorar a experiência de desenvolvimento
Listas
Um dos principais recursos utilizados em qualquer aplicação é a lista de itens. Pode ser uma lista de tarefas a serem realizadas, uma lista de produtos em um catálogo, ou qualquer outra lista de dados. O componente Listas do Symfony oferece uma maneira eficiente e flexível de criar e gerenciar listas de dados.
Para começar, você precisará instalar o componente Listas executando o seguinte comando:
composer require symfony/property-access symfony/property-info symfony/options-resolver symfony/form symfony/validator
O próximo passo é definir o modelo de negócio para a sua lista. Você pode usar qualquer entidade do Doctrine como seu modelo, ou criar um modelo personalizado. A próxima etapa é criar a classe ListProvider, que deve implementar a interface ListBuilderInterface. Essa classe deve conter todos os métodos necessários para recuperar os dados da lista, bem como definir as opções de ordenação, paginção e filtragem.
Como definir as colunas da lista?
Para definir as colunas da lista, você precisará criar uma classe Column. Isso pode ser feito para cada coluna individual, ou você pode criar uma classe de colunas para gerenciar todas as colunas da lista. Para definir o cabeçalho da coluna, você pode usar qualquer string, ou passar uma opção ‘header’ para a classe Column.
use SymfonyComponentPropertyAccessPropertyAccess;
use SymfonyComponentPropertyAccessPropertyAccessor;
use SymfonyComponentOptionsResolverOptionsResolver;
class MyColumn extends AbstractColumn
{
protected $accessor;
public function __construct(string $propertyPath, array $options = [])
{
parent::__construct($propertyPath, $options);
$this->accessor = PropertyAccess::createPropertyAccessor();
}
public function getValue($object)
{
return $this->accessor->getValue($object, $this->getPropertyPath());
}
protected function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'header' => null,
'label' => null,
'property_path' => null
]);
$resolver->setAllowedTypes('header', ['string', 'null']);
$resolver->setAllowedTypes('label', ['string', 'null']);
$resolver->setAllowedTypes('property_path', ['string', 'null']);
}
}
Como criar uma lista paginada?
Para criar uma lista paginada, você precisará usar o componente Pager do Symfony. Isso permite que você implemente a paginção de forma fácil e eficiente.
Para começar, você precisará alterar sua classe ListProvider para implementar a interface KnpComponentPagerPaginationPaginationInterface. Em seguida, você precisará definir as opções de paginação na sua classe Column, usando a opção ‘paginate’.
use SymfonyComponentOptionsResolverOptionsResolver;
class MyColumn extends AbstractColumn
{
public function configureOptions(OptionsResolver $resolver)
{
parent::configureOptions($resolver);
$resolver->setDefault('paginate', true);
$resolver->setAllowedTypes('perPage', ['int']);
}
}
Finalmente, você precisará chamar o método getPagination() na sua classe ListProvider para obter uma instância da classe de paginação. Esta instância pode então ser passada para a sua classe de visualização para gerar os links de páginação.
public function getView(Request $request)
{
$pagination = $this->getPagination();
$view = new ListView($pagination);
return $view;
}
Como adicionar um filtro à lista?
Para adicionar um filtro à lista, você pode usar o componente Filtro do Symfony. Isso permite que você defina um formulário de filtro que pode ser usado para filtrar os dados da lista.
Para começar, você precisará definir o formulário de filtro na sua classe ListProvider. Isso pode ser feito usando a opção ‘filter_form’
use SymfonyComponentFormExtensionCoreTypeTextType;
class MyListProvider implements ListProviderInterface
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('filter_form', MyFilterForm::class);
}
public function getFilterForm()
{
return $this->createFormBuilder()
->add('name', TextType::class)
->getForm();
}
}
Em seguida, você precisará adicionar lógica de filtragem na sua classe ListProvider. Isso pode ser feito usando o método applyFilter() da classe AbstractListProvider.
public function applyFilter(Form $form, $qb)
{
$data = $form->getData();
if ($data['name']) {
$qb->andWhere('e.name LIKE :name')->setParameter('name', '%'.$data['name'].'%');
}
}
Finalmente, você precisará passar o formulário de filtro e o filtro aplicado para a sua classe de visualização, que pode então renderizar o formulário de filtro e mostrar os dados filtrados na lista.
public function getView(Request $request)
{
$form = $this->getFilterForm();
$form->handleRequest($request);
$qb = $this->getQueryBuilder();
$this->applyFilter($form, $qb);
$items = $qb->getQuery()->getResult();
$view = new ListView($items);
$view->setFilterForm($form->createView());
return $view;
}
Ao utilizar o componente Listas, o desenvolvedor pode criar listas de dados com facilidade e ter a garantia de que as opções de paginação, filtros e ordenação estarão efetivamente funcionais.