The Pokedex Project(9) — Configurando nuestro backend. Parte 2.
Anteriormente configuramos nuestro Model con Eloquent, ahora toca el turno de crear y codificar al Controller. Como se había comentado el modelo que creamos(manejado por Eloquent) pertenece a la M del patrón MVC. Ahora codificaremos la C del MVC.
Creando nuestro Controller.
Para crear nuestro controller primero crearemos la interfaz en la siguiente ruta en app/Controllers:
Copiar código:cd app && mkdir Controllers && touch Controller.php
Codificaremos nuestra interfaz:
Copiar código:<?php
namespace App\Controllers;
interface Controller
{
public function index();
public function show();
}
Creamos nuestro controller:
Copiar código:touch PokemonController.php
Codificamos nuestro controller:
Copiar código:<?php
namespace App\Controllers;
class PokemonController implements Controller
{
public function index()
{
}
public function show()
{
}
}
Agregando la vista al metodo index()
Nuestro método index() del PokemonController sera nuestro punto de entrada en nuestra app. Para esto le agregaremos una vista y le pasaremos los registros de la base de datos para imprimirlos en la misma.
Agregamos la vista de pokedex.html:
Copiar código:public function index()
{
view('pokedex.html', ['pokemons' => Pokemon::all()->toArray()]);
}
Modificamos la ruta ‘/’ en el archivo de rutas, lo ligaremos a nuestro controller:
Copiar código:$route->add('/', 'PokemonController@index');
Modificamos nuestro html de la vista:
Copiar código:{% extends "layouts/app.html" %}
{% block content %}
<h1>Welcome to Pokedex!</h1>
<h3>Pokemons</h3>
<ul>
{% for pokemon in pokemons %}
<li>{{ pokemon['name'] }}</li>
{% endfor %}
</ul>
{% endblock %}
Deberíamos de ver algo así:
Refactorizando el controller.
Por responsabilidad única, nuestro controller solo debe procesar las peticiones y respuestas del cliente.
Si dejamos nuestros métodos del Eloquent dentro de los métodos del controller, pudiera ocurrir que en algún momento nos pidan alguna lógica del negocio sobre los datos que regresa nuestro modelo y nuestro contoller pudiera quedar así:
Toda esa lógica de negocio se puede encapsular en el repositorio o alguna clase, inclusive la clase Request puede hacer esa validación.
Refactorizando nuestro controller por medio del patrón Repositorio.
Según Microsoft el patrón Repositorio es lo siguiente:
Los repositorios son clases o componentes que requieren o ejecutan la lógica necesaria para acceder a la capa de datos.
Sabiendo esto crearemos una clase repositorio sobre nuestro modelo, con esto refactorizaremos nuestro controller y ya podemos agregar lógica de negocio en el repositorio y así mantenemos limpios nuestros controllers.
Creamos los archivos de la interfaz y la clase del repositorio:
Copiar código:cd app && mkdir Repositories && cd Repositories && touch PokemonRepository.php
Codificamos nuestra interfaz:
Copiar código:<?php
namespace App\Repositories;
interface Repository
{
public function all();
}
Codificamos nuestro repositorio:
Copiar código:<?php
namespace App\Repositories;
use App\Models\Pokemon;
class PokemonRepository implements Repository
{
public function all()
{
return Pokemon::all()->toArray();
}
}
Nuestro repositorio lo llamamos desde el controller:
Copiar código:protected $repository;
public function __construct()
{
$this->repository = new PokemonRepository();
}
public function index($params = null)
{
view('pokedex.html', ['pokemons' => $this->repository->all()]);
}
Creamos la propiedad “repository” y la inicializamos en el constructor del controller con el repositorio. Y simplemente mandamos a llamar el método all(); que aunque sea igual al del modelo, aquí ya podremos incluir lógica de negocio y no tener el código desordenado por todo el controller.
Con esto refactorizamos nuestro controller, y tenemos un código limpio y elegante.
Ya puedes leer nuestro siguiente capitulo, en el empezaremos a desarrollar nuestro front end: https://link.medium.com/DRNXl6TIVab
Pueden consultar el código de esta publicación en este repositorio: https://github.com/krsrk/pokedex-vanilla-php
Si les gusto la publicación denle claps, likes y comentarios.