Arrays globales en Symfony2

Arrays globales, cuando es importante tener bien definidas las opciones que están disponibles en los selects de administración y que en el Frontend condicionan comportamientos concretos.

Para no equivocarnos en ningún lugar donde los utilicemos y no tener que reescribirlo una y otra vez, podemos crear un array a nivel global.

Para este ejemplo, recurro a un caso concreto para un proyecto que realicé.

En este proyecto era de vital importancia no equivocarse en las alergias definidas para una persona, por lo que un fallo de este tipo puede significar.

Arrays globales

En primer lugar, creo el array, config.yml:

parameters:
    alergias:
        1: 'Pescado'
        2: 'Gluten'
        3: 'Marisco'

Ahora creamos un Form Type, donde crear el listado con estas opciones, ListaAlergiasType.php

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Description of ListaAlergiasType
 *
 * @author Juanjo García
 */
class ListaAlergiasType extends AbstractType {

    private $alergiasChoices;

    public function __construct(array $alergiasChoices) {
        $this->alergiasChoices = $alergiasChoices;
    }

    public function configureOptions(OptionsResolver $resolver) {
        $resolver->setDefaults([
            'choices' => $this->alergiasChoices,
            'expanded' => false,
            'multiple' => false,
            'required' => true,
            'placeholder' => 'Selecciona...',
            ]);
    }

    public function getParent() {
        return 'choice';
    }

    public function getName() {
        return 'app_alergias';
    }

}

Creamos un servicio, aplicamos como class el Form type creado, donde pasamos como argumento el nombre del array creado anteriormente, services.yml

services:
            
    app.form.type.lista_alergias:
        class: AppBundle\Form\Type\ListaAlergiasType
        arguments:
            - '%alergias%'
        tags:
            - { name: form.type, alias: lista_alergias }

Vamos a definir un campo en nuestra entidad,  MyEntity.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
//...

/**
 * MyEntity
 *
 * @ORM\Table()
 */
class MyEntity
{

    //...    

    /**
     * @var integer
     *
     * @ORM\Column(name="alergia", type="string", length=2, options={"comment":"Valor 1 es Pescado, valor 2 es Gluten, valor 3 es Marisco"})
     * 
     * @Assert\NotBlank()
     */
    private $alergia;

    //...   

    /**
     * Set alergia
     *
     * @param string $alergia
     * @return MyEntity
     */
    public function setAlergia($alergia)
    {
        $this->alergia = $alergia;

        return $this;
    }

    /**
     * Get alergia
     *
     * @return string 
     */
    public function getAlergia()
    {
        return $this->alergia;
    }
    
}

 

Ya tenemos todo creado, solo nos falta utilizarlo en nuestros formularios, en el ejemplo, lo aplicaremos a una Admin Class de SonataAdminBundle, MyEntityAdmin.php

<?php

namespace AppBundle\Admin;


/**
 * Description of MyEntityAdmin
 *
 * @author Juanjo García
 */
class MyEntityAdmin extends Admin {

    //...

    // Fields to be shown on create/edit forms
    protected function configureFormFields(FormMapper $formMapper) {
        $formMapper
                ->add('alergia', 'lista_alergias', array())                
        ;
    }

    //...

}

Esto es todo, ya podemos crear nuestros arrays globales en Symfony2 y reutilizarlos cuanto queramos.

Referencias