Routing
Basic Routing
The most basic Laravel routes accept a URI and a Closure
, providing a very simple and expressive method of defining routes:
Route::get('foo', function () {
return 'Hello World';
});
The Default Route Files
All Laravel routes are defined in your route files, which are located in the routes
directory. These files are automatically loaded by the framework. The routes/web.php
file defines routes that are for your web interface. These routes are assigned the web
middleware group, which provides features like session state and CSRF protection. The routes in routes/api.php
are stateless and are assigned the api
middleware group.
For most applications, you will begin by defining routes in your routes/web.php
file. The routes defined in routes/web.php
may be accessed by entering the defined route's URL in your browser. For example, you may access the following route by navigating to http://your-app.test/user
in your browser:
Route::get('/user', 'UserController@index');
Routes defined in the routes/api.php
file are nested within a route group by the RouteServiceProvider
. Within this group, the /api
URI prefix is automatically applied so you do not need to manually apply it to every route in the file. You may modify the prefix and other route group options by modifying your RouteServiceProvider
class.
Available Router Methods
The router allows you to register routes that respond to any HTTP verb:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Sometimes you may need to register a route that responds to multiple HTTP verbs. You may do so using the match
method. Or, you may even register a route that responds to all HTTP verbs using the any
method:
Route::match(['get', 'post'], '/', function () {
//
});
Route::any('/', function () {
//
});
CSRF Protection
Any HTML forms pointing to POST
, PUT
, PATCH
, or DELETE
routes that are defined in the web
routes file should include a CSRF token field. Otherwise, the request will be rejected. You can read more about CSRF protection in the CSRF documentation:
<form method="POST" action="/profile">
@csrf
...
</form>
Redirect Routes
If you are defining a route that redirects to another URI, you may use the Route::redirect
method. This method provides a convenient shortcut so that you do not have to define a full route or controller for performing a simple redirect:
Route::redirect('/here', '/there');
By default, Route::redirect
returns a 302
status code. You may customize the status code using the optional third parameter:
Route::redirect('/here', '/there', 301);
You may use the Route::permanentRedirect
method to return a 301
status code:
Route::permanentRedirect('/here', '/there');
View Routes
If your route only needs to return a view, you may use the Route::view
method. Like the redirect
method, this method provides a simple shortcut so that you do not have to define a full route or controller. The view
method accepts a URI as its first argument and a view name as its second argument. In addition, you may provide an array of data to pass to the view as an optional third argument:
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
Route Parameters
Required Parameters
Sometimes you will need to capture segments of the URI within your route. For example, you may need to capture a user's ID from the URL. You may do so by defining route parameters:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
You may define as many route parameters as required by your route:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
Route parameters are always encased within {}
braces and should consist of alphabetic characters, and may not contain a -
character. Instead of using the -
character, use an underscore (_
). Route parameters are injected into route callbacks / controllers based on their order - the names of the callback / controller arguments do not matter.
Optional Parameters
Occasionally you may need to specify a route parameter, but make the presence of that route parameter optional. You may do so by placing a ?
mark after the parameter name. Make sure to give the route's corresponding variable a default value:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
Regular Expression Constraints
You may constrain the format of your route parameters using the where
method on a route instance. The where
method accepts the name of the parameter and a regular expression defining how the parameter should be constrained:
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Global Constraints
If you would like a route parameter to always be constrained by a given regular expression, you may use the pattern
method. You should define these patterns in the boot
method of your RouteServiceProvider
:
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
Route::pattern('id', '[0-9]+');
parent::boot();
}
Once the pattern has been defined, it is automatically applied to all routes using that parameter name:
Route::get('user/{id}', function ($id) {
// Only executed if {id} is numeric...
});