2010-08-10 80 views
0

我想弄清楚什麼是最好的方式去重寫網址,以適應不僅一個目錄結構,但爲我正在建設的網站的菜單附加操作在PHP中。PHP動態URL寫入,以適應動態菜單和路徑

我有一個頁面,可以根據加載的「頁面」動態加載內容。包括根據頁面的內容拉取。現在這是綁定到我的包含文件夾中的目錄。所以文件夾/頁面將包含includes/folder/page.php。

如果我有一個像「root/page/action/param」這樣的結構,只要我說「在這個地方的任何東西都是這個」就可以正常工作。但是當我開始添加擁有不同級別頁面的文件夾時,我遇到了麻煩。如果我將頁面展開到「文件夾/子文件夾/頁面」,然後使用展示位置來確定窗口的內容。我正在考慮使用像連字符一樣的分隔符去「root/folder-subfolder1-subfolder2-page/action/param」,這樣我就可以很容易地識別頁面,但我不太喜歡這個選項。

我也不喜歡將我的includes目錄結構綁定到我的url,但我認爲要避免的唯一的另一種方式是使用內存中的對象來處理究竟在哪裏。但我想避免這種情況,因爲我希望菜單是動態的,基於XML文件進行解析並生成相應的url。我不想要解析xml的開銷,不僅需要生成URL,還需要動態生成一個內存對象,該對象具有看似任意的規則。

有什麼建議嗎?

回答

1

PHPonTrax使用,我認爲會允許這種類型的路由要實現,而且它是開源的,所以你可以看看的代碼一些啓發。 (注意:我沒有對框架做出任何判斷,我只是看過代碼,並認爲它可能適用於您)。

基本上,您將路由存儲在數組中,並且您還提供了一些佔位符,以便在給定路徑之後可以有多個可能的控制器/操作/ ID。

所以,如果$路線[]是我們的數組來保存所有的,我們還可以添加:

$routes[0]['path'] = "foo/bar/:controller/:action"; 
$routes[0]['params'] = null; 
$routes[1]['path'] = "baz/:action"; 
$routes[1]['params'] = array("controller"=>"blah"); 
$routes[2]['path'] = "catalog/:id"; 
$routes[2]['params'] = array("controller"=>"products", "action"=>"view"); 
$routes[3]['path'] = ":controller/:action/:id"; 
$routes[3]['params'] = null; 

「:控制器」,「:行動」,和「:ID」是獨特的標記,指示你允許令牌在路徑中表示。因此,「/ baz/edit」,「/ baz/delete」,「/ baz/create」,「/ baz/funkify」等都是有效的控制器「blah」具有編輯,刪除,創建和funkify方法。如果路徑是「/ catalog/1234」,那麼'1234'是id,它是一個有效的路徑,當且僅當您可以找到id = 1234的產品。如果您的請求是「/ products/dothis/12345」,則路由0-2不匹配,但路由3不會,因此您可以查找名爲「products」的控制器文件,並提供一個名爲「 dothis「,那麼你可以打電話給」dothis(12345)「。顯然,如果沒有「dothis」方法,或者找不到「12345」,則這是一條無效路徑,您可以引發異常。注意你需要提供一個默認路由,在這種情況下它是$ routes [3]。

在你的文件結構,你可以有:

/應用
    /控制器
    /視圖
    /等,等

可能的缺點是,你重寫,你發送每個請求到一個PHP腳本。

如果您感興趣:PHPonTrax。您將需要查看路由器類和action_controller類(請參閱process_route()和recognition_route()方法)。

+0

謝謝。我最終基本上用一些自定義路由和正則表達式來做這件事。 ASP.NET MVC的路由表設計也幫助我走出了很多問題。 – kappasims 2010-11-02 02:43:46

0

使用絕對路徑而不是相對在您的菜單html &腳本,你不應該有問題,因爲它將始終指向正確的來源。

絕對路徑示例(注意/):

<a href="/">Home</a> 
<a href="/services">Services</a> 
<a href="/mypage">My Page</a> 
<a href="/mypage2">My Page 2</a> 
+0

我實際上是在討論爲我的MVC應用程序重寫URL。 /root/page/action/param將被重寫爲root/index.php?page = page&action = action&param = param。我的問題是,頁面可能包含頁面的路徑而不僅僅是頁面名稱。 – kappasims 2010-08-10 20:18:34