laravel路由


路由

在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');
});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM