Durante el proceso de desarrollo de nuestra aplicación en CakePHP estaremos constantemente probando cada una de las funcionalidades del mismo, por ejemplo: si tenemos un módulo de usuarios es necesario poder gestionarlos desde un panel o lista de usuarios, entre ellos probar funcionalidades como ver o editar su perfil, verificar si estos pueden ser eliminados o darlos de baja y desde luego también probar funcionalidades básicas como una paginación o poder filtrar usuarios mediante un buscador. Es por ello la importancia de tener una cierta cantidad de registros poblados en nuestra base de datos con el fin de poder verificar si los features que nosotros desarrollamos están funcionando correctamente o también poder ver como rinde nuestra aplicación ante una gran cantidad de registros.
Es acá donde entra en acción los Seeders, estos nos van ayudar a generar de una manera bastante sencilla grandes cantidades de datos, así no estaremos invirtiendo tiempo en cargar nuestros propios datos con nombres de nuestros amigos o nombres ficticios uno por uno, sino que gracias a la implementación de los Seeders y la programación orientada a objetos seremos capaces de generar decenas de registros en tan solo segundos.
CakePHP 3 utiliza un plugin para generar migraciones que fue desarrollado por la misma comunidad del framework, las migraciones es otro concepto que nos ayuda a mantener distintas versiones de nuestras tablas de la base de datos, a su vez este plugin esta basado en la librería Phinx el cual ademas de tener el propósito anteriormente mencionado también nos ayuda a crear Seeders. Es por ello que a partir de la versión 3.2 del framework tenemos a disposición la funcionalidad para generar nuestros propios Seeders y eso es lo que aprenderás en este tutorial.
Importante: Durante el curso de CakePHP 3 hemos implementado los Seeders de manera distinta ya que para aquel entonces utilizamos la versión 3.1.7 del framework el cual no contenía comandos específicos para generar Seeders. Entonces este tutorial también será útil para reforzar esta parte del curso, ya que ahora utilizaremos los comandos que nos ofrece las nuevas versiones del framework.
Vamos a trabajar en una aplicación para gestionar usuarios, como en este tutorial solo nos enfocaremos en la parte de los Seeders entonces vamos asumir que ya tenemos una instalación de CakePHP 3 y una base de datos con una tabla llamada users , si tienes cualquier duda respecto a esta parte inicial recuerda que tienes a tu disposición un curso completo de CakePHP 3 totalmente gratuito, de todas formas al final de este tutorial te dejaré un enlace para acceder al repositorio de todo el código que desarrollemos en el tutorial, entonces comencemos 8-)
Uso de Seeders para cargar registros en CakePHP 3
– Inicialmente quiero mostrar la estructura de la tabla users que vamos a poblar con los Seeders:
Esta tabla la he generado con una migración el cual también será parte del código que compartiré.
– Para generar nuestro primer Seed vamos a dirigirnos a la línea de comandos y dentro del directorio de nuestro proyecto vamos a ejecutar la siguiente sentencia:
1 |
bin/cake bake seed Admin |
Con esta sentencia crearemos un archivo AdminSeed.php dentro del directorio config/Seeds, dentro de dicho archivo ya estará creado por defecto una clase AdminSeed y un método run() que es en este último donde debemos colocar la definición de nuestro Seed. Vamos a suponer que nuestra aplicación tendrá un único usuario de tipo administrador (admin) para gestionar a todos los usuarios, por eso mismo vamos a definir nuestro Seed de la siguiente manera:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php use Migrations\AbstractSeed; use Cake\Auth\DefaultPasswordHasher; /** * Admin seed. */ class AdminSeed extends AbstractSeed { public function run() { $hasher = new DefaultPasswordHasher(); $password = $hasher->hash('secret'); $data = [ 'first_name' => 'Edson', 'last_name' => 'Mollericona', 'username' => 'edson', 'email' => 'ed@edsonmm.com', 'password' => $password, 'role' => 'admin', 'active' => 1, 'created' => date("Y-m-d H:i:s"), 'modified' => date("Y-m-d H:i:s") ]; $table = $this->table('users'); $table->insert($data)->save(); } } |
Cómo puedes observar toda la lógica y generación de nuestro Seed lo hacemos dentro del método run() , inicialmente estamos importando la clase DefaultPasswordHasher que forma parte del núcleo del framework el cual nos va ayudar a encriptar la contraseña de nuestro usuario administrador, es por ello que dentro del método run() creamos una instancia de la clase anteriormente mencionada para posteriormente llamar al método hash() el cual nos va encriptar el texto ‘secret’ que corresponde a la contraseña de nuestro administrador y eso lo almacenamos en la variable $password. Después estamos creando un arreglo $data el cual contendrá cada uno de los campos que forma parte de la tabla users con sus respectivos valores a poblar, ya casi por finalizar puedes observar que utilizamos el método table() para definir en el mismo la tabla a la cual aplicaremos el Seed, finalmente utilizamos los métodos insert() y save() con la data de nuestro usuario a poblar.
– Hasta acá ya tenemos preparado nuestro Seed, solo nos falta ejecutarlo y para ello vamos a dirigirnos nuevamente a la línea de comandos y colocaremos la siguiente sentencia:
1 |
bin/cake migrations seed |
Esta sentencia ejecutará todos los Seeds que se encuentra en el directorio Seeders, por el momento solamente tenemos uno y es el que nos servirá para crear nuestro usuario administrador de la aplicación. Como resultado obtendrás un nuevo registro dentro de la tabla users el cual lo puedes verificar con una herramienta como phpMyAdmin u otra de tu preferencia:
Bueno se que al principio te dije que con los Seeders podemos crear decenas de datos pero ahora solo estamos creando un solo registro que fácilmente lo podíamos haber hecho desde el propio phpMyAdmin o la línea de comandos con una sentencia SQL… No te preocupes que este solo fue un acercamiento para crear nuestro primer Seeder.
– Ya que nosotros queremos probar nuestro módulo de usuarios con varios registros entonces vamos a hacer uso de la librería Faker, esta librería nos provee de varios métodos para poder generar datos ficticios de manera aleatoria y rápida, dicho esto entonces vamos a instalar la librería dentro de nuestro proyecto y para ello vamos a hacer uso de composer dentro de nuestra línea de comandos:
1 |
composer require fzaninotto/faker |
– Una vez instalado Faker vamos a crear un nuevo Seed para genera nuestros usuarios:
1 |
bin/cake bake seed Users |
Esto nos creará un nuevo Seed llamado UsersSeed.php
– A continuación implementamos todo el contenido del método run() de nuestro nuevo seeder:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php use Migrations\AbstractSeed; use Cake\Auth\DefaultPasswordHasher; /** * Users seed. */ class UsersSeed extends AbstractSeed { public function run() { $hasher = new DefaultPasswordHasher(); $password = $hasher->hash('secret'); $faker = Faker\Factory::create(); $data = []; for ($i = 0; $i < 200; $i++) { $data[] = [ 'first_name' => $faker->firstName(), 'last_name' => $faker->lastName(), 'username' => $faker->userName, 'email' => $faker->email, 'password' => $password, 'role' => $faker->randomElement($array = array ('user','editor')), 'active' => $faker->boolean, 'created' => date("Y-m-d H:i:s"), 'modified' => date("Y-m-d H:i:s") ]; } $table = $this->table('users'); $table->insert($data)->save(); } } |
Puedes observar que a diferencia de nuestro primer Seed, este utiliza el objeto Factory de Faker para poder hacer uso del método create() que nos va permitir crear todos nuestros registros. Importante también destacar que en este Seed utilizamos un ciclo for el cual nos va servir para iterar la cantidad de registros que deseemos, en este caso vamos a crear 200 usuarios, dentro de este ciclo puedes observar que utilizamos los distintos métodos y propiedades que nos provee Faker para poblar nuestra tabla de usuarios y finalmente hacemos uso de los métodos insert() y save() para generar nuestro seeder.
Dentro de la documentación de Faker puedes revisar la gran variedad de registros que podemos crear, como por ejemplo: nombres de usuario, correos electrónicos, números telefónicos, parrafos, sentencias aleatorias y muchos otros más.
– Una vez creado e implementado nuestro nuevo Seed ahora si es momento de ejecutarlo volviendo a nuestra línea de comandos escribimos la sentencia para ejecutar nuestro Seed:
1 |
bin/cake migrations seed --seed UsersSeed |
De seguro te diste cuenta que en esta sentencia utilizamos la bandera –seed , este nos es útil por si queremos ejecutar un seeder en concreto, en este caso UsersSeed ya que nosotros ejecutamos anteriormente el Seed para generar nuestro usuario administrador entonces no necesitamos volver a ejecutarlo y es por ello que utilizamos esta bandera para solamente ejecutar nuestro último Seeder creado.
– Listo! como resultado obtendremos nuestros 200 usuarios generados mas 1 usuario administrador:
Como te pudiste dar cuenta con tan solo una sentencia en la línea de comandos hemos creado una gran cantidad de registros para probar nuestra aplicación 8-)
– En este tutorial te mostré dos distintas maneras de ejecutar un Seeder pero de seguro en tu aplicación tendrás mas Seeders de los que mostramos en este tutorial y de seguro también queras ejecutarlos una sola vez y no uno por uno. Para ello puedes seguir utilizando la sentencia bin/cake migrations seed el cual ejecutará todos tus seeders creados y es acá donde debes tener cuidado con el orden ya que por defecto la ejecución de cada uno de tus seeders lo realizará en un orden alfabético. Aún así tu puedes indicarle el orden de la ejecución de tus Seeders de acuerdo a la lógica que cumplan los mismos y eso lo puedes hacer con el método call() en el que puedes definir como parámetro de este método el nombre del Seed a ejecutar.
– Basándonos en nuestro módulo de usuarios vamos a suponer que necesitamos ejecutar primero el Seeder que crea nuestro usuario administrador y después el otro Seeder que crea nuestros 200 usuarios, para ello vamos a crear un nuevo Seeder llamado DatabaseSeed:
1 |
bin/cake bake seed Database |
– A diferencia de nuestros anteriores Seeders creados este será un tanto particular por su contenido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php use Migrations\AbstractSeed; /** * Database seed. */ class DatabaseSeed extends AbstractSeed { public function run() { $this->call('AdminSeed'); $this->call('UsersSeed'); } } |
Como puedes observar este Seed solamente contendrá las llamadas a los otros Seeders en el orden que nosotros queramos, con el método call() podemos ir definiendo cada uno de los Seeders que se ejecutarán.
– Listo! si asumimos que tenemos nuestra tabla users vacía entonces solamente necesitamos ejecutar el Seed DatabaseSeed y nada más, este ya se encargara de ejecutar todos los Seeders que definimos dentro de este archivo:
1 |
bin/cake migrations seed --seed DatabaseSeed |
– Si revisamos phpMyAdmin podemos ver que obtenemos el mismo resultado:
Entonces esta es otra manera en la que podemos ejecutar todos nuestros seeders a partir de uno solo.
– Ya para finalizar que te parece si rápidamente creamos nuestro módulo básico de usuarios para poder observar el listado de nuestros 201 usuarios funcionando. Para ello vamos hacer uso de la línea de comandos escribiendo la siguiente sentencia:
1 |
bin/cake bake all Users |
Este sentencia me encanta ya que nos va crear toda la estructura básica de nuestro módulo de usuarios como ser la parte del controlador, modelo y sus respectivas vistas 8-)
– Listo! ahora nos dirigimos a nuestro navegador y escribimos la ruta para ver la lista de nuestros usuarios, en mi caso tengo creado un virtual host con el nombre cake_seed.app, entonces la ruta sería http://cake_seed.app/users ó en su defecto http://localhost/cake_seed/users y podemos ver la lista de todos nuestros usuarios generados:
Y gracias al generador de código Bake podemos probar rápidamente cada una de las funcionalidades de nuestro módulo.
En conclusión:
Los seeders son muy útiles para probar las distintas funcionalidades de nuestra aplicación ante una gran cantidad de datos, de esa manera nos ahorramos mucho tiempo en ir creando nuestros propios datos de prueba. No olvides ir revisando cada uno de los enlaces que te dejé a lo largo de este tutorial para ir conociendo mas sobre los Seeders. Al final de este artículo te dejo el enlace a un repositorio en GitHub en el que podrás encontrar todo el código implementado en el tutorial.
Espero que te haya sido útil este tutorial y a partir de ahora puedas crear y generar tus propios Seeders dentro de tus aplicaciones en CakePHP 3. Antes de irte quiero pedirte por favor que compartas este tutorial para que mi trabajo llegue a mas personas, así mismo quiero invitarte a seguir el curso gratuito de CakePHP 3 para conocer mas características y beneficios de desarrollar con este grandioso Framework.
Saludos!!!

