Diferencia entre revisiones de «Usuario:ManuelRomero/Laravel/routing»

De WikiEducator
Saltar a: navegación, buscar
(Pasando parámetros a las rutas)
(Especificando la ruta en Laravel)
 
(37 revisiones intermedias por el mismo usuario no mostrado)
Línea 2: Línea 2:
 
{{:Usuario:ManuelRomero/micursos/Laravel/Componentes/nav}}
 
{{:Usuario:ManuelRomero/micursos/Laravel/Componentes/nav}}
 
<br>
 
<br>
__NOTOC__
 
  
===Qué es routing===
+
__NOSECCTION__
*Es esta la primera diferencia que podemos encontrar con una aplicación web tradicional de PHP como hemos venido trabajando a lo largo del curso
+
 
*El cliente escribe una url solicitando una página web  o php p.e.
+
=Qué es routing=
 +
<br />
 +
{{MRM_Clave|Title=URL Vs Ruta (route)|
 +
*Una aplicación web es ''invocada'' mediante una '''''solicitud http''''', usando sus verbos '''get o post'''principalmente.
 +
*Para ello solicitamos un recurso mediante lo que comunmente llamamos  '''''URL'''''
 +
}}
 +
*En las aplicaciones que venimos desarrollando en el curso, el proceso de ejecución de la solicitud de '''''un recurso web''''' de forma básica es:
 +
*1.-El cliente escribe una url solicitando una página web  o php p.e.
 
<source lang=bash>
 
<source lang=bash>
 
http://localhost/paginaPrincipal.php
 
http://localhost/paginaPrincipal.php
 
</source>
 
