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'; });
Probemoslo 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 funcion anonima de el ejemplo anterior podemos hacer lo que sea pero no es la idea tener código en las rutas que realizen cosas 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, tambien podemos ponerle un 3er parametro el cual le podemos pasar variable.
(project-folder)/routes/web.phpRoute::view('/home', 'home');
como ejemplo de 3er parametro supongamos que estamos haciendo un manual o how to use.
<i class="far fa-folder-open"></i>/routes/web.phpRoute::view('/use', 'use',['index' => 'summary']); //estoy pasando una variable index la cual el valor es summary
Pasar parametros por rutas
Para pasar parametros a por las rutas lo que hay que hacer es encerrar la variabl deseada con { } la funcion recivira el valor de id, y se hara el codigo que se necesite hacer.
<i class="far fa-folder-open"></i>/routes/web.phpRoute::get('user/{id}', function ($id) { return 'User '.$id; });
A continuación un ejemplo de mas de un parametro
<i class="far fa-folder-open"></i>/routes/web.phpRoute::get('hombres/{category}/{product}', function ($category,$product) { return 'esta en el catalog de '.$category.' '.$product; });
Que ocurre en este ejemplo, los parametros se pasan en el orden que estan a function y esto es importante no importa el nombre que le pongamos lo que esta pasando esta en el orden en que estan los parametros { } por lo tanto si yo hiciera esto estaría recibiendo el valor de el parametro category en la variable producto y viceversa. Ejemplo siguiente:
<i class="far fa-folder-open"></i>/routes/web.phpRoute::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 seria el siguiente
esta en el catalog de camisetas deportiva y lo que queríamos era esta en el catalog de deportiva camiseta
Parametros opcionales
Supongamos que tengo un usuario y su nombre es opcional por ejemplo un usuario no logueado
<i class="far fa-folder-open"></i>/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 generacion de URLs o la redireccion a una ruta especifica.
para crear una ruta nombrada, podemos hacerlo con el metodo name.
<i class="far fa-folder-open"></i>/routes/web.phpRoute::get('user/profile', function () { // })->name('profile');
hacerlo en un controlador( ver laravel controllers ).
< laravel 8 <i class="far fa-folder-open"></i>/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 deberemo especificar la ruta de la siguiente manera
Route::get('user/profile',[UserProfileController::class ,'show'])->name('profile');
Ademas 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 darselos individialmente una a una, estos pueden ser middleware, namespaces. Ademas 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 mas de una a varias rutas se puede hacer lo siguiente:
<i class="far fa-folder-open"></i>/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
<i class="far fa-folder-open"></i>/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 seria una cuenta de un usuario
<i class="far fa-folder-open"></i>/routes/web.phpRoute::domain('{account}.myapp.com')->group(function () { Route::get('user/{id}', function ($account, $id) { // }); });
Prefix Route Group
Cuando la ruta se esta agrupando por prefix, la estamos agrupando por el prefijo de url. Las rutas en el ejemplo siguiente serian /admin/users y /admin/groups
<i class="far fa-folder-open"></i>/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
<i class="far fa-folder-open"></i>/routes/web.phpRoute::name('admin.')->group(function () { Route::get('users', function () { // Route assigned name "admin.users"... })->name('users'); });