控制器與路由 - 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() {
// 做點什麼
}
}