Buscar..


Enrutamiento básico

El enrutamiento define un mapa entre los métodos HTTP y los URI en un lado, y las acciones en el otro. Las rutas se escriben normalmente en el archivo app/Http/routes.php .

En su forma más simple, una ruta se define llamando al método HTTP correspondiente en la fachada de la ruta, pasando como parámetros una cadena que coincide con el URI (relativo a la raíz de la aplicación) y una devolución de llamada.

Por ejemplo: una ruta a la URI raíz del sitio que devuelve una vista de home ve así:

Route::get('/', function() {
    return view('home');
});

Una ruta para una solicitud de publicación que simplemente hace eco de las variables de publicación:

Route::post('submit', function() {
   return Input::all();
});

//or

Route::post('submit', function(\Illuminate\Http\Request $request) {
   return $request->all();
});

Rutas que apuntan a un método de controlador

En lugar de definir la devolución de llamada en línea, la ruta puede referirse a un método de controlador en la sintaxis de [ControllerClassName @ Method]:

Route::get('login', 'LoginController@index');

Una ruta para múltiples verbos.

El método de match se puede usar para hacer coincidir una matriz de métodos HTTP para una ruta determinada:

Route::match(['GET', 'POST'], '/', 'LoginController@index');

También puede usar all para que coincida con cualquier método HTTP para una ruta determinada:

Route::all('login', 'LoginController@index');

Grupos de ruta

Las rutas se pueden agrupar para evitar la repetición del código.

Digamos que todos los URI con un prefijo de /admin usan un cierto middleware llamado admin y todos viven en el espacio de nombres App\Http\Controllers\Admin .

Una forma limpia de representar esto usando Grupos de Ruta es la siguiente:

Route::group([
    'namespace' => 'Admin',
    'middleware' => 'admin',
    'prefix' => 'admin'
    ], function () {
        
        // something.dev/admin
        // 'App\Http\Controllers\Admin\IndexController'
        // Uses admin middleware
        Route::get('/', ['uses' => 'IndexController@index']);    
        
        // something.dev/admin/logs
        // 'App\Http\Controllers\Admin\LogsController'
        // Uses admin middleware
        Route::get('/logs', ['uses' => 'LogsController@index']);    
});

Ruta nombrada

Las rutas con nombre se utilizan para generar una URL o redireccionar a una ruta específica. La ventaja de usar una ruta con nombre es que si cambiamos el URI de una ruta en el futuro, no tendríamos que cambiar la URL o los redireccionamientos que apuntan a esa ruta si estamos usando una ruta con nombre. Pero si los enlaces se generaron utilizando la url [por ejemplo. url('/admin/login') ], entonces tendríamos que cambiar en todas partes donde se usa.

Las rutas con nombre se crean utilizando as clave de matriz

Route::get('login', ['as' => 'loginPage', 'uses' => 'LoginController@index']);

o usando el name método

Route::get('login', 'LoginController@index')->name('loginPage');

Generar URL usando una ruta con nombre

Para generar un url usando el nombre de la ruta.

$url = route('loginPage');

Si está utilizando el nombre de la ruta para la redirección

$redirect = Redirect::route('loginPage');

Parámetros de ruta

Puede utilizar los parámetros de ruta para obtener la parte del segmento URI. Puede definir un / s parámetro / s de ruta opcionales o necesarios mientras crea una ruta. Los parámetros opcionales tienen una ? adjunto al final del nombre del parámetro. Este nombre está encerrado entre llaves {}

Parámetro opcional