</source>
*Ahora el servidor web  procesa la petición ejecutando el fichero php y retornando una página web al cliente. Entendemos que existe un fichero en el servidor con el nombre '''''paginaPrincipal.php
+
*2.-Ahora el servidor web  procesa la petición ejecutando el fichero '''''php''''' y retornando una '''''página web''''' al cliente.
 +
{{Tip| Entendemos que existe un fichero en el servidor con el nombre '''''paginaPrincipal.php'''''}}
 +
 
 +
*Es esta la primera diferencia que podemos encontrar con una aplicación web tradicional de PHP como hemos venido trabajando a lo largo del curso
 
*Ahora no vamos a funcionar exactamente así en la parte del servidor
 
*Ahora no vamos a funcionar exactamente así en la parte del servidor
*Meditante el routing, vamos a  especificar el contenido que se va a servir ante una determinada URL
+
 
*Esto se hará en un único fichero '''''./app/route.php''''' de modo que todo lo realcionado con las rutas.
+
*Meditante el routing, vamos a  especificar los diferentes recursos que nuestrta aplicación va a atender como solicitudes http
En él puede estar directamente el contenido que se va a servir ante una ruta o solicitud o se especificará un fichero donde se obtendrá dicho contendido <!--MRM Verificar -->
+
*Esto se hará en un único fichero donde se especifican estas '''rutas''' '''''web.php''''' de modo que todo lo relacionado con las rutas esté ahí especificado
*El cliente escribirá una ruta a la que quiere acceder en forma de URL y la aplicación en buscará dicha ruta en el fichero route.php.
+
'''''/routes/web.php'''''
 +
 
 +
{{MRM_Definicion|Title=Una ruta en laravel|
 +
'''''Una ruta Laravel''''' es la definición de una '''''URL''''' de solicitud web.
 +
que accede a una página o recurso web particular de la aplicación,
 +
y la acción correspondiente a esta solicitud
 +
}}
 +
*En la carpeta '''''routes''''', tenemos 4 ficheros de rutas:
 +
:'''''routes/api.php''''':Para definair las  rutas de las APIs de nuestra aplicación.
 +
:'''''routes/channels.php''''':Los  canales transmisión de eventos.(notificaciones en tiempo real).
 +
:'''''routes/console.php''''': Para poder crearnos nuestros propios comandos de consola que usaremos con artisan.
 +
:'''''routes/web.php''''':
 +
En este archivo de rutas es donde definimos todas las rutas de nuestra aplicación web
 +
Son estas las rutas que pueden ser ingresadas por la barra de direcciones del navegador.
 +
 
 +
=Contenido de web.php=
 +
<hr class=titulo />
 +
*El proceso quedará definido por la siguiente secuencia
 +
*El cliente escribirá una ruta a la que quiere acceder en forma de URL y la aplicación buscará dicha ruta en el fichero web.php.
 
*Una aproximación (en realidad hay muchos ficheros que se ejecutan entre medias. ver ciclo de vida de una aplicación laravel), podemos ver en la siguiente imagen
 
*Una aproximación (en realidad hay muchos ficheros que se ejecutan entre medias. ver ciclo de vida de una aplicación laravel), podemos ver en la siguiente imagen
[[Archivo:solicitudRoute.png|500px]]
+
[[Archivo:rutas_laravel_1.png|500px]]
*Hay diferentes maneras de especificar estas rutas en el fichero route.php, como vamos a ver a continuación
+
  
====Especificando la ruta en Laravel====
+
*Hay diferentes maneras de especificar estas rutas en el fichero web.php, como vamos a ver a continuación
*Para ello se usa la clase  '''''Route'''''
+
=Levantando el servidor=
 +
*Antes de probar las rutas, debemos de poner nuestro servidor en funcionamiento. Para ello cada proyecto tiene un pequeño servidor interno que nos permite probar en local su funcionamiento sin necesidad de depender de apache.
 +
*Primero levantamos el servidor que viene con laravel en el puerto 8000
 +
*Para ello usamos los comandos de '''''artisan'''''
 +
<source lang=bash>
 +
php artisan serve
 +
</source>
 +
*Si estamos con <span class="r">docker</span>, deberemos de indicar que el navegador o la solicitud se pueda hacere desde cualquier host con la opción <span class="r">--host 0.0.0.0</span>
 +
<source lang=bash>
 +
php artisan serve --host 0.0.0.0
 +
</source>
 +
 
 +
{{Tip|Artisan viene de artesano y es un poderoso interfaz de comandos que nos va a permitir realizar muchas acciones de forma rápida en nuestro proyecto}}
 +
*Y vemos la siguiente salida, que responde al route con la URL '''''/'''''
 +
<source lang=bash>
 +
Laravel development server started on http://localhost:8000
 +
</source>
 +
*Ahora abrimos el navegador y escribimos http://localhost:8000, y vemos la siguiente imagen
 +
[[Imagen:laravelLocalhost.png|300px|center]]
 +
 
 +
=Especificando la ruta en Laravel=
 +
<hr class=titulo />
 +
*Para ello se usa la clase  '''''Router'''''
 +
https://laravel.com/docs/master/routing
 +
*Para agilizar su uso usamos lo que en laravel se conoce como '''''Facade'''''
 +
{{MRM_Definicion|Title=Facade|
 +
*Una '''''facade''''' es una interfaz estática de una clase de sevice container
 +
*Cuando usamos una facade se produce lo que se llama '''''inyección de dependencias'''''
 +
**Esto implica que se importarán todas las clases necesarias para su ejecución de manera implícita
 +
}}
 +
*De esta forma no tendremos que instaciar un objeto de la clase '''''Router'''''
 +
https://laravel.com/api/master/Illuminate/Routing/Router.html
 
*Esta clase tiene una serie de métodos para especificar las rutas que corresponden al tipo de solicitud http que se hace al servidor
 
*Esta clase tiene una serie de métodos para especificar las rutas que corresponden al tipo de solicitud http que se hace al servidor
 
*Estos métodos son palabras (verbos) que representan el tipo de solicitud http que se hace al servidor.(Ver protocolo http para este cometido).
 
*Estos métodos son palabras (verbos) que representan el tipo de solicitud http que se hace al servidor.(Ver protocolo http para este cometido).
Línea 28: Línea 85:
 
<source lang=php>
 
<source lang=php>
 
<? php
 
<? php
// app/routes.php
+
// app/web.php
Route::get();
+
Route::get($uri, $callback);
Route::post();
+
Route::post($uri, $callback);
Route::put();
+
Route::put($uri, $callback);
Route::delete();
+
Route::patch($uri, $callback);
Route::any(); //any, sirve para especificar cualquier tipo de solicitud http
+
Route::delete($uri, $callback);
 +
Route::options($uri, $callback);
 
?>
 
?>
 
</source>
 
</source>
*El método especificado recibe dos parámetros:
+
*También podemos tener verbos o métodos flexibles que veremos posteriormente
 +
<source lang=php>
 +
//Cualquiera de los métodos get o post
 +
Route::match(['get', 'post'], '/', function () {
 +
    //
 +
});
 +
//Cualquier método o verbo http
 +
Route::any('foo', function () {
 +
    //
 +
});
 +
</source>
 +
*El método especificadorecibe dos parámetros:
 
#El URL o URI que el cliente solicitará
 
#El URL o URI que el cliente solicitará
#Especifica la acción que se va a realizar para retornar un contenido al cliente según la url solicitada.
+
#La acción que se va a realizar para retornar un contenido al cliente según la url solicitada.
*En función de como se especifique esta acción tenemos diferentes formas de hacer Routing, según veremos a  continuación:
+
*En función de como se especifique esta acción tenemos diferentes formas de hacer Routing, objeto de estudio de los siguientes apartados
  
===Routin básico : funciones anónimas o Clousuras===
+
==Routin básico : funciones anónimas o Clousuras==
 +
<hr class=titulo />
 +
*En este caso la acción básica va a ser una '''''función anónima''''' o de '''''clausura'''''.
 +
*Una función de clausura es una función sin nombre (anónima) que se ejecutará y puede retornar algún valor.
 +
*En la función podemos hacer un '''''echo''''', retornar un texto, retornar una vista, o lo que queramos o necesitemos. Ahora haremos los ejemplos comentados.
 +
*Vamos a dotar a nuestra aplicación del recurso o ruta llamada ''''''primera'''''
  
 
Una función anónima que se ejecutará y dará el contenido (En el routing básico)
 
 
<source lang=php>
 
