This course is still being released! Check back later for more chapters.

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
Login to bookmark this video
Buy Access to Course
08.

Tecnología alienígena para accesorios: Fundición y Falsificación

|

Share this awesome video!

|

Keep on Learning!

With a Subscription, click any sentence in the script to jump to that part of the video!

Login Subscribe

Estamos 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'):

133 lines | src/Factory/StarshipFactory.php
// ... 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:

133 lines | src/Factory/StarshipFactory.php
// ... 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):

133 lines | src/Factory/StarshipFactory.php
// ... 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, statusy arrivedAt:

39 lines | src/DataFixtures/AppFixtures.php
// ... 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:

39 lines | src/DataFixtures/AppFixtures.php
// ... 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):

41 lines | src/DataFixtures/AppFixtures.php
// ... 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.