2011-07-26 42 views
2

我想为Controller映射制作一个简单的URL,就像Symfony2所做的一样。但这就是我想从Symfony2中得到的所有东西,其余部分对我来说太过分了。自定义PHP URL到控制器的映射类似于Symfony2

对于那些谁也不知道Symfony2中做什么:

blog_home: 
    pattern: /blog 
    defaults: { _controller: BlogBundle:Blog:index } 

blog_show: 
    pattern: /blog/{slug} 
    defaults: { _controller: BlogBundle:Blog:show } 
在YAML配置文件

YAML对我根本无关紧要。我只想实现相同的功能。为了能够将自定义URL映射到控制器功能。

也许是一个开源的映射类或路由框架?也许一些教程?想法让我自己?任何的意见都将会有帮助。

我应该提到我不是PHP专家,我知道的够多,或者可能还不够。这就是为什么我不想进入全功能框架。

+0

a)如果你想像symfony那样做,为什么你不使用symfony? b)如果你想像symfony那样做,为什么你不看symfony的来源? – KingCrunch

+0

因为Symfony2带有Doctrine2,它有DQL,Entity,Fixtures和其他我从未听过的词。事情使它变得如此复杂,以至于我的应用程序永远不会看到这个云。我想要做Symfony的路由,因为它对我有意义,不幸的是Symfony的其余部分没有。如果您有更好的路由选择,我非常乐意提供建议。关于Symfony源码我没有检查他们的路由组件(https://github.com/symfony/Routing),但他们没有关于如何使用它和源的信息:好吧,让我们只是说我正在看它,它会有一段时间。 – Aayush

+0

据我所见,你不是被迫使用这些东西,你不想使用。 – KingCrunch

回答

3

这是我的URL路由框架:

function route($url, $map) { 
    foreach($map as $re => $fn) { 
     if(preg_match("~^$re$~", $url, $args)) { 
      list($class, $method) = explode(".", $fn); 
      return call_user_func_array(
       array(new $class, $method), 
       array_slice($args, 1)); 
     } 
    } 
    error_404(); 
} 

的$地图是一个数组,它的键是正则表达式来匹配URL和值是字符串“ClassName.method”,像

$map = array(
    "/blog/(.+)"   => "BlogController.show", 
    "/blog"    => "BlogController.blog", 
    "/foobar/(\d+)/(\w+)" => "Foobar.stuff", 
); 

路由功能找到第一个匹配模式,实例化一个类并调用传递regexp子组作为参数的方法。所以,一个URL“/ foobar/123/hello”将被路由到Foobar->stuff(123, 'hello')

+0

哦,就是这样。太棒了。正是我想要的。非常感谢。很酷。非常感谢。 – Aayush