====== Rutas en Laravel ====== [[informatica:programacion:php:frameworks:laravel|Laravel]] Según lo que se indique por URL, Laravel servirá uno u otro contenido. Esto está definido en las rutas, que están en el directorio ''routes''. ''app/Providers/RouteServiceProvider.php'' es el provider relacionado con las rutas. El trabajo de los providers, una vez cargados por el kernel, es registrar diferentes componentes necesarios por el kernel Por ejemplo, el fichero ''routes/web.php'': Route::get('/', function () { return view('welcome'); }); Route::get('/hola', function () { return "Hola, mundo!"; }); En el ejemplo anterior tenemos definidas 2 rutas: la principal (cuando no se pasa nada más por URL que el dominio donde está la aplicación) y hola, es decir, cuando vamos a miweb.com/hola Si queremos pasar alguna "variable" / parámetro a una ruta, lo haríamos de la siguiente manera: Route::get('mundo/{pais}', function($pais) { return "Información del país $pais"; }); Al ir a la página miweb.com/mundo/italia, obtendremos el contenido "Información del país Italia". Se pueden añadir más variables: Route::get('mundo/{pais}/{ciudad}', function($pais, $ciudad) { return "Información de la ciudad $ciudad, de $pais"; }); Si alguna es opcional, se indica con un signo de interrogación: Route::get('mundo/{pais}/{ciudad?}', function($pais, $ciudad = null) { if ($ciudad) { return "Información de la ciudad $ciudad, de $pais"; } else { return "Información de $pais"; } }); ===== Creando rutas ===== Route::get("/", function () { return view("welcome"); })->name("main"); Vemos que se compone de verbo HTTP, URL y la acción a realizar y el nombre. Las diferentes peticiones HTTP son: GET, POST, PUT, PATCH y DELETE. Las tres últimas son peticiones tipo POST, pero tienen tareas distintas. PUT y PATCH se utilizan para actualizar un registro y DELETE para eliminar. Otra ruta: Route::get("products", function () { return "This is the list of products"; })->name("products.index"); Estaría accesible en http://localhost:8080/products. Ruta para mostrar un formulario para la creación de productos: Route::get("products/create", function () { return "This is the form to create a product"; })->name("products.create"); Route::post("products", function () { // })->name("products.store"); Incluyendo parámetros en una petición GET: Route::get("products/{product}", function ($product) { return "Showing producto with ID {$product}"; })->name("products.show"); Lo que pasamos por la URL lo puede recibir la [[https://www.php.net/manual/es/functions.anonymous.php|función anónima]]. Creamos más rutas para el resto de acciones como editar un producto y eliminar: // Ruta para el formulario de edición: Route::get("products/{product}/edit", function ($product) { return "Showing the form to edit the product with ID {$product}"; })->name("products.edit"); // Ruta para la actualización del producto // 'match' permite que se pueda atender a dos verbos: Route::match(["put", "patch"], "products/{product}", function ($product) { // })->name("products.update"); // Ruta para la eliminación del producto Route::delete("products/{product}", function ($product) { // })->name("products.destroy"); Es muy importante tener en cuenta el orden de las rutas ya que Laravel analiza la URL de arriba hacia abajo, así que empieza comprobando las primeras rutas definidas. Podemos ver el listado de las rutas registradas mediante el siguiente comando: php artisan route:list ==== Asignar nombre a las rutas ==== Una práctica recomendada es asignar un nombre a las rutas: Route::get('/', function() { return view("welcome"); })->name("main"); De esta manera, podemos cambiar la URL sin miedo porque el nombre que le dimos se mantiene. ==== Artisan ==== Si queremos ver todas las rutas registradas: php artisan route:list Desde **tinker** podemos ver las rutas por el nombre usando el helper ''route'': >>> route('main'); => "http://localhost" ==== Métodos para enrutar ==== Las rutas responden a un verbo HTTP (GET, POST, PUT...) * [[https://laravel.com/docs/11.x/routing|Laravel Routing]] ===== Llamar a las rutas ===== Usando el //helper// ''route'' podemos obtener la URL de cada ruta. Create $product->id]) }}>Show $product->id]) }}>Edit ===== Rutas de recurso ===== Conjunto de rutas centradas en la generación, edición y eliminación de un recurso (por ejemplo, Products, Orders...). Por ejemplo, para el recurso "products": Route::resource("products", "ProductController") Vemos que se especifica el recurso y nombre del controlador que se encarga de él. Esa única línea ahorra tener que definir las siguientes rutas: Route::get("products", "ProductController@index")->name("products.index"); Route::get("products/create", "ProductController@create")->name("products.create"); Route::get("products/{product}", "ProductController@show")->name("products.show"); Route::get("products/{product}/edit", "ProductController@edit")->name("products.edit"); Route::match(["put", "patch"], "products/{product}", "ProductController@update")->name("products.update"); Route::delete("products/{product}/edit", "ProductController@destroy")->name("products.destroy"); Esto solo funciona si somos consistentes en la forma de nombrar nuestros métodos y modelos. Es decir, gracias a que ''ProductController'' tiene métodos ''index'', ''create'', ''store'', ''edit'', ''update'' y ''destroy'', Laravel permite que usemos una ruta de recurso y todo funcionará perfectamente. Si queremos decidir qué rutas: Route::resource("products", "ProductController")->only(["index", "show", "create"]); Otra forma: Route::resource("products", "ProductController")->except(["edit"]); Siempre podemos ejecutar ''php artisan route:list'' para ver las rutas que se generan en Laravel. ===== Grupo de rutas ===== Si queremos separar rutas. En ''app/Providers/RouteServiceProvider.php'': // public function map() { // code $this->mapPanelRoutes(); } // code // Definimos las rutas para el panel de administración protected function mapPanelRoutes() { Route::prefix("panel") ->middleware(["web", "auth"]) ->namespace("{$this->namespace}\Panel") ->group(base_path("routes/panel.php")); } Creamos el fichero ''resources/routes/panel.php'': use Illuminate\Support\Facades\Route; Route::resource("products", "ProductController"); En este punto ya hemos hecho la separación conceptual entre lo que puede ver el usuario y el administrador. Creamos el controlador en ''app/Http/Controllers/Panel/ProductController.php'': namespace App\Http\Controllers\Panel; use App\Http\Controllers\Controller; use App\Http\Requests\ProductRequest; use App\Models\Product; class ProductController extends Controller { // code }