我们使用as
关键字来为路由命名:
1 2 3 |
<a title="View all posts in Route" href="http://laravelacademy.org/tags/route" target="_blank">Route</a>::get('/hello/laravelacademy',['as'=>'academy',function(){ return 'Hello <a title="View all posts in Laravel" href="http://laravelacademy.org/tags/laravel" target="_blank">Laravel</a>Academy!'; }]); |
路由命名可以让我们在使用route
函数生成指向该路由的URL或者生成跳转到该路由的重定向链接时更加方便:
1 2 3 |
Route::get('/testNamedRoute',function(){ return route('academy'); }); |
我们在浏览器中访问http://laravel.app:8000/testNamedRoute
时输出http://laravel.app:8000/hello/laravelacademy
,然后我们修改上述闭包内代码:
1 2 3 |
Route::get('/testNamedRoute',function(){ return redirect()->route('academy'); }); |
再次在浏览器中访问http://laravel.app:8000/testNamedRoute
时会跳转到http://laravel.app:8000/hello/laravelacademy
。
我们甚至还可以在使用带参数的路由命名:
1 2 3 |
Route::get('/hello/laravelacademy/{id}',['as'=>'academy',function($id){ return 'Hello LaravelAcademy '.$id.'!'; }]); |
对应的测试路由定义如下:
1 2 3 |
Route::get('/testNamedRoute',function(){ return redirect()->route('academy',['id'=>1]); }); |
这样,当我们在浏览器中访问http://laravel.app:8000/testNamedRoute
时会跳转到http://laravel.app:8000/hello/laravelacademy/1
再来看一个更复杂的例子,使用路由分组时如何定义路由命名?官网文档提供的例子如下:
1 2 3 4 5 |
Route::group(['as' => 'admin::'], function () { Route::get('dashboard', ['as' => 'dashboard', function () { // }]); }); |
在Route
门面的group
方法中使用一个as关键字来指定该路由群组中所有路由的公共前缀,然后再在里面每个路由中使用as
关键字为该路由命名。
这样我们可以通过如下方式来生成该路由URL:
1 2 3 |
Route::get('/testNamedRoute',function(){ return route('admin::dashboard'); }); |
路由分组就是将一组拥有相同属性(中间件、命名空间、子域名、路由前缀等)的路由使用Route
门面的group
方法聚合起来。
首先我们在应用根目录下运行如下Artisan命令生成一个测试用的中间件TestMiddleware
:
1 |
php artisan make:middleware TestMiddleware |
这样会在/app/Http/Middleware
目录下生成一个TestMiddleware.php
文件,打开该文件编辑TestMiddleware
类的handle
方法如下:
1 2 3 4 5 6 |
public function handle($request, Closure $next) { if($request->input('age')<18) return redirect()->route('refuse'); return $next($request); } |
我们在中间件中定义这段业务逻辑的目的是年龄18岁以下的未成年人不能访问。
然后我们打开/app/Http/Kernal.php
文件,新增TestMiddleware
到Kernel
的$routeMiddleware
属性:
1 2 3 4 5 6 |
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'test' => \App\Http\Middleware\TestMiddleware::class, ]; |
接下来我们在routes.php
中定义路由如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
Route::group(['middleware'=>'test'],function(){ Route::get('/write/laravelacademy',function(){ //使用Test中间件 }); Route::get('/update/laravelacademy',function(){ //使用Test中间件 }); }); Route::get('/age/refuse',['as'=>'refuse',function(){ return "未成年人禁止入内!"; }]); |
这样当我们在浏览器中访问http://laravel.app:8000/write/laravelacademy?age=15
或者http://laravel.app:8000/update/laravelacademy?age=15
时就会跳转到http://laravel.app:8000/age/refuse
,并显示:
1 |
未成年人禁止入内! |
默认情况下,routes.php
中的定义的控制器位于App\Http\Controllers
命名空间下,所以如果要指定命名空间,只需指定App\Http\Controllers
之后的部分即可:
1 2 3 4 5 6 7 8 |
Route::group(['namespace' => 'LaravelAcademy'], function(){ // 控制器在 "App\Http\Controllers\LaravelAcademy" 命名空间下 Route::group(['namespace' => 'DOCS'], function() { // 控制器在 "App\Http\Controllers\LaravelAcademy\DOCS" 命名空间下 }); }); |
子域名可以通过domain
关键字来设置:
1 2 3 4 5 6 7 8 |
Route::group(['domain'=>'{service}.laravel.app'],function(){ Route::get('/write/laravelacademy',function($service){ return "Write FROM {$service}.laravel.app"; }); Route::get('/update/laravelacademy',function($service){ return "Update FROM {$service}.laravel.app"; }); }); |
这样我们在浏览器中访问http://write.laravel.app:8000/write/laravelacademy
,则输出
1 |
Write FROM write.laravel.app |
访问http://update.laravel.app:8000/write/laravelacademy
时,则输出:
1 |
Write FROM update.laravel.app |
注意:要想让子域名解析生效,需要在hosts中绑定IP地址
如果路由群组中的所有路由包含统一前缀,则我们可以通过在group
方法中设置prefix
属性来指定该前缀:
1 2 3 4 5 6 7 8 |
Route::group(['prefix'=>'laravelacademy'],function(){ Route::get('write',function(){ return "Write LaravelAcademy"; }); Route::get('update',function(){ return "Update LaravelAcademy"; }); }); |
这样我们就可以通过http://laravel.app:8000/laravelacademy/write
或者http://laravel.app:8000/laravelacademy/update
来访问对应的操作。
我们甚至还可以在路由前缀中指定参数:
1 2 3 4 5 6 7 8 |
Route::group(['prefix'=>'laravelacademy/{version}'],function(){ Route::get('write',function($version){ return "Write LaravelAcademy {$version}"; }); Route::get('update',function($version){ return "Update LaravelAcademy {$version}"; }); }); |
这样我们在浏览器中访问http://laravel.app:8000/laravelacademy/5.1/write
,则对应会输出:
1 2 3 4 |
Write LaravelAcademy 5.1 from:<a href="http://laravelacademy.org/post/417.html">http://laravelacademy.org/post/417.html</a> |