Skip to content

Entities definition

Alejandro Glejberman edited this page Apr 11, 2023 · 1 revision

En Widestand las entidades son las clases más importantes.

Widestand utiliza la definición de las clases para crear funcionalidades sobre ellas.

Nombres de Campos

Los nombres de los campos deben seguir una nomenclatura snake_case del nombre de atributo que tenga como prefijo el nombre de tabla. Por ejemplo el atributo $coverImage de la entidad Job tendrá el nombre de campo job_cover_image. Las excepciones que puedan ocurrir se verán caso a caso.

Fechas de Modificación, Creación y Quién lo creó

Todas las entidades deberán tener los atributos createdAt, modifiedAt y createdBy. Estos a su vez deben tener atributos #[Gedmo\Timestampable(on: 'create')], #[Gedmo\Timestampable(on: 'update')] y #[Gedmo\Blameable(on: 'create')] respectivamente.

Para facilitar los getters y setters de los campos createdAt, modifiedAt y createdBy se pueden utilizar los traits WS\Core\Library\Traits\Entity\TimestampableTrait y WS\Core\Library\Traits\Entity\BlameableTrait.

<?php

namespace App\Entity;

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use WS\Core\Library\Traits\Entity\BlameableTrait;
use WS\Core\Library\Traits\Entity\TimestampableTrait;

class Job
{
    use BlameableTrait;
    use TimestampableTrait;

    #[Gedmo\Timestampable(on: 'create')]
    #[ORM\Column(name: 'job_created_at', type: Types::DATETIME_MUTABLE)]
    private \DateTimeInterface $createdAt;

    #[Gedmo\Timestampable(on: 'update')]
    #[ORM\Column(name: 'job_modified_at', type: Types::DATETIME_MUTABLE)]
    private \DateTimeInterface $modifiedAt;

    #[Gedmo\Blameable(on: 'create')]
    #[ORM\Column(name: 'job_created_by', type: Types::STRING, length: 128, nullable: true)]
    private ?string $createdBy = null;
}

Dependencia del Dominio

Las entidades puede ser que deban depender de un Dominio. Por ejemplo los Job dependen del Dominio; esto significa que cuando se crea un job se lo asocia a un dominio concreto, por ejemplo el dominio en español. Luego cuando se cambia de dominio y se crea otro job ese será uno asociado al dominio en inglés. Esta es la manera de diferenciar contenido que pertenece a un dominio y otro.

El CRUD permite realizar esta gestión de forma automática implementando en la entidad la interfaz DomainDependantInterface y definiendo el atributo $domain que sea una relación con WS\Core\Entity\Domain junto a sus getter y setter. Internamente el CRUD reconocerá que la entidad implementa la interfaz e inyectará el dominio correspondiente al momento de crear la entidad y de recuperarla.

Para facilitar la implementación se debe utilizar el trait DomainDependantTrait.

use WS\Core\Entity\Domain;
use WS\Core\Library\CRUD\DomainDependantInterface;
use WS\Core\Library\CRUD\DomainDependantTrait;

class Job implements DomainDependantInterface
{
    use DomainDependantTrait;

    #[ORM\ManyToOne(targetEntity: Domain::class)]
    #[ORM\JoinColumn(name: 'job_domain', referencedColumnName: 'domain_id', nullable: false)]
    private Domain $domain;
}

Slug

En el caso de que la entidad sea luego expuesta con una URL deberá tener un campo Slug, de tipo string y un largo de 128. La definición del mismo deberá tener el atributo #[Gedmo\Slug] indicando la base de unicidad y a partir de que campo calcular el slug si éste no viniese definido.

Ejemplo de implementación:

    #[Assert\Length(max: 128)]
    #[ORM\Column(name: 'job_slug', type: Types::STRING, length: 128)]
    #[Gedmo\Slug(updatable: false, unique: true, unique_base: 'domain', fields: ['title'])]
    private string $slug;