2010-04-23 45 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