Noticias

Extensiones admin en Sonata

Durante el desarrollo de un backend con Symfony y Sonata, es muy habitual contar con algunos campos comunes a muchas entidades diferentes, piensa por ejemplo en campos relacionados con el SEO o con estados como activo, inactivo, etc.

En lugar de tener que indicar manualmente en cada entidad que se muestren los campos pertienentes, podemos realizar una gestión de forma centralizada con ayuda de las extensiones de Sonata.

En la entrada de hoy vamos a ver un ejemplo de como utilizar este recurso en nuestros proyectos. El artículo está basado en la documentación de Sonata que puedes encontrar en aquí.


Vamos a ver un ejemplo muy simple. Creamos una interfaz y una clase que la implemente.

namespace Acme\Demo\Publish;

interface StatusInterface
{
    public function setStatus($status);

    public function getStatus();
}

Y tenemos una clase que la implementa:

namespace Acme\Demo\Publish;

interface Status implements StatusInterface
{
    protected $status

    public function setStatus($status)
    {
        $this->status = $status;
        
        return $this;
    }
    
    public function setStatus()
    {
        return $this->status;
    }
}

 

La creación de la extensión del admin es sencilla. Simplemente hay que indicar los campos que contiene el formulario. 

namespace Acme\Demo\DemoBundle\Admin\Extension;

use Sonata\AdminBundle\Admin\AdminExtension; 
use Sonata\AdminBundle\Form\FormMapper; 

class StatusAdminExtension extends AdminExtension 
{ 
  public function configureFormFields(FormMapper $formMapper) { 
    $formMapper->add('status', 'choice', array( 
        'choices' => array( 
            '0' => 'Enabled', 
            '1' => 'Disabled', 
        ), 
    )); 
  } 
}

 

Para indicar que la nueva clase es una extensión de Sonata Admin es necesario declarar un servicio e indicar una tag con el nombre de 'sonata.admin.extension':

services:
    acme.demo.status.extension:
        class: Acme\Demo\DemoBundle\Admin\Extension\StatusAdminExtension
        tags:
            - { name: sonata.admin.extension }

Para configurar los admins a los que va a afectar la extensión, tenemos dos opciones, una es indicarlo en la misma declaración del servicio, a través de la opción 'target':

services:
    acme.demo.status.extension:
        class: Acme\Demo\DemoBundle\Admin\Extension\StatusAdminExtension
        tags:
            - { name: sonata.admin.extension, target: acme.demo.admin.demo_entity }

 

La otra manera es a través de la configuración de Sonata:

# app/config/config.yml
    sonata_admin:
        extensions:
            acme.demo.status.extension:
                admins:
                    - acme.demo.admin.article
                implements:
                    - Acme\Demo\Publish\StatusInterface
                excludes:
                    - acme.demo.admin.blog
                    - acme.demo.admin.news
                extends:
                    - Acme\Demo\Document\Blog
                instanceof:
                    -  Acme\Demo\Document\Page

 

Como puedes ver, las admin extensions de Sonata nos ofrecen una forma sencilla de ahorrar código en nuestros proyectos. En la entrada de hoy hemos visto sólo lo básico, en las extensiones podemos acceder a múltiples métodos para ejecutar validaciones, configurar filtros y rutas o actual sobre el ciclo de vida de la entidad, etc. 

Por ejemplo creando una extensión con datos SEO genéricos y sobreescribiendo los métodos de postUpdate, postPersist, y postRemove, podríamos centralizar la información SEO de las entidades en una misma entidad.

Ahora que los conoces espero que los comiences a utilizar en tus proyectos. Puedes ampliar información en la documenación de Sonata: https://sonata-project.org/bundles/admin/master/doc/reference/extensions.html en la que está basado el artículo.


Symfony2 php Sonata Project


Compartir mola!!