Controladores en Laravel
En uno de nuestros primeros posts explicamos cómo está implementado el patrón MVC en laravel, el día de hoy veremos un poco más a fondo el componente de los controladores. Te recomiendo enteramente tener un proyecto limpio de laravel para que puedas probar los conceptos aquí aprendidos, recuerda que el cerebro humano aprende en un 80% practicando y solo un en un 20% leyendo (según investigaciones). Si ya leíste nuestro post instalación laravel puedes iniciar un proyecto en limpio con el siguiente comando:
laravel new miProyecto
Controladores básicos
Para crear un controlador debes ejecutar el siguiente comando con artisan.
php artisan make:controller BasicController
Este comando creará un controlador llamado BasicController en la carpeta app/Http/Controllers con el siguiente contenido:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class BasicController extends Controller
{
//
}
Ahora bien, vamos a crear el siguente método que mostrará algún frontpage o página de inicio en nuestra aplicación.
public function index()
{
return view('home');
}
Finalmente vamos a agregar la siguiente línea a nuestro archivo de rutas en routes/web.php.
Route::get('/inicio', 'BasicController@index');
Con esto, hemos definido la ruta /inicio en nuestra aplicación, la cual al ser accedida desde el navegador ejecutará el método index
del controlador BasicController. Como puedes observar basta con pasar el nombre del controlador como segundo parámetro del método get
o cualquiera quiera que fuera según los verbos HTTP, seguido del caractér @ y el nombre del método que se debe ejecutar. Por supuesto, si es el caso y retornas una vista desde dicho método deberás crear el archivo de la vista, en nuestro caso el archivo a crear sería home.blade.php en la carpeta resources/views.
Controladores con namespaces
Para crear un controlador dentro de un namespace sin importar si existe o no, debes ejecutar el siguiente comando con artisan:
php artisan make:controller User/ProfileController
Para este caso particular se creará el archivo ProfileController.php dentro de app/Http/Controllers/User. Si la carpeta User no existe se creará automáticamente. Observemos el código del controlador creado:
namespace App\Http\Controllers\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ProfileController extends Controller
{
//
}
Como puedes ver nuestro controlador ha quedado en el namespace esperado. Para definirlo en una ruta basta cambiar el slash por backslash taly como se muestra a continuación.
Route::get('/miruta', 'User\ProfileController@index')
Controladores de un solo método
En algunas ocasiones es necesario crear controladores que poseen solamente un método. Resulta entonces mucho más práctico utilizar el método __invoke
el cuál se ejecuta cuando se invoca dicho controlador. Para crear un controlador de un sólo método con estas características debes ejecutar el siguiente comando:
php artisan make:controller FrontController --invokable
Como puedes ver solo se ha agregado el parámetro --invokable el cuál crear un controlador similar al siguiente:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FrontController extends Controller
{
/**
* Handle the incoming request.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function __invoke(Request $request)
{
//
}
}
A pesar de que el scaffolding de este controlador está diseñado para manejar un request, cabe anotar que cualquier controlador pudiera tener este mismo comportamiento. Para simplificar un poco más el ejemplo vamos a suponer que este controlador maneja solamente un frontpage o página de inicio. Vamos a modificar entonces nuestro controlador de la siguiente forma:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class FrontController extends Controller
{
public function __invoke()
{
return view('home');
}
}
Finalmente, la definición de la ruta para este controlador quedaría de la siguiente forma:
Route::get('/inicio', 'FrontController');
Como puedes notar no hace falta definir ningún método puesto que nuestro controlador utilizar el método __invoke
. Hasta pronto!.