-
Notifications
You must be signed in to change notification settings - Fork 2
Entities definition
En Widestand las entidades son las clases más importantes.
Widestand utiliza la definición de las clases para crear funcionalidades sobre ellas.
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.
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;
}
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;
}
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;