<source lang=php>
route::get("principalGet", function(){
+
route::get("primera", function(){
       return ("Estás en la página principal con método GET");
+
       return ("<h1>Estás en la página primera con método GET</h1>");
 
});
 
});
route::post("principalPost", function(){
+
</source>
       return ("Estás en la página principal con método POST");
+
*Podemos ver como con echo, funciona igual (cambiamos el url de la ruta).
 +
<source lang=php>
 +
route::get("primera_echo", function(){
 +
       echo  ("<h1>Estás en la página primera con método GET</h1>");
 
});
 
});
route::get("principalGetOrPost", function(){
 
      return ("Estás en la página principal con método GET o POST");
 
});
 
 
 
</source>
 
</source>
 +
*También podemos hacer que nos devuelva una vista o página html
 +
*Para ello creamos una vista
 +
{{MRM_Clave|Title=Vista en laravel|
 +
*Utiliza un gestor de plantillas llamadas '''''blade'''''
 +
*Ficheros con extensión '''''blade.php'''''
 +
*Ubicadas en '''''/resources/view'''''
 +
*No olvidar que es '''''html'''''
 +
}}
  
 
*En este primer caso vamos a probar el ejemplo.
 
*En este primer caso vamos a probar el ejemplo.
*Primero levantamos el servidor que viene con laravel en el puerto 8000
+
*Creamos la vista con un código html básico
*Para ello usamos los comandos de '''''artisan'''''
+
;prueba.blade.php
<source lang=bash>
+
<source lang=html5>
php artisan serve
+
<!doctype html>
 +
<html lang="en">
 +
<head>
 +
    <meta charset="UTF-8">
 +
    <meta name="viewport"
 +
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 +
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
 +
    <title>Document</title>
 +
</head>
 +
<body>
 +
<h1>Esto es una prueba</h1>
 +
</body>
 +
</html>
 
</source>
 
</source>
*Y vemos la siguiente salida, que responde al route con la URL '''''/'''''
+
*Ahora agregamos la ruta.
<source lang=bash>
+
Para cargar la vista podemos usar el helper '''''view''''' o bien el método estático '''''make''''' de la Facade '''''View'''''
Laravel development server started on http://localhost:8000
+
 
 +
<source lang=php>
 +
Route::any('about',function(){
 +
    return View::make('prueba');
 +
});
 
</source>
 
</source>
*Ahora abrimos el navegador y escribimos http://localhost:8000, y vemos la siguiente imagen
+
 
