Routing en Laravel
No se puede hablar de Laravel sin hablar de routing o enrutamiento, las rutas determinan que controlador se usara y también pueden definir qué vista se usara, que middleware usaremos y algunas que otras cosas más.
La forma más sencilla de una ruta es la que acepta una URI y una función closure o anónima como desee llamarla. A continuación un ejemplo.
(project-folder)/routes/web.phpRoute::get('hello', function () { return 'hola'; });
Probémoslo en el localhost:8000 al correr php artisan serve
en console y vamos a [path]localhost:8000/hello[/path] el resultado será "hola"
en pantalla.
En Laravel las rutas las definimos en la carpeta routes dentro de esta carpeta se encuentran los siguientes archivos web.php, api.php(APIs), channel.php (se usa en broadcasting) y console.php(ruta para comandos de consola creados por el usuario).
Por ahora nos basaremos en el archivo web.php, ya que en este es donde definimos nuestras rutas para nuestra interfaz web.
Como puede pensar en esta función anónima del ejemplo anterior podemos hacer lo que sea, pero no es la idea tener código en las rutas que realizan tareas que debería hacer un controller
en este post solo daremos ejemplos de cosas que podemos hacer con las rutas.
También podemos hacer una ruta para una vista simple.
Lo podemos hacer de la siguiente manera en el primer parametro de Route::view ponemos la url en el segundo la vista, también podemos ponerle un 3er parametro el cual le podemos pasar variable.
(project-folder)/routes/web.phpRoute::view('/home', 'home');
Como ejemplo de 3er parámetro supongamos que estamos haciendo un manual o how to use.
(project-folder)/routes/web.phpRoute::view('/use', 'use',['index' => 'summary']); //estoy pasando una variable index la cual el valor es summary
Pasar parámetros por rutas
Para pasar parámetros a por las rutas lo que hay que hacer es encerrar la variable deseada con { }
la función, recibirá el valor del id y se hará el código que se necesite hacer.
Route::get('user/{id}', function ($id) { return 'User '.$id; });
A continuación un ejemplo de más de un parámetro
(project-folder)/routes/web.phpRoute::get('hombres/{category}/{product}', function ($category,$product) { return 'esta en el catalog de '.$category.' '.$product; });
Que ocurre en este ejemplo, los parámetros se pasan en el orden que están a la función function
y esto es importante, no importa el nombre que le pongamos lo que está pasando, está en el orden en que están los parámetros de la ruta {category}
y {product}
, por lo tanto, si yo hiciera esto estaría recibiendo el valor del parámetro category en la variable producto y viceversa. Ejemplo siguiente:
Route::get('hombres/{category}/{product}', function ($product,$category) { return 'esta en el catalog de '.$category.' '.$product; });
probemos esto en localhost:8000 corriendo php artisan serve
, el resultado de esto debería darnos intercambiado, por ejemplo si ponemos en nuestra ruta localhost:8000/hombres/deportiva/camisetas el resultado sería el siguiente
está en el catalog de camisetas deportivas y lo que queríamos era esta en el catalog de deportiva camiseta
Parámetros opcionales
Supongamos que tengo un usuario y su nombre es opcional, por ejemplo un usuario no logueado
(project-folder)/routes/web.phpRoute::get('user/{name?}', function ($name = 'guest') { //no estoy recibiendo un nombre asi que hago que el nombre por defecto sea guest(visitante) return $name; });
Rutas nombradas – Named routes
el nombrar las rutas nos permite la generación de URLs o la redirección a una ruta específica.
Para crear una ruta nombrada, podemos hacerlo con el método name.
(project-folder)/routes/web.phpRoute::get('user/profile', function () { // })->name('profile');
Hacerlo en un controlador(ver laravel controllers ).
< laravel 8 (project-folder)/routes/web.phpRoute::get('user/profile','UserProfileController@show')->name('profile');desde laravel 8
A partir de Laravel 8 ya no podremos hacer un enrutamiento de la siguiente manera.
Route::get('user/profile','UserProfileController@show')->name('profile');
En cambio, deberemos especificar la ruta de la siguiente manera
Route::get('user/profile',[UserProfileController::class ,'show'])->name('profile');
Además de esto deberemos de traer la clase con use
use App\Http\Controllers\UserProfileController;
Generar ruta a una ruta nombrada
esto lo podemos hacer con el siguiente comando route('profile');
en caso de querer redireccionar a esa ruta return redirect()->route('profile');
Agrupando las rutas – Route Groups
Hacer grupos de ruta nos permite darles atributos, sin tener que dárselos individualmente una a una, estos pueden ser middleware, namespaces. Además de estos podemos agrupar rutas por subdominio, prefijos por URL, prefijos por nombre.
Otra cosa que podemos hacer con el Agrupamiento es hacer un (Route Group) Agrupamiento dentro de otro.
Route Group Middleware
Para asignar un middleware o más de una a varias rutas se puede hacer lo siguiente:
(project-folder)/routes/web.phpRoute::middleware(['first', 'second'])->group(function () { Route::get('/', function () { // Uses first & second Middleware }); Route::get('user/profile', function () { // Uses first & second Middleware }); });
Namespaces Route Group
Agrupa por espacios de nombre(Namespaces) en PHP
(project-folder)/routes/web.phpRoute::namespace('Admin')->group(function () { // Controllers Within The "App\Http\Controllers\Admin" Namespace });
Domain Route Group
Todas las rutas que tengan ese subdominio en este caso el subdominio sería una cuenta de un usuario
(project-folder)/routes/web.phpRoute::domain('{account}.myapp.com')->group(function () { Route::get('user/{id}', function ($account, $id) { // }); });
Prefix Route Group
Cuando la ruta se está agrupando por prefix, la estamos agrupando por el prefijo de URL. Las rutas en el ejemplo siguiente serían /admin/users y /admin/groups
(project-folder)/routes/web.phpRoute::prefix('admin')->group(function () { Route::get('users', function () { // Matches The "/admin/users" URL }); Route::get('groups', function () { // Matches The "/admin/groups" URL }); });
Name Route Group
Agrupa rutas de nombre con un cierto prefijo, en este caso el prefijo es admin, por lo tanto, la Ruta es para una ruta nombrada admin.users
(project-folder)/routes/web.phpRoute::name('admin.')->group(function () { Route::get('users', function () { // Route assigned name "admin.users"... })->name('users'); });