This course is still being released! Check back later for more chapters.
Tecnología alienígena para accesorios: Fundición y Falsificación
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 SubscribeEstamos utilizando src/DataFixtures/AppFixtures.php
para crear datos de fixture falsos. Esto funciona bien. Pero, ¿dónde está lo guay y divertido? ¿Realmente queremos escribir código manual para añadir docenas o más entidades? Puntos para ti si has respondido: ¡diablos, no!
Para que esto pase de tedioso a terrorífico, busca tu terminal y ejecuta:
Instalar Foundry y Faker
composer require --dev foundry
Desplázate hacia arriba para ver lo que se ha instalado. Los paquetes importantes son zenstruck/foundry
-como forma de crear muchas entidades rápidamente- y fakerphp/faker
-una biblioteca para crear datos falsos de forma que no tengamos que depender de lorem ipsum y de nuestra propia falta de creatividad-.
Ejecuta
git status
para ver lo que hicieron las recetas: habilitó un bundle y añadió un archivo de configuración. Esa configuración funciona bien desde el principio, así que no hace falta mirarla.
Crear una fábrica de naves estelares
Con Foundry, cada entidad puede tener una clase fábrica. Para ponerlas en marcha, ejecuta:
symfony console make:factory
Esto lista todas las entidades que aún no tienen una fábrica. Elige Starship
y... ¡éxito! Se ha creado una nueva clase StarshipFactory
. Ve a verla:src/Factory/StarshipFactory.php
.
Esta clase será muy buena para crear objetos Starship
, muy útil en caso de que vuelvan los Borg. Primero, mira este método class()
. Indica a Foundry con qué clase de entidad ayuda esta fábrica. En defaults()
es donde definimos los valores por defecto que utilizaremos al crear naves estelares. Te recomiendo que añadas valores por defecto para todos los campos obligatorios: te hará la vida más fácil.
¡Echa un vistazo a estas llamadas a self::faker()
! Así es como generamos datos aleatorios. Paraname
, captain
y class
, es texto aleatorio, status
, es unStarshipStatusEnum
aleatorio y arrivedAt
por defecto es cualquier fecha aleatoria Dado que aún no se ha inventado el viaje en el tiempo, sustituye self::faker()->dateTime()
por self::faker()->dateTimeBetween('-1 year',
'now'):
// ... lines 1 - 11 | |
final class StarshipFactory extends PersistentProxyObjectFactory | |
{ | |
// ... lines 14 - 111 | |
protected function defaults(): array|callable | |
{ | |
return [ | |
'arrivedAt' => \DateTimeImmutable::createFromMutable(self::faker()->dateTimeBetween('-1 year', 'now')), | |
// ... lines 116 - 119 | |
]; | |
} | |
// ... lines 122 - 131 | |
} |
El método text()
de Faker nos dará un texto aleatorio, pero no necesariamente interesante. En lugar de servir bajo el Capitán "desayuno de tarta de manzana", en el directorio tutorial/
, copia estas constantes y pégalas en la parte superior de la clase fábrica:
// ... lines 1 - 11 | |
final class StarshipFactory extends PersistentProxyObjectFactory | |
{ | |
private const SHIP_NAMES = [ | |
'Nebula Drifter', | |
'Quantum Voyager', | |
'Starlight Nomad', | |
// ... lines 18 - 44 | |
]; | |
// ... line 46 | |
private const CLASSES = [ | |
'Eclipse', | |
'Vanguard', | |
'Specter', | |
// ... lines 51 - 57 | |
]; | |
// ... line 59 | |
private const CAPTAINS = [ | |
'Orion Stark', | |
'Lyra Voss', | |
'Cassian Drake', | |
// ... lines 64 - 90 | |
]; | |
// ... lines 92 - 131 | |
} |
Entonces, para captain
utiliza randomElement(self::CAPTAINS)
. Paraclass
, randomElement(self::CLASSES)
y para name
, randomElement(self::SHIP_NAMES)
:
// ... lines 1 - 11 | |
final class StarshipFactory extends PersistentProxyObjectFactory | |
{ | |
// ... lines 14 - 111 | |
protected function defaults(): array|callable | |
{ | |
return [ | |
// ... line 115 | |
'captain' => self::faker()->randomElement(self::CAPTAINS), | |
'class' => self::faker()->randomElement(self::CLASSES), | |
'name' => self::faker()->randomElement(self::SHIP_NAMES), | |
// ... line 119 | |
]; | |
} | |
// ... lines 122 - 131 | |
} |
Utilizar la fábrica de naves estelares
¡Es hora de utilizar esta fábrica! En src/DataFixtures/AppFixtures.php
, en load()
, escribe StarshipFactory::createOne()
. Pásale una matriz de valores de propiedades para la primera nave: copia estos del código existente: name
, class
, captain
, status
y arrivedAt
:
// ... lines 1 - 9 | |
class AppFixtures extends Fixture | |
{ | |
public function load(ObjectManager $manager): void | |
{ | |
StarshipFactory::createOne([ | |
'name' => 'USS LeafyCruiser (NCC-0001)', | |
'class' => 'Garden', | |
'captain' => 'Jean-Luc Pickles', | |
'status' => StarshipStatusEnum::IN_PROGRESS, | |
'arrivedAt' => new \DateTimeImmutable('-1 day'), | |
]); | |
// ... lines 21 - 36 | |
} | |
} |
Y elimina el código antiguo:
// ... lines 1 - 9 | |
class AppFixtures extends Fixture | |
{ | |
public function load(ObjectManager $manager): void | |
{ | |
// ... lines 14 - 21 | |
StarshipFactory::createOne([ | |
'name' => 'USS Espresso (NCC-1234-C)', | |
'class' => 'Latte', | |
'captain' => 'James T. Quick!', | |
'status' => StarshipStatusEnum::COMPLETED, | |
'arrivedAt' => new \DateTimeImmutable('-1 week'), | |
]); | |
StarshipFactory::createOne([ | |
'name' => 'USS Wanderlust (NCC-2024-W)', | |
'class' => 'Delta Tourist', | |
'captain' => 'Kathryn Journeyway', | |
'status' => StarshipStatusEnum::WAITING, | |
'arrivedAt' => new \DateTimeImmutable('-1 month'), | |
]); | |
} | |
} |
¡Bonus! Elimina las llamadas a persist()
y flush()
: ¡Foundry se encarga de eso por nosotros!
¡Veamos qué hace esto! Recarga los accesorios:
symfony console doctrine:fixtures:load
Elige yes
y... ¡éxito! Vuelve atrás, actualiza y... parece lo mismo. ¡Buena señal! Ahora, ¡vamos a crear una flota de naves!
Crear muchas naves estelares
Para las tres primeras, pasamos una matriz de valores... pero no necesitamos hacerlo. Si no pasamos un valor, utilizará el método StarshipFactory::defaults()
. Fíjate en lo peligroso que nos hace esto: ¿acaba de aparecer un cubo Borg? Prepara 20 naves nuevas con StarshipFactory::createMany(20)
:
// ... lines 1 - 9 | |
class AppFixtures extends Fixture | |
{ | |
public function load(ObjectManager $manager): void | |
{ | |
// ... lines 14 - 37 | |
StarshipFactory::createMany(20); | |
} | |
} |
De vuelta en el terminal, carga de nuevo los accesorios:
symfony console doctrine:fixtures:load
Y en la aplicación, actualiza y... ¡fíjate! Ahora hay toda una flota de naves, y sí, ¡todas tienen datos aleatorios!
Ahora que los datos falsos parecen más reales, me pregunto: ¿y si nuestra aplicación se ejecutara en una enorme base estelar con cientos o miles de naves? Esto sería una página muy larga. A continuación, paginaremos estos resultados en trozos más pequeños.