2012-12-07 78 views
0

我使用PHP和ToroPHP進行路由。ToroPHP路由 - URL與兒童重寫

子頁面的次數未知

它工作正常,但在我的情況下,我可以添加與孩子的家長,在家長可以有數目不詳的有childpages頁。

在ToroPHP它可能看起來像這樣:

// My Path: http://www.test.com/product/house/room/table/leg/color/ 

Toro::serve(array(
    "/" => "Home", 
    "/:string/:string/:string/:string/:string/:string/" => "Page" 
)); 

class Page { 
    function get($slug, $slug2, $slug3, $slug4, $slug5, $slug6) { 
     echo "First slug: $slug"; 
    } 
} 

問題

  1. 我可以找出最大深度可以再循環和追加 一個字符串包含「/:string」參數,但它看起來不錯 。

  2. 頁面類中的獲取函數需要 參數中的未知數。我可以從函數外部計算最大深度,但是我需要函數來知道要採用多少個值。

問題

  1. 是否有其他方式的問題1?一些正則表達式可能?
  2. 我該如何使一個函數採取未知數量的參數?
  3. 也許我試圖解決這個錯誤的方式,前兩個問題是不相關的?如果是的話糾正我。

回答

2

爲了,你需要捕捉他們在您的正則表達式。您使用圓括號在正則表達式中捕獲值。 :string只是([a-zA-Z]+)的別名。你可以在第一段之後使用通配符,像這樣:

"/product/(.*?)" => "Page" 

然而,這意味着你需要自己在你的行動,這是不是很乾淨要麼解析URL。

如果你想使這個特殊的情況下更乾淨,一個選項是使用str_repeat

Toro::serve(array(
    "/" => "Home", 
    "/" . str_repeat(":string/", 6) => "Page" 
)); 

ToroPHP是一個非常簡單的庫,它不應該是很難叉它,它屈服於你的意願。理想情況下,你想如何定義這樣的路線?也許像/:string*6這樣的路線?


你總是可以傳遞比定義爲一個PHP函數更多或更少的參數。使用func_get_args讓所有傳遞的參數和func_num_args獲得傳遞的參數的數量。

+0

現在1+。我明天會試一試。第一個問題str_repeat對我來說已經足夠了。我不會有很多擊潰,只是一些網頁與父母和孩子的一些管理頁面。因此,我希望我仍然可以使用toroPHP,因爲它非常小。非常感謝! –

+0

str_repeat工作就像預期。我寧願不分叉/彎曲ToroPHP因爲更改核心防止未來的更新。 –

0

在響應對問題2,你能可能是GET參數格式化成一個數組,然後在數組傳遞而不是單個值?

也許想:你的行動,收到的所有參數

$allSlugs = array($slug, $slug2, $slug3, $slug4, $slug5, $slug6); 

// Pass $allSlugs into your instance of Page::get($allSlugs); 

class Page { 
    function get($getValues) { 
     echo isset($getValues[0]) ? "First slug: ".$getValues[0] : ''; 
    } 
} 
+0

是,在一般情況下,但不是ToroPHP工作。 –