控制器與路由 - 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_news
、1st-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 中有兩個保留路由 default
和 404
。
如果請求為空,將載入 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() {
// 做點什麼
}
}