[[Imagen:laravelLocalhost.png|300px|center]]
+
<source lang=php>
*A continuación escribimos la ruta a la que queremos acceder. En nuestro caso hemos detallado tres rutas, que serían las páginas de nuestra aplicación:
+
Route::any('about',function(){
#principalGet
+
    return view('prueba');
#principalPost
+
});
#principalGetOrPost
+
Routes view
http://localhost:8000/principalGet
+
*Se puede establecer directamente con el método view de la facade Route la ruta y el nombre de la vista
*Y sale el contenido indicado
+
<source lang=php>
[[Imagen:routeBasica.png|200px]]
+
Route::view('ruta','vista');
 +
</source>
 +
{{MRM_Actividad|Title=practica con rutas básicas|
 +
*Haz un sitio con 5 url básicas
 +
*Crealas bajo un directorio llamado '''''rutas_basicas''''' en '''''resources/view'''''
 +
las lamaremos
 +
about principal contacta noticas
 +
*Cada una de ellas mostrará simplemente un texto que comente la página donde estoy
 +
<source lang=html5>
 +
<h1>Estoy en la página principal</h1>
 +
</source>
 +
*Después prueba  a crear un menú con submit que me permita navegar en una nueva página llamada navegación
 +
*Ahora intenta poner un botón volver en cada una que me lleve de nuevo a navegar
 +
{{Plegable|hide|Posible solución|
 +
;about.blade.php
 +
<source lang=html5>
 +
</source>
 +
....
 +
;web.php
 +
<source lang=php>
 +
</source>
 +
}}
 +
}}
 +
 
 
<hr/>
 
<hr/>
 
{{Resumen|
 
{{Resumen|
*Las rutas se especifican en el fichero ./app/routes.php
+
*Las rutas se especifican en el fichero ./routes/web.php
 
}}
 
}}
 