Amigo edson buenos dias, que gusto de ver como nos ayudas a nosotros, tenia una consulta si seguiras con este curso extendiéndolo mas ya que cake 3 es algo nuevo con muchas cosas nuevas =) saludos, aun no termino de ver todos las clases de cake3, hasta donde es su alcance? gracias saludos! :D
Hola Juan Manuel, el curso de CakePHP 3 ya está finalizado pero pienso realizar tutoriales como estos para reforzar varios conceptos, así que el aprendizaje no termina 8-) . Saludos!
Hola Edson, antes que nada, muchas gracias por el curso, de verdad es muy claro y me ha servido muchisimo… te quería hacer una consulta, estoy siguiendo el curso de cakephp 3 por youtube, pero al llegar a uso de seeders seguí la actualización hasta aquí, la pregunta es ¿como puedo hacer para que funcione el siguiente código que estoy haciendo para alimentar la tabla de bookmarks ?
https://uploads.disquscdn.com/images/3612ec489cddf4d8921516eaa683272c60356006df97da479e45b9850e18329a.png
tampoco me resulta la carga desde ubuntu
Master, tengo un problema, me sale un error
PHP fatal error: class ‘FakerFactory’ not found…
instalo la libreria tal y como dice el manual :(
espero me puedas ayudar para poder avanzar.
de antemano muchas gracias.
Revisa si tienes importado la clase Factory en tu archivo. Saludos!
hola, cuando hago la carga de los seed me aparece Fatal error: Class ‘DefaultPasswordHasher’ not found in /opt/lampp/htdocs/prueba/config/Seeds/UsersSeed.php on line 21