2016-08-13 49 views
0

我的路由代碼:不含脂肪框架級路由系統,導致意外的行爲

F3::route('GET @root: /', "\\Controller\\_App\\App_navigation->get_delegator"); 

F3::route('GET @modul: /@module', "\\Controller\\@module->get_index"); 
F3::route('POST @modul',   "\\Controller\\@module->post_index"); 
F3::route('GET @proses: /@module/@proc.ksd', "\\Controller\\@module->[email protected]"); 
F3::route('POST @proses',      "\\Controller\\@module->[email protected]"); 


F3::route('GET @submodul: /@module/@submodule', "\\Controller\\@module\\@submodule->get_index"); 
F3::route('POST @submodul',      "\\Controller\\@module\\@submodule->post_index"); 

F3::route('GET @proses2: /@module/@submodule/@proc.ksd', "\\Controller\\@module\\@submodule->[email protected]"); 
F3::route('POST @proses2',        "\\Controller\\@module\\@submodule->[email protected]"); 

我試圖訪問proses路線,並且它沒有匹配的。這是一個意外的行爲?

它的工作時,我禁用submodulproses2路由名稱。

這裏的屏幕拍: 101 debugging mode~

如何解決這個問題?

+0

看來你會覆蓋另一個路由規則。這個特定的地址匹配兩個規則,FFF採用最後的規則並嘗試調用分配的方法。當你刪除其他規則時,不存在衝突,行爲就像你期望的那樣。 – george007

+0

啊,所以我需要更改名稱? @ george007 – Kekesed

+0

我會把它作爲答案,因爲它太長只是一個評論... – george007

回答

2

其實,你已經擊中了一個bug/@module/@submodule優先順序高於/@module/@proc.ksd而它不應該。

如果您從edge repository下載最新的base.php,則應解決您的問題。

+0

因此,這些規則是按它們被聲明的順序處理的? – george007

+0

不,它們按反向字母順序處理,通配符和令牌的優先順序較低。你可以在[tests]中查看它(https://github.com/bcosca/fatfree/blob/a1866cae88d67774f45465ae202004fd60a89513/app/router.php#L218)。這裏的錯誤是令牌名稱也按字母順序處理,而它本來不應該是。所以Kekesed碰到了這個bug,因爲'@ submodule'以S開頭,'@ proc'開頭爲P。 – xfra35

+0

OK,看起來合法。幹得好,先生。 – george007

0

有xfra35答案,希望能解決您的問題。

但是在我看來,當你有一條路線(在你的例子中是/@module/@submodule)比其他路線更普遍時(/@module/@proc.ksd),總是會很棘手。理論上引擎應該知道後者比前者更嚴格。或者前者是後來宣佈的,所以如果其他規則不匹配,應該將其匹配爲最後一個。但情況並非總是如此。

如果我在你的鞋子裏,我會覺得更安全一些其他的解決方案。例如,我會嘗試合併@proses@proses2規則,方法是將主模塊當前處理的所有操作都放入專用子模塊中。因此,每個模塊只有一個get_index方法,而所有其他get_*方法將位於子模塊中。你對這個想法有什麼看法?