2010-04-23 53 views
3

我在過去的1年中使用PHP,現在我正在學習Rails。在PHP中路由與在Rails中路由

在扶手: - 路由需要一個輸入URL,並將其解碼成一組參數被用來通過滑軌調度到合適的控制器和動作

例如

rs.recognize_path "/blog/show/123" 
{:controller=>"blog", :action=>"show", :id=>"123"} 

上午我對嗎?

我們在config目錄下的routes.rb中提到了這個(寫下來的)代碼行,告訴rails如何使用這行代碼處理請求「/ blog/show/123」。

map.connect "blog/show/:id", :controller => "blog", :action => "show", :id => /\d+/ 

現在在PHP中,當我們做這樣的事

www.example.com/profile.php?profile_id=2 

如何請求發送到所請求的頁面?意思是我從來沒有寫任何用PHP路由,所以這個請求如何處理? 如何在PHP中完成路由(我在PHP學習/工作期間錯過的任何內容)?

希望你能得到我所要求的。請讓我知道是否有任何不清楚的地方。

+1

這是一個很好的問題。 – JohnMerlino 2010-12-17 19:24:13

回答

3

以您的PHP爲例,通過查看給定路徑profile.php找到頁面。該文件是由您的網絡服務器搜索的(如果找到)執行的。

在Rails中,URL與路由匹配以找到相應的控制器。在你的Rails示例中,blog映射到BlogController。現在Rails知道包含控制器的文件可以被找到爲apps/controllers/blog_controller.rb
每個控制器都有動作,因此show部分與BlogController的show動作相匹配,該動作在控制器中由show方法表示。
有關Rails路線的信息,請閱讀Routing Guide of Rails

所以要短

  • 在PHP的網址會根據實際的文件匹配:很簡單無需路線。
  • 在Rails中,您的URL可以更復雜(控制器/動作可能性),但需要路由。
+0

哦,從來不知道Rails的行爲webserver – 2010-04-23 08:46:19

+0

@Veger ...是那麼簡單..真的嗎?意味着我很震驚,看到如此簡單和可以接受的解釋 – 2010-04-23 08:51:24

+0

@Col。彈片:Rails並不是一個網絡服務器。 WEBrick是默認Rails項目提供的Web服務器。它可以通過腳本/服務器命令啓動(當你的當前目錄設置爲Rails應用程序的主目錄) 但是,Rails在收到網頁服務器傳遞的頁面請求後,處理路由。 – Veger 2010-04-23 08:51:27

0

你得到我問的東西。

不太好。

如何將請求發送到 請求的頁面。

瀏覽器發送/profile.php?profile_id=2請求www.example.com主機

如何路由在PHP

完全相同的方式來完成。

list($controller,$blog,$id)=explode("/","/blog/show/123"); 
+0

@col。彈片我不明白爲什麼你說在問題不清楚..請你詳細說明哪一部分不明確.. – 2010-04-23 08:48:36

+0

@piemesons我沒有得到什麼是問題,直到它被編輯 – 2010-04-23 08:51:33

2
www.example.com/profile.php?profile_id=2 

?查詢字符串URI的資源/對象分離。瀏覽器將整個URI發送到服務器,該服務器查找www.example.com/profile.php並傳遞配置文件爲GET的信息 - 請求profile_id=2。 PHP解析這些信息,使得它在叫$_GET陣列提供,具體形式如下:

array(
    'profile_id' => 2 
) 

profile.php腳本現在可以讀通過讀出$_GET['profile_id']這些信息。

由於您引用的'Rails路由URI'對於SEO來說更好,因此您可以獲取更多信息:如果您使用.htaccess文件或等效映射您的Rails路由URI到資源profile.php

您還可以使用框架獲得幫助。最近的等價物(在過渡到它應該是自然的,由於使用可比語法)我知道副手將是如果您使用Zend框架的Router

1

在Rails中,當Web服務器接收到請求時,Web服務器將該請求「分派」給控制器中的操作。如您所說,調度如何完成,在routing表中定義。

在簡單的PHP項目中,傳入的HTTP請求被映射到一個視圖,控制器和數據庫邏輯混合在同一個文件中。在不使用MVC模式的情況下,您很可能最終得到類似操作的重複代碼,失去靈活性(例如過濾,預處理或後處理URL)或有代碼中存在錯誤和漏洞的風險。

6

你不能真正比較Rails和PHP--它甚至不像蘋果和橘子;這就像比較一個蘋果和橙樹。一般情況下,有三件事情要考慮:

  1. Web服務器 - 一個軟件來處理傳入的連接(例如Apache的,Nginx的,Eebrick)
  2. 解釋 - 應用程序執行的動態腳本(如紅寶石, PHP,Perl等)
  3. Web框架 - 設置庫和工具類,幫助開發Web應用程序(如導軌,CakePHP的,代碼點火器,Django的)

在最簡單的情況下,網絡服務器使用傳入的URL作爲。用戶請求的文件路徑:

http://example.com/example.php -> /var/www/example.php 
http://example.com/other.rb -> /var/www/other.rb 

大多數靜態文件(圖像,樣式等)以這種方式提供。 您可以使用查詢字符串傳遞一些參數(格式爲?a=foo&b=bar)。但是,您可以將您的網絡服務器配置爲使用更復雜的規則路由URLS。例如,在Apache中,您可以使用mod_rewrite指定一些使用將URL映射到其他URL的正則表達式的規則。例如,在阿帕奇:

RewriteRule /foo/(.*)$ /index.php?id=$1 

將每個請求地圖/foo/開始index.php文件,並通過URL中的其餘部分爲id參數:

http://example.com/foo/bar  -> /var/www/index.php?id=bar 
http://example.com/foo/other/bar -> /var/www/index.php?id=other/bar 

現在,它給你的應用是什麼處理請求。在Rails應用程序中,URL直接映射到控制器中的操作。在PHP中,您可以使用表現相同方式的框架。例如在CakePHP中,對/ posts/show/2的請求將在PostsController類中執行方法show(2)。還有一個路由器類派遣請求到控制器。

希望我的回答有點幫助;)

+0

+1「橙樹」評論 – seand 2011-10-19 21:32:50