Login to bookmark this video
Buy Access to Course
15.

Refactorizador cuántico: Entidades ricas

|

Share this awesome video!

|

Lucky you! You found an early release chapter - it will be fully polished and published shortly!

This Chapter isn't quite ready...

Get Notified About this Course!

We will send you messages regarding this course only
and nothing else, we promise.
You can unsubscribe anytime by emailing us at:
privacy@symfonycasts.com

Echa un vistazo a nuestra entidad Starship. Es un montón de propiedades y getters y setters. Un poco aburrido, ¿verdad? ¡No tiene por qué serlo! Como las entidades son clases PHP estándar, podemos añadir métodos explícitos y significativos que describan nuestra lógica de negocio, comogoToWarp(7) o enterOrbitAround($millersPlanet). Éstos se denominan métodos de entidad enriquecida.

Vamos a probarlo y explorar sus ventajas.

Reduce la duplicación

Nuestra lógica de facturación Starship vive actualmente en el método ShipCheckInCommand::execute(). Después de obtener el barco, actualizamos sus arrivedAt y status. ¿Y si, en el futuro, añadimos un controlador de facturación? Tendríamos que duplicar esta lógica allí. Y si la lógica de "registro" cambia -por ejemplo, si necesitamos actualizar otro campo-, tendríamos que acordarnos de cambiarla en varios sitios. Eso no es ciencia ficción.

Añadir un método Starship::checkIn()

La mejor manera es trasladar, o encapsular, esta lógica de registro a un método de la entidad. Abre src/Entity/Starship.php y desplázate hasta el final. Crea un nuevo: public function checkIn(). Haz que acepte un?\DateTimeImmutable $arrivedAt = null opcional y que devuelva static, que es una forma elegante de decir "devuelve el objeto actual":

168 lines | src/Entity/Starship.php
// ... lines 1 - 10
class Starship
{
// ... lines 13 - 159
public function checkIn(?\DateTimeImmutable $arrivedAt = null): static
{
// ... lines 162 - 165
}
}

return $this:

168 lines | src/Entity/Starship.php
// ... lines 1 - 10
class Starship
{
// ... lines 13 - 159
public function checkIn(?\DateTimeImmutable $arrivedAt = null): static
{
// ... lines 162 - 164
return $this;
}
}

Arriba, añade la lógica de comprobación: $this->arrivedAt = $arrivedAt, y si no se ha pasado, ?? new \DateTimeImmutable('now'). A continuación, $this->status = StarshipStatusEnum::WAITING:

168 lines | src/Entity/Starship.php
// ... lines 1 - 10
class Starship
{
// ... lines 13 - 159
public function checkIn(?\DateTimeImmutable $arrivedAt = null): static
{
// ... lines 162 - 164
return $this;
}
}

Utilizando el método Starship::checkIn()

Vuelve a ShipCheckInCommand y sustituye la lógica por $ship->checkIn():

57 lines | src/Command/ShipCheckInCommand.php
// ... lines 1 - 17
class ShipCheckInCommand extends Command
{
// ... lines 20 - 33
protected function execute(InputInterface $input, OutputInterface $output): int
{
// ... lines 36 - 47
$ship->checkIn();
// ... lines 49 - 54
}
}

Vaya, ¡está claro! Ahora el comando se lee como una historia: "Encuentra la nave y regístrala".

Para asegurarte de que sigue funcionando, vuelve a la página principal y actualízala. Encuentra una nave que no esté "esperando"... Allá vamos: "Pirata Estelar". Haz clic en ella y copia el slug de la URL. De vuelta a tu terminal, Ejecuta:

symfony console app:ship:check-in

pega el slug, ¡y ejecuta! ¡Éxito! De vuelta en la aplicación, actualiza. ¡Perfecto! La nave está ahora marcada como "esperando" y ha llegado hace 6 segundos.

Si te encuentras repitiendo operaciones comunes en tus entidades, considera la posibilidad de añadir, y luego utilizar, un método que describa el trabajo que se está realizando. Es una victoria fácil para la legibilidad y la mantenibilidad.

Bien tripulación, ¡eso es todo para este curso de Fundamentos de Doctrine! Si quieres mejorar tus conocimientos de Doctrine, busca "Doctrine" en SymfonyCasts para encontrar cursos más avanzados. La documentación de Doctrine también es un gran recurso. Y como siempre, si tienes alguna pregunta, estamos a tu disposición en los comentarios.

hasta la próxima, ¡feliz programación!