Route::get('profile/{id?}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);

Se puede acceder a esta ruta en domain.com/profile/23 donde 23 es el parámetro id. En este ejemplo, la id se pasa como un parámetro en el método de view de ProfileController . Dado que este es un parámetro opcional, acceder a domain.com/profile funciona bien.

Parámetro requerido

Route::get('profile/{id}', ['as' => 'viewProfile', 'uses' => 'ProfileController@view']);

Tenga en cuenta que el nombre del parámetro requerido no tiene un ? al final del nombre del parámetro.

Accediendo al parámetro en el controlador.

En su controlador, su método de vista toma un parámetro con el mismo nombre que el de routes.php y se puede usar como una variable normal. Laravel se encarga de inyectar el valor:

public function view($id){
    echo $id;
}

Coger todas las rutas

Si desea capturar todas las rutas, podría usar una expresión regular como se muestra:

Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');

Importante: si tiene otras rutas y no desea que interfiera el catch-all, debe ponerlo al final. Por ejemplo:

Atrapando todas las rutas excepto las ya definidas.

Route::get('login',  'AuthController@login');
Route::get('logout', 'AuthController@logout');
Route::get('home',   'HomeController@home');

// The catch-all will match anything except the previous defined routes.
Route::any('{catchall}', 'CatchAllController@handle')->where('catchall', '.*');

Las rutas se emparejan en el orden en que se declaran.

Este es un gotcha común con las rutas de Laravel. Las rutas se emparejan en el orden en que se declaran. La primera ruta coincidente es la que se utiliza.

Este ejemplo funcionará como se esperaba:

Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');
Route::get('/posts/{postId}', 'PostController@show');

Una solicitud de obtención a /posts/1/comments/1 invocará CommentController@show . Una solicitud de obtención a /posts/1 invocará PostController@show .

Sin embargo, este ejemplo no funcionará de la misma manera:

Route::get('/posts/{postId}', 'PostController@show');
Route::get('/posts/{postId}/comments/{commentId}', 'CommentController@show');

Una solicitud de obtención a /posts/1/comments/1 invocará PostController@show . Una solicitud de obtención a /posts/1 invocará PostController@show .

Debido a que Laravel usa la primera ruta coincidente, la solicitud a /posts/1/comments/1 coincide con Route::get('/posts/{postId}', 'PostController@show'); y asigna la variable $postId al valor 1/comments/1 . Esto significa que CommentController@show nunca será invocado.

Rutas insensibles a mayúsculas

Las rutas en Laravel distinguen entre mayúsculas y minúsculas. Significa que una ruta como

Route::get('login', ...);

coincidirá con una solicitud GET para /login pero no coincidirá con una solicitud GET para /login /Login .

Para hacer que sus rutas no distingan entre mayúsculas y minúsculas, debe crear una nueva clase de validador que haga coincidir las URL solicitadas con las rutas definidas. La única diferencia entre el nuevo validador y el existente es que agregará el modificador i al final de la expresión regular para que la ruta compilada habilite la coincidencia entre mayúsculas y minúsculas.

<?php namespace Some\Namespace;

use Illuminate\Http\Request;
use Illuminate\Routing\Route;
use Illuminate\Routing\Matching\ValidatorInterface;

class CaseInsensitiveUriValidator implements ValidatorInterface
{
  public function matches(Route $route, Request $request)
  {
    $path = $request->path() == '/' ? '/' : '/'.$request->path();
    return preg_match(preg_replace('/$/','i', $route->getCompiled()->getRegex()), rawurldecode($path));
  }
}

Para que Laravel use su nuevo validador, debe actualizar la lista de emparejadores que se utilizan para hacer coincidir la URL con una ruta y reemplazar el UriValidator original con el suyo.

Para hacer eso, agregue lo siguiente en la parte superior de su archivo route.php:

<?php
use Illuminate\Routing\Route as IlluminateRoute;
use Your\Namespace\CaseInsensitiveUriValidator;
use Illuminate\Routing\Matching\UriValidator;

$validators = IlluminateRoute::getValidators();
$validators[] = new CaseInsensitiveUriValidator;
IlluminateRoute::$validators = array_filter($validators, function($validator) { 
  return get_class($validator) != UriValidator::class;
});

Esto eliminará el validador original y agregará el suyo a la lista de validadores.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow