Blog


Symfony y API Platform: Extendiendo las Posibilidades con Extensiones

SYMFONY Y API PLATFORM: EXTENDIENDO LAS POSIBILIDADES CON EXTENSIONES

19 / 10 / 2023 Symfony

Symfony y API Platform son herramientas poderosas que permiten a los desarrolladores crear aplicaciones web robustas y escalables de manera eficiente. Sin embargo, en ocasiones, es posible que necesitemos personalizar aún más el comportamiento de estas herramientas para satisfacer los requisitos específicos de nuestro proyecto. Una forma de hacerlo es mediante el uso de extensiones ORM personalizadas. En este artículo, exploraremos qué son y cómo puedes utilizarlas en Symfony y API Platform.

¿Qué son las extensiones de Doctrine en API Platform?

Las extensiones de Doctrine en API Platform te permiten modificar o extender el comportamiento predeterminado de las consultas a la base de datos sin necesidad de crear un filtro personalizado. Puedes utilizar estas extensiones para aplicar filtros personalizados, implementar lógica de negocio específica o modificar las consultas a nivel de colección o elementos individuales. Esto te brinda un mayor control y flexibilidad sobre cómo se manejan tus datos.

Creando una Extensión de Doctrine en Symfony y API Platform

Para ilustrar cómo crear una extensión de Doctrine en API Platform, consideremos el escenario en el que deseas que API Platform siempre devuelva los registros de una entidad Noticia cuyo campo publicada sea TRUE.

<?php
// src/Entity/Noticia.php
namespace App\Entity;

use ApiPlatform\Metadata\ApiResource;

#[ApiResource]
class Noticia
{
    //...

    #[ORM\Column]
    private ?bool $publicada = false;

    //...
}

Lo primero que debes hacer es crear una clase que implemente la interfaz QueryCollectionExtensionInterface. A continuación, se muestra un ejemplo de cómo podría verse la extensión:

<?php
// src/Doctrine/EntityPublicadaExtension.php
namespace App\Doctrine;

use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use App\Entity\Noticia;
use Doctrine\ORM\QueryBuilder;

class EntityPublicadaExtension implements QueryCollectionExtensionInterface
{
    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, Operation $operation = null, array $context = []): void
    {
        $this->addWherePublicada($queryBuilder, $resourceClass);
    }

    private function addWherePublicada(QueryBuilder $queryBuilder, string $resourceClass): void
    {
        if (Noticia::class !== $resourceClass) {
            return;
        }

        $rootAlias = $queryBuilder->getRootAliases()[0];

        $queryBuilder
            ->andWhere(sprintf('%s.publicada = :publicada', $rootAlias))
            ->setParameter('publicada', true)
        ;
    }
}

En esta clase EntityPublicadaExtension, implementamos QueryCollectionExtensionInterface. Verificamos si el recurso actual es Noticia y, en caso afirmativo, aplicamos una restricción para que solo se seleccionen noticias con el campo visible igual a true.

Para terminar, si no estás utilizando la configuración automática, debes registrar esta extensión como un servicio en tu archivo de configuración, para que Symfony y API Platform la utilicen. Agrega el siguiente código a tu archivo services.yaml:

# config/services.yaml

services:
    # ...

    App\Extension\EntityPublicadaExtension:
        tags:
            - { name: 'api_platform.doctrine.orm.query_extension.collection' }

Este código registra la extensión con los nombres completos de las clases y las etiquetas adecuadas para indicar que es una extensión de colección.

 



ARTÍCULOS RELACIONADOS