PHP Laravel - Route應用與介紹 - 筆記長也NotesHazuya

PHP Laravel - Route應用與介紹

2020-06-02 18:47:45   Laravel

如果你還沒建立專案,請參考上一篇文章“PHP Laravel - 架構介紹、Composer 及專案建立”一文。

HTTP方法

開始介紹路由之前,要先知道 http 協定有哪一些方式,這樣才能定義那一個路由可以利用什麼方式訪問。

  • GET:常用於讀取資料
  • POST:一般用於傳送資料,表單傳送或是上傳檔案
  • PUT:用於更新資料
  • DELETE:用於刪除資料時

基本上最常用的就是 GET 以及 POST 這兩種方法。

其他可以參考維基百科:https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE

Laravel 的 routes 資料夾

簡單介紹一下這 route資料夾裡面的四支檔案:

api.php

包含RouteServiceProvider放置在api中間件組中的路由。

channels.php

註冊應用程式支持的所有事件廣播的地方。

console.php

定義php artisan的指令。

web.php

文件包含 RouteServiceProvider 放置在 web 中間件組中的路由。大多數的應用,都是以web.php文件定義路由開始的。

web.php 與 api.php 都是宣告路由,最大的差異是 web.php 比起 api.php 多支持了 CSRF防護、session 以及 cookie 加密,而 api.php 中的路由僅支持無狀態的路由,所以 laravel 官方文件提到了“如果你的應用不提供無狀態的、RESTful 風格的 API,則所有的路由都應該在 web.php 文件中定義。”

基本上本文所有的 route 都宣告在 web.php 當中。

基本路由宣告

Route::get('/', function () {
    return view('welcome');
});

路由的宣告很簡單,先宣告你要使用的 http 方法,再帶入兩個參數:一是你要的 url 名稱,二是閉包。

這裡範例中的閉包是回傳一個叫做 welcome 的 view,這個方法在後面文章當中我們會更詳細地說明。

帶有必要參數的路由

實務上常有需要讓 url 帶有查詢參數的情況,例如一篇文章的 url 可能會是  "/articles/文章ID" 的格式,那如何宣告呢?

Route::get('/articles/{id}',function($id){
    return 'articles_id:'.$id;
});

利用 { }  大括號包在路由名稱當中,並記得在閉包帶入參數。由於是必要參數,若參數為空會被導向 404 錯誤唷!

帶有選擇性參數的路由

如果你的參數不是必須的,例如文章列表的頁數,你可以這樣做:

Route::get('/articles/{page?}',function($page){
    return $page;
});

在參數名稱後加上 " ? " 問號即可!但要注意,如果 $page 變數為空,會被 laravel 報錯 define 值,記得要給予預設值。

如果你有發現,上面路由的方法都是 get ,因為 get 方法就是藉由 url 取值。

命名路由

為了方便管理路由,可以替路由命名,加上 name 方法就可以了。

Route::get('/post/admin',function(){
    return '後台';
})->name('admin');

這樣就將這個路由命名為 admin 了。

Route::get('/login/{id?}',function($id=null){
    if(!is_null($id)){
        //如果有id就重導向至/post/admin
        return redirect()->route('admin');
    }else{
        return '錯誤';
    }
});

可以使用 redirect 方法重新導向。

如果不替路由命名,可以直接將路徑帶入 redirect 的參數

return redirect('/post/admin')

路由組

為了驗證某些事情(例如使用者是否已經登入、是否有權限訪問這個 url 等)會在路由加上中間件(middleware),如果同時很多 route 要用到同樣的中間件,則可以使用路由組,這樣就不必在每個路由前面加上重複的程式碼。關於中間件的部分,後續文章會有更深入的介紹。

Route::middleware('auth')->group(function () {
    Route::get('/', function () {
        // 使用 auth 中間件
    });

    Route::get('admin', function () {
        // 使用 auth 中間件
    });
});

路由部分就介紹到此,下一篇文章將會介紹 controller。


長也

我只專注做好自己能做的事情,別人要做什麼我無法干涉。