Herramientas de usuario

Herramientas del sitio


informatica:programacion:php:frameworks:laravel:rutas

¡Esta es una revisión vieja del documento!


Rutas en 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 app/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” 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.

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 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");

Podemos ver información sobre esas rutas mediante:

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…)

Llamar a las rutas

Usando el helper route podemos obtener la URL de cada ruta.

<a class="btn btn-success" href="{{ route("products.create") }}">Create</a>
 
<!-- -->
 
    <td>
        <a class="btn btn-link" href="{{ route("products.show, ["product" => $product->id]) }}>Show</a>
        <a class="btn btn-link" href="{{ route("products.edit, ["product" => $product->id]) }}>Edit</a>
    </td>
<!-- -->    

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
}
informatica/programacion/php/frameworks/laravel/rutas.1739274206.txt.gz · Última modificación: por tempwin