{{Resumen|
 
{{Resumen|
Línea 99: Línea 217:
  
  
*Ver el sigueintes tutorial:
+
*Ver el siguintes tutorial:
 
{{Recursos de la Web|
 
{{Recursos de la Web|
 
[http://duilio.me/como-asociar-rutas-a-controladores-y-acciones-con-laravel|Video tutorial de routing]
 
[http://duilio.me/como-asociar-rutas-a-controladores-y-acciones-con-laravel|Video tutorial de routing]
 
}}
 
}}
====Pasando parámetros a las rutas====
+
===Artisan: Visualizando rutas===
*Parte de la ruta puede ser parametrizada
+
*Podemos visualizar las rutas con el comando de artisan
*Se especifica el parámetro en la ruta
+
<source lang=bash>
*Se usa como parámetro de la función anónima
+
php artisan  route:list
 +
</source>
 +
*Esto ha sido una mejora importante en laravel 9 (antes la visualización era menos explícita)
 +
*Hay rutas que son definidas por paquetes instalados en laravel, como por ejemplo la visualización de errores cuando se producen. Si queremos que éstas no se visualicen, debemos especificarlo
 +
<source lang=bash>
 +
php artisan  route:list --except-vendor
 +
</source>
 +
 
 +
 
 +
===Pasando parámetros a las rutas===
 +
<hr class=titulo />
 +
*Parte de la ruta puede ser parametrizada, es decir podemos especificar variables una ruta, de forma que parte del nombre de la ruta sea un valor para la url
 
<source lang=php>
 
<source lang=php>
route::get("noticas/{num}", function($num){
+
Route::get('/numero/{number}', function($number){
      return ("Estás en la noticia número ".$num);
+
    Return "<h2>Estás en el número $number</h2>";
 +
});
 +
*Laravel  '''''inyecta''''' el valor de cada parámetro, en la función de callback que va a ejecutar
 +
*Los nombres de los parámetros deben de ir entre brackets '''''{}'''''
 +
*Los nombres de las variables en la función o en el controlador, no han de coincidir, y laravel los asigna de forma respectiva
 +
 
 +
<source lang=php>
 +
Route::get('Nombre/{nombre}/libro/{libro}', function($miNombre, $otroLibro){
 +
    return "<h1>invocando con -$miNombre- y libro $otroLibro</h1>";
 +
});
 
</source>
 
</source>
 +
 +
 
Escribiendo este codigo podemos acceder a las siguientes URL's*
 
Escribiendo este codigo podemos acceder a las siguientes URL's*
 +
<source lang=bash>
 
#http://localhost:8000/noticias/1
 
#http://localhost:8000/noticias/1
 
#http://localhost:8000/noticias/1000
 
#http://localhost:8000/noticias/1000
 
#http://localhost:8000/noticias/pepito
 
#http://localhost:8000/noticias/pepito
 
+
</source>
 
*Y nos saldría la información correspondiente
 
*Y nos saldría la información correspondiente
 +
 +
{{MRM_Actividad|Title=Routing parametrizado|
 +
*Prueba el ejemplo anterior y en cada caso que nos muestre noticia
 +
*Intenta hacer una ruta que podamos especificar sección y apartado, es decir
 +
Noticias y noticia número 6
 +
Deportes y deporte número 2
 +
*En este caso debemos tener dos parámetros
 +
{{Plegable|hide|posible solución|
 +
;web.php
 +
<source lang=php>
 +
</source>
 +
}}
 +
*Intenta que la función anónima nos devuelva una vista '''''(periodico)''''' en lugar del texto
 +
*Cuelga la vista en /resources/views/pruebas/parametrizadas
 +
{{Plegable|hide|posible solución|
 +
;periodico.blade.php
 +
<source lang=html5>
 +
</source>
 +
}}
 +
}}
 +
 +
==Parametros por defecto y chequeando valores==
 
*Podríamos querer limitar el parámetro a un tipo de valores concreto (por ejemplo en este caso a número)
 
*Podríamos querer limitar el parámetro a un tipo de valores concreto (por ejemplo en este caso a número)
 
*Lo podemos hacer usando expresiones regulares con el método '''''pattern''''
 
*Lo podemos hacer usando expresiones regulares con el método '''''pattern''''
Línea 126: Línea 289:
 
});  
 
});  
 
</source>
 
</source>
 +
*Usar este método, fuerza a esta variable o parámetro en cualquier aparción
 +
*Si pretendemos este objetivo, la ubicación correcta de este método '''''boot''''' de la clase '''''App\Providers\RouteServiceProvider class:'''''
 +
 
*En este caso solo funcionará en la última parte de la url sea un número
 
*En este caso solo funcionará en la última parte de la url sea un número
 
*Parámetros con valores por defecto  por si no se aportan
 
*Parámetros con valores por defecto  por si no se aportan
Línea 134: Línea 300:
 
});
 
});
 
</source>
 
</source>
 +
{{Nota|No te olvides de asignar un valor por defecto a la variable que inyectará el valor del parámetro}}
 
====Restricciones====
 
====Restricciones====
 +
<hr class=titulo />
 
*Parámetros con restricciones de valor (si es número ...., si es caracteres ... ...)
 
*Parámetros con restricciones de valor (si es número ...., si es caracteres ... ...)
 +
*En este caso solo se aplica al parámetro de la ruta.
 
<source lang=php>
 
<source lang=php>
 
Route::get('noticias/tipo/{nombre}', function($nombre)
 
Route::get('noticias/tipo/{nombre}', function($nombre)
Línea 148: Línea 317:
 
})
 
})
 
->where('id', '[0-9]+');
 
->where('id', '[0-9]+');
 +
</source>
 +
*Existens unos helper para facilitar este tipo de acciones
 +
<source lang=php>
 +
Route::get('noticias/tipo/{nombre}', function($nombre)
 +
{
 +
  return("Ahora estás viendo las noticias ".$nombre);
 +
})
 +
->->whereAlphaNumeric('name');
 +
 +
Route::get('noticias/{num}', function($num)
 +
{
 +
      retunr("Ahora estás en la noticia número ".$num);
 +
})
 +
->whereNumeric('id');
 +
Route::get('/libro/{categoria}', function ($categoriaLibro) {
 +
    //
 +
})->whereIn(['policiaca', 'técnica', 'medicina']);
 +
</source>
 +
 +
 +
====Nombrando rutas====
 +
<hr class=titulo />
 +
A una ruta le podemos poner un nombre. De esta forma la podemos invocar desde cualquier sitio sin tener que escribir la ruta completa, así como generar la url de una ruta.
 +
