The Pokedex Project — Creando migraciones, controllers, models y rutas con Laravel (3)
Ya con nuestro ambiente de desarrollo configurado en la publicación anterior; ahora tendremos que desarrollar nuestra capa de datos(migrations, models) y donde se va a desarrollar nuestras peticiones y lógica de negocio(controllers).
La publicación pasada la puedes revisar aquí:
Creando y codificando las migraciones.
Las migraciones es algo importante en el proyecto ya que por medio de código, se codifica la estructura de nuestras tablas donde vamos a guardar la información del Pokedex. También se pueden hacer migraciones en donde solamente afecten ciertos cambios en una tabla como por ejemplo al momento de agregar un nuevo campo en la tabla.
Laravel ya tiene un comando para crear migraciones entonces como es de costumbre ejecutamos artisan, pero ahora sobre “Sail”:
sail artisan make:migration create_pokemons_table
Este comando nos creará nuestro archivo para codificar las migraciones en la ruta database/migrations de nuestro proyecto, lo abrimos con nuestro IDE y veremos algo como esto:
Si lo analizamos es una clase con dos métodos (up() y down()), el método up() creará una tabla con las características mencionadas dentro de la clase Schema del método estático create().
El método down() por el contrario si revocamos o reiniciamos las migraciones borrara la tabla y toda su información.
Programamos entonces la estructura de la tabla en el método up() con lo siguiente:
class CreatePokemonsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pokemons', function (Blueprint $table) {
$table->id();
$table->string('code', 6);
$table->string('name', 200);
$table->string('description', 256);
$table->decimal('height', 6, 2);
$table->decimal('weight', 6, 2);
$table->string('ability', 256);
$table->timestamps();
});
}
Ejecutamos las migraciones:
sail artisan migrate
Si revisamos nuestra base de datos ya deberíamos tener la tabla creada
Si por alguna razón nos equivocamos al codificar nuestras migraciones, Laravel tiene comandos para manipular estas situaciones:
Si queremos borrar la migración mas actual ejecutamos:
sail artisan migrate:rollback
Si queremos borrar cierto número de migraciones:
sail artisan migrate:rollback --step=5
Si queremos borrar todas las migraciones en la base de datos:
sail artisan migrate:reset
Si queremos borrar y crear de nuevo nuestras migraciones:
sail artisan migrate:refresh
Creando Seeds para agregar datos a nuestra tabla
Laravel también tiene un módulo donde podemos llenar nuestra tabla o tablas de información aleatorio o la que nosotros le indiquemos, todo esto a nivel de código, y nada mas ejecutamos el comando respectivo para hacer esta tarea; a esto se llama Seeds.
Para crear un Seed ejecutamos el siguiente comando:
sail artisan make:seeder PokemonSeeder
Nos crea un archivo que se encuentra en la ruta database/seeders, y por default tiene el siguiente contenido:
Como imaginamos el método run() es donde vamos a poner la lógica de negocio para llenar nuestra tabla, entonces modificamos el método y ponemos lo siguiente:
class PokemonSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$pokemons = [
[
'code' => '001',
'name' => 'Bulbasaur',
'description' => 'This is pokemon Bulbasaur',
'height' => 10.5,
'weight' => 30.5,
'ability' => 'Can fight to others pokemons'
],
[
'code' => '006',
'name' => 'Charizard',
'description' => 'This is pokemon Charizard',
'height' => 10.5,
'weight' => 30.5,
'ability' => 'Can fight to others pokemons'
],
[
'code' => '025',
'name' => 'Pikachu',
'description' => 'This is pokemon Pikachu',
'height' => 10.5,
'weight' => 30.5,
'ability' => 'Can fight to others pokemons'
],
[
'code' => '007',
'name' => 'Squirtle',
'description' => 'This is pokemon Squirtle',
'height' => 10.5,
'weight' => 30.5,
'ability' => 'Can fight to others pokemons'
],
[
'code' => '026',
'name' => 'Raichu',
'description' => 'This is pokemon Raichu',
'height' => 10.5,
'weight' => 30.5,
'ability' => 'Can fight to others pokemons'
],
];
foreach ($pokemons as $pokemon) {
DB::table('pokemons')->insert($pokemon);
}
}
}
Abrimos el archivo DatabaseSeeder.php y en el método run() le ponemos lo siguiente:
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// \App\Models\User::factory(10)->create();
$this->call([
PokemonSeeder::class,
]);
}
}
Ejecutamos el seed:
sail artisan db:seed
Revisamos la base de datos y ya deberíamos de tener nuestros registros en la tabla
Si queremos reconstruir nuestras migraciones y aparte ejecutar nuestros seeds, simplemente ejecutamos:
sail artisan migrate:refresh --seed
Creando el modelo y el controller
Siguiendo la misma dinámica que nos pone Laravel para crear el modelo y el controlador existen comandos, esto nos ahorra mas el tiempo de desarrollo al crear estos componentes.
Creando el modelo
Para crear el modelo ejecutamos:
sail artisan make:model Pokemon
Y para el controller:
sail artisan make:controller PokemonController
Estos comandos nos crearán los archivos respectivos para el modelo (app/Models) y el controller (app/Http/Controllers)
Codificando el modelo y el controller
Abrimos el archivo del modelo (app/Models/Pokemon.php) y le agregamos lo siguiente:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Pokemon extends Model
{
use HasFactory;
protected $table = 'pokemons';
}
Abrimos el archivo del controller(app/Http/Controllers/PokemonController.php) y le agregamos lo siguiente:
<?php
namespace App\Http\Controllers;
use App\Models\Pokemon;
use Illuminate\Http\Request;
class PokemonController extends Controller
{
public function index()
{
return response()->json(Pokemon::all(), 200);
}
}
Ahora ya nuestro controller esta ligado con el model, simplemente habrá que configurar la ruta para que haga la petición y ver la respuesta del método index() del controller.
Configurando la ruta.
Para hacer esto abrimos el archivo de las rutas(routes/web.php) y agregamos la siguiente linea de código:
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/pokemons', [\App\Http\Controllers\PokemonController::class, 'index']);
Una vez hecho esto, probamos en el browser y nos debería de arrojar en formato JSON los datos de la tabla:
La configuración de la ruta es muy fácil en Laravel y se parece a lo que se desarrollo con el Pokedex con PHP puro, o al menos ese fue el motivo de desarrollarlo de esa manera en ese Pokedex.
Con el desarrollo de estas características, ya tenemos nuestro backend desarrollado. Como hemos visto es muy fácil desarrollar con Laravel la parte del back-end. En las siguiente publicación nos dedicaríamos totalmente al front-end.
Puedes revisar el código fuente de estas publicaciones aquí: