Patrón MVC en laravel

Author
By Darío Rivera
Posted on 2019-07-03 in Laravel
Tags   Laravel 5.8 Laravel 6x

MVC (modelo, vista, controlador) es un patrón arquitectónico de software que separa una aplicación en tres capas descritas como su acrónimo lo indica. Laravel, así como la mayoría de frameworks en PHP implementan este patrón de diseño en donde cada capa maneja un aspecto de la aplicación. Pero antes de ver cómo Laravel está diseñado para implementar este patrón de software, vamos a tratar de dejar este concepto un poco más claro definiendo cada una de sus partes.

Modelo: Hace referencia a la estructura de datos de la aplicación. Los datos pueden ser transferidos desde la base de datos, una clase, un servicio, u otros, directamente a la vista o ser transformados en el controlador para ser actualizados nuevamente al origen.

Vista: Es la representación de la información en una interfaz de usuario. Por lo general en interfaces no estáticas se representan los datos que vienen directamente del modelo o estos son transformados en un proceso intermedio en el controlador. En vistas estáticas por lo general no hace falta que las vistas sean renderizadas con datos enviados del controlador.

Controlador: Es el lugar en donde se implementa la lógica de la aplicación, los procedimientos, algoritmos y rutinas que hacen que funcione el software. Actúa como interfaz entre los componentes de modelo y vista aplicando las transformaciones y lógica necesarias.

MVC en Laravel

El MVC en laravel está implementado de la siguiente manera. En una aplicación web, los controladores estarán situados en la carpeta app/Http/Controllers, los modelos directamente en app y las vistas en resources/views. Para crear un nuevo controlador, basta ejecutar el comando

php artisan make:controller HelloWorld

Este comando creará el archivo app/Http/Controllers/HelloWorld.php que tendrá el siguiente contenido.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloWorld extends Controller
{
    //
}

Por supuesto si conoces de antemano esta estructura puedes crear el controlador tú mismo. Para mí es mucho más dinámico crearlo desde artisan y te recomiendo que siempre que puedas utilices este comando que brinda laravel. Como se puede ver este comando se creó un controlador que hereda directamente de la clase App\Http\Controllers de laravel. Para que nuestro controlador sea funcional vamos a agregar el siguiente método.

public function sayHello()
{
    return view('hello');
}

Los métodos en los controladores de laravel por lo general suelen retornar arrays, objetos o vistas. En este caso, hemos utilizamos el helper view para retornar la vista hello la cual crearemos a continuación.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>App title</title>
<body>
    <h1>HELLO WORLD!</h1>
</body>
</html>

Este archivo debe ser guardado con el nombre hello.blade.php en la carpeta resources/views. Finalmente vamos a agregar la siguiente línea en el archivo routes/web.php para poder acceder al método sayHello el cuál nos retornará la vista hello.

Route::get('/helloworld', 'HelloWorld@sayHello');

Al acceder a la ruta /helloworld junto con el dominio raíz de tu aplicación en el navegador deberá visualizarse el mensaje HELLO WORLD!. Puedes probar esto antes de seguir con lo que viene a continuación. 

Para agregar el componente del modelo, ejecutaremos el siguiente comando en la terminal

php artisan make:model Hello

Esto creará el archivo app/Hello.php con el siguiente contenido

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Hello extends Model
{
    //
}

Después de esto agregaremos el siguiente método a nuestro modelo para retornar el saludo.

public static function helloWorldMessage()
{
    return "HELLO WORLD!";
}

De seguido haremos la siguiente adecuación en el controlador para enviar el mensaje del modelo a la vista.

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Hello;  // aquí importamos el modelo

class HelloWorld extends Controller
{
    public function sayHello()
    {
        return view('hello', ["message" => Hello::helloWorldMessage()]);
    }
}

Finalmente harmeos la siguiente adecuación en la vista para imprimir el mensaje enviado por el controlador.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>App title</title>
<body>
    <h1> {{ '\{\{ $message \}\}' }} </h1>
</body>
</html>

Y con esto al acceder nuevamente a la ruta /helloworld veremos nuevamente el mensaje HELLO WORLD! esta vez traído directamente desde nuestro modelo. Hasta la próxima!.


Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.