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.