*Crear un nombre de una ruta
 +
 +
====Acción por defecto en el enrutado====
 +
*Si la ruta no aparece, podemos determinar una acción por defecto
 +
<source lang=php>
 +
Route::fallback(function () {
 +
    return "<h2>LA ruta no está recogida </h2>"
 +
});
 
</source>
 
</source>

Última revisión de 22:04 27 ene 2023

Road Works.svg Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos.
Ver página de charlas.
Road Works.svg




__NOSECCTION__

Qué es routing



Icon key points.gif

URL Vs Ruta (route)

  • Una aplicación web es invocada mediante una solicitud http, usando sus verbos get o postprincipalmente.
  • Para ello solicitamos un recurso mediante lo que comunmente llamamos URL


  • En las aplicaciones que venimos desarrollando en el curso, el proceso de ejecución de la solicitud de un recurso web de forma básica es:
  • 1.-El cliente escribe una url solicitando una página web o php p.e.
http://localhost/paginaPrincipal.php
  • 2.-Ahora el servidor web procesa la petición ejecutando el fichero php y retornando una página web al cliente.
Icon present.gif
Tip: Entendemos que existe un fichero en el servidor con el nombre paginaPrincipal.php


  • Es esta la primera diferencia que podemos encontrar con una aplicación web tradicional de PHP como hemos venido trabajando a lo largo del curso
  • Ahora no vamos a funcionar exactamente así en la parte del servidor
  • Meditante el routing, vamos a especificar los diferentes recursos que nuestrta aplicación va a atender como solicitudes http
  • Esto se hará en un único fichero donde se especifican estas rutas web.php de modo que todo lo relacionado con las rutas esté ahí especificado
/routes/web.php



Icon define.gif
Una ruta en laravel
Una ruta Laravel es la definición de una URL de solicitud web.
que accede a una página o recurso web particular de la aplicación, 
y la acción correspondiente a esta solicitud


  • En la carpeta routes, tenemos 4 ficheros de rutas:
routes/api.php:Para definair las rutas de las APIs de nuestra aplicación.
routes/channels.php:Los canales transmisión de eventos.(notificaciones en tiempo real).
routes/console.php: Para poder crearnos nuestros propios comandos de consola que usaremos con artisan.
routes/web.php:
En este archivo de rutas es donde definimos todas las rutas de nuestra aplicación web
Son estas las rutas que pueden ser ingresadas por la barra de direcciones del navegador.

Contenido de web.php


  • El proceso quedará definido por la siguiente secuencia
  • El cliente escribirá una ruta a la que quiere acceder en forma de URL y la aplicación buscará dicha ruta en el fichero web.php.
  • Una aproximación (en realidad hay muchos ficheros que se ejecutan entre medias. ver ciclo de vida de una aplicación laravel), podemos ver en la siguiente imagen

Rutas laravel 1.png

  • Hay diferentes maneras de especificar estas rutas en el fichero web.php, como vamos a ver a continuación

Levantando el servidor

  • Antes de probar las rutas, debemos de poner nuestro servidor en funcionamiento. Para ello cada proyecto tiene un pequeño servidor interno que nos permite probar en local su funcionamiento sin necesidad de depender de apache.
  • Primero levantamos el servidor que viene con laravel en el puerto 8000
  • Para ello usamos los comandos de artisan
php artisan serve
  • Si estamos con docker, deberemos de indicar que el navegador o la solicitud se pueda hacere desde cualquier host con la opción --host 0.0.0.0
php artisan serve --host 0.0.0.0
Icon present.gif
Tip: Artisan viene de artesano y es un poderoso interfaz de comandos que nos va a permitir realizar muchas acciones de forma rápida en nuestro proyecto


  • Y vemos la siguiente salida, que responde al route con la URL /
Laravel development server started on http://localhost:8000
LaravelLocalhost.png

Especificando la ruta en Laravel


  • Para ello se usa la clase Router
https://laravel.com/docs/master/routing
  • Para agilizar su uso usamos lo que en laravel se conoce como Facade


