Refactorizador cuántico: Entidades ricas
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login SubscribeEcha 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 | |
{ | |
$this->arrivedAt = $arrivedAt ?? new \DateTimeImmutable('now'); | |
$this->status = StarshipStatusEnum::WAITING; | |
// ... lines 164 - 165 | |
} | |
} |
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!
Hi again,
Just after
the code from previous paragraph is placed.
BR
Cezary