Evitando los getters y setters en las entitades de Symfony

symfony logo

symfony logo

Es el día y aún no logro entender porque en las clases de symfony de tipo entidad se debe acceder a las propiedades a través de métodos getters y escribir valores a través de setters, nunca encontré un argumento válido para esta notación, pero si lo sabes y puedes iluminarnos, puedes dejar un comentario (estoy seguro que este concepto fue robado de java -.-)

Sé que no todos los métodos de una clase deberían ser visibles al momento de instanciarse, pero en el caso de las entidades en symfony, creo que si se debería poder, para dejar más claro a que me refiero con entidades, explicaré brevemente que es una entidad.

Entitades en symfony les llaman a las clases que mapean directamente una tabla en nuestra base de datos, en algunos otros frameworks esto se llama modelo, por lo tanto se define una clase de la siguiente manera:

<?php
namespace DemoProject\CoreBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity
 * @ORM\Table(name="Usuarios")
 */
class UsuariosEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @var int $nombre
     * @ORM\Column(name="nombre", type="string", nullable=false)
     */
    protected $nombre;
}

Lo curioso, para mi obviamente es que recomiendan crear métodos getters y setters si se quiere escribir o acceder a las propiedades de la clase, por lo que ahora se vería de esta manera:

<?php
namespace DemoProject\CoreBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity
 * @ORM\Table(name="Usuarios")
 */
class UsuariosEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @var int $nombre
     * @ORM\Column(name="nombre", type="string", nullable=false)
     */
    protected $nombre;
 
    /**
     * @return mixed
     */
    public function getId()
    {
        return $this->id;
    }
 
    /**
     * @param mixed
     */
    public function setId($id)
    {
        $this->id = $id;
        return $this;
    }
 
    /**
     * @return mixed
     */
    public function getNombre()
    {
        return $this->nombre;
    }
 
    /**
     * @param mixed
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;
        return $this;
    }
}

Y se implementa así:

$usuario = new UsuariosEntity();
$usuario->setId(1);
$usuario->setNombre("Jack");
 
// y para acceder
$id = $usuario->getId();
$nombre = $usuario->getNombre();

Personalmente creo que en una clase de tipo entidad todas las propiedades deberían ser accesibles, pero escribir métodos para setear o tomar valores para cada propiedad en bd con tablas que tienen al menos 10 o más campos es un poco tedioso este proceso, entonces mi propuesta práctica para evitar este tipo de estructuras es utilizar los métodos mágicos de php que nos ahorran básicamente este tipo de trabajo.

Entonces implementando los métodos mágicos en una entidad en symfony, quedaría de la siguiente manera:

<?php
namespace DemoProject\CoreBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * @ORM\Entity
 * @ORM\Table(name="Usuarios")
 */
class UsuariosEntity
{
    /**
     * @ORM\Id
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
     * @var int $nombre
     * @ORM\Column(name="nombre", type="string", nullable=false)
     */
    protected $nombre;
 
    /**
     * [__get description]
     * @param  [type] $property [description]
     * @return [type]           [description]
     */
    public function __get($property) 
    {
        if (property_exists($this, $property)) 
        {
            return $this->$property;
        }
    }
 
    /**
     * [__set description]
     * @param [type] $property [description]
     * @param [type] $value    [description]
     */
    public function __set($property, $value) 
    {
        if (property_exists($this, $property)) 
        {
            $this->$property = $value;
        }
 
        return $this;
    }
}

Por lo que ahora al instanciar la clase UsuariosEntity, fácilmente podría acceder a la propiedad id, o establecer su valor escribiendo algo como lo siguiente:

$usuario = new UsuariosEntity();
$usuario->id = 1;
$usuario->nombre = "Jack";
 
// y para acceder
$id = $usuario->id;
$nombre = $usuario->nombre;

Pues ahí está, si hay algo que crees que estoy haciendo mal, es buen momento para decirlo y corregirlo.. de lo contrario, empecemos a escribir código más legible para los demás, no importa si el framework nos recomienda hacerlo siguiendo una notación específica.

Happy Coding! 😀

Co-fundador de Qbit Mexhico, usuario de linux, Developer en tecnologías web.. Nicaragüense, centro en basketball, primer centro en rugby y pintor los fines de semana. Ortögrafo y ambientalista psicológico (de escritorio).. ese soy yo!

Si te ha servido compártelo y difunde nuestro blog..

Facebook Twitter LinkedIn Google+ Flickr YouTube Skype 

Compartir en...Tweet about this on TwitterPin on Pinterest0Share on LinkedIn0Share on Google+0Share on Facebook0