路由
在laravel中,定義路由的地方在routes/web.php文件中。在使用laravel前必須先定義路由,然后才能在瀏覽器中訪問。routes文件夾中還有一個api.php,用於定義api路徑。
最簡單的路由:
Route::get('/',function(){
return 'hello,world!' ;
});
此時在瀏覽器中,輸入localhost,就可以看到輸出的字符串。
使用MVC模式時,我們一般先定義路由,然后在路由中訪問控制器中的方法,控制器中的方法返回響應的視圖,此時我們可以定義路由,如下:
Route::get('/','IndexController@index');
其中IndexController是控制器類,index是控制器類中的方法,index方法中可以定義返回的視圖。
路由動作
上面Route::get語法只能處理get請求,laravel定義了其他請求路由的方法:
Route::post('/',function(){});
Route::put('/',function(){});
Route::delete('/',function(){});
還可以使用通用方法(不推薦使用):
Route::any('/',function(){});
我們還可以通過Route::match定義幾種特定請求方法:
Route::match(['get','post'],'/',function(){});
路由參數
在laravel中還可以定義路由參數:
Route::get('post/{id}',function($id){
return "文章ID: ".$id;
});
此時,通過localhost/post/100,就可以訪問id=100的文章。還可以定義可選路由參數:
Route::get('post/{id?}',function($id=1){
return "文章ID: ".$id;
});
如果訪問localhost/post/就會返回id=1的文章
還可以為路由參數指定正則表達式,約束路由參數范圍:
//id只能是數字
Route::get('page/{id}', function ($id) {
return '頁面ID: ' . $id;
})->where('id', '[0-9]+');
//name只能是大小寫字母
Route::get('page/{name}', function ($name) {
return '頁面名稱: ' . $name;
})->where('name', '[A-Za-z]+');
//定義多個路由參數約束規則
Route::get('page/{id}/{slug}', function ($id, $slug) {
return $id . ':' . $slug;
})->where(['id' => '[0-9]+', 'slug' => '[A-Za-z]+']);
路由命名
為路由起名,主要是為了在控制器或者視圖類中引用。路由命名示例如下:
Route::get('user/{id?}', function ($id = 1) {
return "用戶ID: " . $id;
})->name('user.profile');
此時在視圖中,就可以使用命名路由:
<a href="{{ route('user.profile', ['id' => 100]) }}">
// 輸出:http://blog.test/user/100
路由分組
在網絡應用程序中,我們可以給路由分組,比如前后台分組,還可以根據其他特征,比如路由前綴、子域名、控制器命名空間、是否使用相同的中間件等。
定義路由分組,主要是為了讓代碼可讀性更好,便於維護。
根據命名空間分組
//前台路由組
Route::group(['namespace' => 'Home'], function(){
// 控制器在 "App\Http\Controllers\Home" 命名空間下
Route::get('/', 'IndexController@index');
});
//后台路由組
Route::group(['namespace' => 'Admin', 'prefix' => 'admin'], function(){
// 控制器在 "App\Http\Controllers\Admin" 命名空間下
Route::get('/', 'AdminController@index');
});
// 或者用另外一種寫法:
Route::namespace('Admin')->prefix('admin')->group(function() {
// App\Http\Controllers\Admin\AdminController
Route::get('/', 'AdminController@index');
});
此時訪問 domain(你的域名)即可訪問前台,domain/admin 即可訪問admin后台
中間件
中間件是對請求的一種過濾或重定向功能,比如認證中間件,只有通過認證才能通過某些路由訪問相應的功能。不同的路由可以通過相同的中間件進行分組:
Route::middleware('auth')->group(function () {
Route::get('dashboard', function () {
return view('dashboard');
});
Route::get('account', function () {
return view('account');
});
});
上面使用dashboard,account兩個路由時,必須通過認證。
路由路徑前綴
某些路由可以定義相同的前綴便於區分功能,可以使用Route::prefix對路由進行分組:
Route::prefix('api')->group(function () {
Route::get('/', function () {
// 處理 /api 路由
})->name('api.index');
Route::get('users', function () {
// 處理 /api/users 路由
})->name('api.users');
});
子域名路由
在laravel中,可以為不同的應用子系統設置不同的子域名,這時可以通過設置子域名路由訪問不同的子系統:
Route::domain('test.blog.com')->group(function () {
Route::get('/', function () {
// 處理 http://test.blog.com 路由
});
});
還可以通過參數方式設置子域名,適用於網站擁有多租戶的場景,比如建站系統,多家公司通過定義二級域名訪問自己的網站。
Route::domain('{account}.yoursite.com')->group(function () {
Route::get('/', function ($account) {
//
});
Route::get('user/{id}', function ($account, $id) {
//
});
});
注意:這種情況下,$account永遠是所有分組路由的第一個路由參數。
路由命名前綴
除了通過上述共同特征對路由進行分組外,對於某一類資源路由,比如用戶,往往擁有相同的路由命名前綴,如 user.,我們還可以基於這一特征對路由進行分組,使用 Route::name 方法即可實現:
// 路由命名+路徑前綴
Route::name('user.')->prefix('user')->group(function () {
Route::get('{id?}', function ($id = 1) {
// 處理 /user/{id} 路由,路由命名為 user.show
return route('user.show');
})->name('show');
Route::get('posts', function () {
// 處理 /user/posts 路由,路由命名為 user.posts
})->name('posts');
});