Icon define.gif
Facade
  • Una facade es una interfaz estática de una clase de sevice container
  • Cuando usamos una facade se produce lo que se llama inyección de dependencias
    • Esto implica que se importarán todas las clases necesarias para su ejecución de manera implícita


  • De esta forma no tendremos que instaciar un objeto de la clase Router
https://laravel.com/api/master/Illuminate/Routing/Router.html
  • Esta clase tiene una serie de métodos para especificar las rutas que corresponden al tipo de solicitud http que se hace al servidor
  • Estos métodos son palabras (verbos) que representan el tipo de solicitud http que se hace al servidor.(Ver protocolo http para este cometido).
  • Se suele usar get(), para solicitudes de páginas que no envían datos y post() si se envían datos
  • Aquí una lista de posibles verbos a utilizar
<? php
// app/web.php
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
?>
  • También podemos tener verbos o métodos flexibles que veremos posteriormente
//Cualquiera de los métodos get o post
Route::match(['get', 'post'], '/', function () {
    //
});
//Cualquier método o verbo http 
Route::any('foo', function () {
    //
});
  • El método especificado, recibe dos parámetros:
  1. El URL o URI que el cliente solicitará
  2. La acción que se va a realizar para retornar un contenido al cliente según la url solicitada.
  • En función de como se especifique esta acción tenemos diferentes formas de hacer Routing, objeto de estudio de los siguientes apartados

Routin básico : funciones anónimas o Clousuras


  • En este caso la acción básica va a ser una función anónima o de clausura.
  • Una función de clausura es una función sin nombre (anónima) que se ejecutará y puede retornar algún valor.
  • En la función podemos hacer un echo, retornar un texto, retornar una vista, o lo que queramos o necesitemos. Ahora haremos los ejemplos comentados.
  • Vamos a dotar a nuestra aplicación del recurso o ruta llamada 'primera
route::get("primera", function(){
       return ("<h1>Estás en la página primera con método GET</h1>");
});
  • Podemos ver como con echo, funciona igual (cambiamos el url de la ruta).
route::get("primera_echo", function(){
       echo  ("<h1>Estás en la página primera con método GET</h1>");
});
  • También podemos hacer que nos devuelva una vista o página html
  • Para ello creamos una vista


Icon key points.gif

Vista en laravel

  • Utiliza un gestor de plantillas llamadas blade
  • Ficheros con extensión blade.php
  • Ubicadas en /resources/view
  • No olvidar que es html



  • En este primer caso vamos a probar el ejemplo.
  • Creamos la vista con un código html básico
prueba.blade.php
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<h1>Esto es una prueba</h1>
</body>
</html>
  • Ahora agregamos la ruta.

Para cargar la vista podemos usar el helper view o bien el método estático make de la Facade View

Route::any('about',function(){
    return View::make('prueba');
});
Route::any('about',function(){
    return view('prueba');
});
Routes view
*Se puede establecer directamente con el método view de la facade Route la ruta y el nombre de la vista
<source lang=php>
Route::view('ruta','vista');


Icon activity.jpg
practica con rutas básicas
  • Haz un sitio con 5 url básicas
  • Crealas bajo un directorio llamado rutas_basicas en resources/view

las lamaremos

about principal contacta noticas
  • Cada una de ellas mostrará simplemente un texto que comente la página donde estoy
<h1>Estoy en la página principal</h1>
  • Después prueba a crear un menú con submit que me permita navegar en una nueva página llamada navegación
  • Ahora intenta poner un botón volver en cada una que me lleve de nuevo a navegar






Icon summary.gif

Resumen

  • Las rutas se especifican en el fichero ./routes/web.php




Icon summary.gif

Resumen

  • Se especifica la clase route con los métodos get() o post() o any() principalmente




Icon summary.gif

Resumen

  • En su uso básico especificamos dos argumentos al método: una URI y una Closure o función anónima


  • Lógicamente las rutas con método post no los visualizaremos directamente desde el navegador. es decir si escribimos
http://localhost:8000/principalPost
  • No me aparecerá, y si vemos los errores, veremos que aparece un acceso no permitido
  • Podemos comprobarlo con curl en línea de comandos
 curl -d "" http://localhost:8000/principalPost


  • Ver el siguintes tutorial:



Artisan: Visualizando rutas

  • Podemos visualizar las rutas con el comando de artisan
