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.