我正在研究一個(哦不,不是另一個)PHP中的MVC框架,主要用於教育,同時也是趣味和利潤。MVC;任意路由路徑級別和參數
無論如何,我在使用Router
時遇到了一些問題,特別是使用正確的參數路由到正確的路徑。現在,我看那個(使用__autoload()
)路由器允許任意長的路由路徑:
"path/to/controller/action"
"also/a/path/to/a/controller/action"
路由開始在application
目錄,以及路由路徑基本上與文件系統路徑並行:
"/framework/application/path/to/controller.class.php" => "action()"
class Path_To_Controller{
public function action(){}
}
"/framework/application/also/a/path/to/a/controller.class.php" => "action()"
class Also_A_Path_To_A_Controller{
public function action(){}
}
這將允許模塊配置文件在不同級別的應用程序文件系統中可用。這個問題當然是,當我們引入路由路徑參數,其中路由路徑終止和路徑參數開始變得難以差分:
"path/to/controller/action/key1/param1/key2/param2"
顯然是要找的文件:
"/framework/application/path/to/controller/action/key1/param1/key2.class.php"
=> 'param2()'
//no class or method by this name can be found
這不好。現在,這聽起來像是一個設計問題,但我確定必須有一個乾淨的方法來規避這個問題。
我最初的想法是測試目錄/文件存在的路由路徑的每個級別。
- 如果它碰到1+個目錄後跟一個文件,則其他路徑組件是一個跟隨參數的動作。
- 如果它碰到1+個目錄並且沒有找到文件,那麼404它。
但是,這仍然容易發現錯誤的文件。當然,這可以通過更嚴格的命名約定和保留某些詞來緩解,但如果可能的話,我想避免這種情況。
我不知道這是否是最好的方法。有沒有人以優雅的方式解決了這樣的問題?