Seeding
La majoria d’aplicacions requereixen tenir un mínim de dades inicialitzades en la base de dades, això és el que s’anomena Database seeding, un mecanisme simple per afegir dades dins la base de dades. Resulta especialment útil durant el procés de desenvolupament per publicar dades d’exemple dins la base de dades, però molts cops no es limita únicament a això, ja que les aplicacions un cop passen a producció necessiten tenir informació bàsica per iniciar-se. Els seeders serveixen per incloure informació estàtica dins l’aplicació per exemple en el procés de migració, com els països, codis postals entre altres dades.
Els Database seeds són classes que únicament tenen un mètode anomenat run() i que extenen la classe CodeIgniter\Database\Seeder. Dins d’aquest mètode podrem crear qualsevol tipus de dada per inserir-lo a la base de dades mitjançant $this->db o $this.>forge. Els arxius dels seeders s’emmagatzemen dins app/Database/Seeds. Com en la majoria de Frameworks i components de CodeIgniter, el nom de l’arxiu ha de coincidir amb el nom de la classe.
En els components de CodeIgniter, el nom de l’arxiu ha de coincidir amb el nom de la classe
Crear un seeder
CodeIgniter ens proporciona l’eina spark que mitjançant el paràmetre make:seeder ens crea automàticament l’arxiu Seeder requerit.
php spark make:seeder NOM
# En ocasions ens pot interessar incloure el sufix
# per diferenciar la classe generada de la resta
php spark make:seeder NOM --suffix
FakerPHP és una llibreria de PHP que genera informació falsa. D'aquesta forma si necessitem crear informació aleatòria per inicialitzar la base de dades podem emprar-la. Així mateix, és una llibreria que ens pot servir per fer els tests unitaris o tests d'estrès d'una aplicació.
La llibreria FakerPHP es troba integrada dins CodeIgniter com un Factory per tal que sigui possible inicialitzar qualsevol component dels nostres projectes o es puguin fer els tests anteriorment esmentats.
Lloc web de FakerPHP https://fakerphp.github.io/
Per al nostre exemple crearem un seeder que ens crearà entrades al blog, primerament amb l’eina spark crearem el seeder.
php spark make:seeder BlogData --suffix
Aquest seeder que es trobarà ubicat dins la carpeta app/Databases/Seeders li assignarem el codi següent:
<?php
namespace App\Database\Seeds;
use CodeIgniter\Database\Seeder;
class BlogDataSeeder extends Seeder
{
// Metode run que crearia informació de forma estàtica
public function run()
{
for ($i = 0; $i < 10; $i++) {
$data = [
'blog_title' => "titol " . $i,
'blog_description' => "descripcio " . $i
];
$this->db->table('blog')->insert($data);
}
}
}
Per donar-li més versemblança, el millor seria emprar la llibreria FakePHP, en aquest cas el codi hauria de variar lleugerament.
// Per emprar el Factory FakePHP cal incloure
// la llibreria, per fer-ho emprarem la sentència use
use Faker\Factory;
public function run()
{
$fake = Factory::create("es_ES");
for ($i = 0; $i < 10; $i++) {
$data = [
'blog_title' => $fake->sentence(6),
// $fake->realText(length) ens dona text
// segons el idioma definit en create
// i amb la longitud especificada
'blog_description' => $fake->text(100)
];
$this->db->table('blog')->insert($data);
// Produces:
// INSERT
// INTO blog (blog_title, blog_description)
// VALUES ('{$title}', '{$desc}')
}
}
La llibreria ens permet generar informació segons l'idioma que definim en la inicialització del faker, això ens permetrà generar números de telèfon vàlids o dades identificatives relatives a un país concret, per exemple DNI, per a més informació podeu consultar la documentació oficial de la llibreria.
Utilització d’un seeder
Un cop tenim creat el seeder caldrà executar-lo per així inicialitzar la base de dades, aquesta tasca la podrem realitzar emprant spark o mitjançant la crida al servei de seeds que proporciona CodeIgniter.
php spark db:seed NomClasseSeed
# En el projecte, hem de recordar
# si la classe conté suffix, ja que s'haurà
# d'incloure igualment
php spark db:seed BlogDataSeeder
Seeder install
En algunes ocasions necessitarem crear un seeder únic a tall d'instal·lador, en aquest cas, el seeder farà crides successives als seeders que tingui el projecte.
namespace App\Database\Seeds;
use CodeIgniter\Database\Seeder;
class Install extends Seeder
{
public function run()
{
$this->call("CLASS_SEEDER_NAME1");
$this->call("CLASS_SEEDER_NAME2");
$this->call("CLASS_SEEDER_NAME3");
}
}
Per executar-lo,
php spark db:seed install
Si la tasca d’inicialització de la base de dades anés a càrrec d’un controlador, llavors hauríem de fer la crida a l'objecte Seeders de CodeIgniter.
$seeder = \Config\Database::seeder();
$seeder->call('CLASS_SEEDER_NAME');
Instal·lació FakerPHP
La llibreria FakerPHP es troba instal·lada per defecte dins de CodeIgniter i està disponible per instal·lar-la en molts altres Frameworks. FakePHP requereix tenir instal·lat PHP >=7.1
En cas que la llibreria no estigui instal·lada haurem de fer-ho a través de l’eina composer.
# Actualitzar tots els components
> composer update
# Instal·lar PHPFaker
> composer require fakerphp/faker
# Instal·lar PHPFaker nomes per desenvolupament
> composer require fakerphp/faker --dev