Refactorizador cuántico: Entidades ricas
Lucky you! You found an early release chapter - it will be fully polished and published shortly!
This Chapter isn't quite ready...
Rest assured, the gnomes are hard at work
completing this video!
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":
// ... lines 1 - 10 | |
class Starship | |
{ | |
// ... lines 13 - 159 | |
public function checkIn(?\DateTimeImmutable $arrivedAt = null): static | |
{ | |
// ... lines 162 - 165 | |
} | |
} |
return $this
:
// ... 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
:
// ... 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()
:
// ... 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!