php artisan  route:list
  • Esto ha sido una mejora importante en laravel 9 (antes la visualización era menos explícita)
  • Hay rutas que son definidas por paquetes instalados en laravel, como por ejemplo la visualización de errores cuando se producen. Si queremos que éstas no se visualicen, debemos especificarlo
php artisan  route:list --except-vendor


Pasando parámetros a las rutas


  • Parte de la ruta puede ser parametrizada, es decir podemos especificar variables una ruta, de forma que parte del nombre de la ruta sea un valor para la url
Route::get('/numero/{number}', function($number){
    Return "<h2>Estás en el número $number</h2>";
});
*Laravel  '''''inyecta''''' el valor de cada parámetro, en la función de callback que va a ejecutar
*Los nombres de los parámetros deben de ir entre brackets '''''{}'''''
*Los nombres de las variables en la función o en el controlador, no han de coincidir, y laravel los asigna de forma respectiva
 
<source lang=php>
Route::get('Nombre/{nombre}/libro/{libro}', function($miNombre, $otroLibro){
    return "<h1>invocando con -$miNombre- y libro $otroLibro</h1>";
});


Escribiendo este codigo podemos acceder a las siguientes URL's*

#http://localhost:8000/noticias/1
#http://localhost:8000/noticias/1000
#http://localhost:8000/noticias/pepito
  • Y nos saldría la información correspondiente



Icon activity.jpg
Routing parametrizado
  • Prueba el ejemplo anterior y en cada caso que nos muestre noticia
  • Intenta hacer una ruta que podamos especificar sección y apartado, es decir
Noticias y noticia número 6
Deportes y deporte número 2
  • En este caso debemos tener dos parámetros
  • Intenta que la función anónima nos devuelva una vista (periodico) en lugar del texto
  • Cuelga la vista en /resources/views/pruebas/parametrizadas




Parametros por defecto y chequeando valores

  • Podríamos querer limitar el parámetro a un tipo de valores concreto (por ejemplo en este caso a número)
  • Lo podemos hacer usando expresiones regulares con el método pattern'
Route::pattern('num', '[0-9]+');
 
Route::get("noticias/{num}", function($num){
       return ("Estás en la noticia número  -".$num);
});
  • Usar este método, fuerza a esta variable o parámetro en cualquier aparción
  • Si pretendemos este objetivo, la ubicación correcta de este método boot de la clase App\Providers\RouteServiceProvider class:
  • En este caso solo funcionará en la última parte de la url sea un número
  • Parámetros con valores por defecto por si no se aportan
Route::get('noticias/{nombre?}', function($name = 'deportes')
{
    return ("Estás en las noticias de tipo ".$name);
});

(Comment.gif: No te olvides de asignar un valor por defecto a la variable que inyectará el valor del parámetro)


Restricciones


  • Parámetros con restricciones de valor (si es número ...., si es caracteres ... ...)
  • En este caso solo se aplica al parámetro de la ruta.
Route::get('noticias/tipo/{nombre}', function($nombre)
{
   return("Ahora estás viendo las noticias ".$nombre);
})
->where('name', '[A-Za-z]+');
 
Route::get('noticias/{num}', function($num)
{
       retunr("Ahora estás en la noticia número ".$num);
})
->where('id', '[0-9]+');
  • Existens unos helper para facilitar este tipo de acciones
Route::get('noticias/tipo/{nombre}', function($nombre)
{
   return("Ahora estás viendo las noticias ".$nombre);
})
->->whereAlphaNumeric('name');
 
Route::get('noticias/{num}', function($num)
{
       retunr("Ahora estás en la noticia número ".$num);
})
->whereNumeric('id');
Route::get('/libro/{categoria}', function ($categoriaLibro) {
    //
})->whereIn(['policiaca', 'técnica', 'medicina']);


Nombrando rutas


A una ruta le podemos poner un nombre. De esta forma la podemos invocar desde cualquier sitio sin tener que escribir la ruta completa, así como generar la url de una ruta.

  • Crear un nombre de una ruta

Acción por defecto en el enrutado

  • Si la ruta no aparece, podemos determinar una acción por defecto
Route::fallback(function () {
    return "<h2>LA ruta no está recogida </h2>"
});