2011-07-26 43 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