控制器與路由 - kouji6309/SingleMVC GitHub Wiki

控制器

當接收到一個請求時,SingleMVC 會解析請求,並轉交給對應的控制器執行,並帶入參數。
例如請求路徑為 http://example.com/home/news/1033 ,將會執行 home.php 中以下方法,並帶入 $id = 1033。在此我們把 news 這個方法稱作 進入點 ,方便之後說明使用。

class home extends Controller {
    public function news($id = -1) {
        $news_mod = new News();
        $news = $news_mod->getNews($id);

        output('header');
        output('home/news', $news);
        output('footer');
    }

    // 其他方法 ...
}

撰寫控制器時,一定要繼承 Controller 類別或其延伸列別,否則將無法執行。

若路徑為不符合命名規則的類別或方法,框架會將無效字元轉換成底線,例如 the-news 轉換成 the_news1st-place 轉換成 _1st_place 以符合有效的名稱,並以此名稱尋找檔案。

注意進入點的參數,盡可能提供預設值,以免請求中沒包含足夠數量的參數,導致產生警告與未預期的行為。

路由

一般來說,進入點是以類別、方法和資料組合而成:

http://example.com/class/method/data1/...
http://example.com/home/news/1

不過有時候可能要改變這個規則,讓網址比較易讀,例如不要 class:

http://example.com/news/1

這時你可以在 SingleMVC::$config 中設定路由覆寫的規則,來重新導向請由以達成這個目的。

路由規則

每一個規則都寫成陣列的 key => value,表示把符合 key 的請求改寫成 value
規則都能以正規表示式表示,並且可以使用向後參照,可以到 regex101 測試表示式。
SingleMVC 會額外搜尋 :any:num,表示任意字串(除了/)和數字:

SingleMVC::$config->routes = [
    'login' => 'auth/login',
    'news/([0-9]+)' => 'home/news/$1',
    'product/(:num)' => 'home/product/$1',
];

當符合一個規則,將會把請求取代成 value 的值,然後結束比對,因此需要注意先後順序。

保留路由

SingleMVC 中有兩個保留路由 default404
如果請求為空,將載入 default ;如果找不到可用的進入點,則載入 404

SingleMVC::$config->routes = [
    'default' => 'welcome/home',
    '404' => 'welcome/not_found',
];

另外如果請求中僅指定的類別,沒有方法,SingleMVC 會嘗試找 index 的方法執行。
例如呼叫 example.com/welcome 將會執行 index 方法:

class welcome extends Controller {
    public function index() {
        // 做點什麼
    }
}

了解路由後,可查看 REST 來處理 POST 等方法的請求。
也可查看語系來了解包含語系的請求。