2013-10-08 175 views
3

如果我想讓每個url呼叫與我在/ExplicitControllerName/ExplicitActionToRun之後定義的呼叫不同,那麼路由看起來會如何。爲symfony 2中的控制器/動作定義默認路由

例如一些僞代碼:

default_pathing: 
    pattern: /{controller}/{action} 
    defaults: { _controller: Bundle:Default:index } 

所以,如果我去 www.example.com/Page/About

它會叫我的控制器

class Page extends Controller 
{ 
    public AboutAction() 
    { 
     // Called by above URL 
    } 
} 

這個問題沒有回答:Symfony2/routing/use parameters as Controller or Action name

想象一下,我有100頁有很多子路由頁面,每次都做幾乎相同的路由。我想爲所有這100個控制器做1個路由。我們將如何做到這一點?

PS我可真要的東西,如C#.NET MVC 4.0路由中,它允許您設置一個典型的設置路由你可能有哪怕至少是其發展

回答

2

你問題並不完全清楚,但這裏有一些提示。

我能想象你正在試圖解決兩個用例:

1)你已經有很多某種CMS頁面的,像你約例如,這些頁面沒有太多的邏輯和公正使一些人認爲,在這種情況下,你會是這樣的:

class CMSPageController 
{ 
    public function renderPage($pageSlug) 
    { 
     $page = $this->cmsPageRepository->findBySlug($pageSlug); 

     // your logic to render the view 
    } 
} 

而且根據路由配置:

<route id="cms_page_view" pattern="/cms/{pageSlug}"> 
    <default key="_controller">cms_page.controller.page:renderPage</default> 
    <requirement key="_method">GET</requirement> 
    <requirement key="slug">[0-9a-zA-Z\-\.\/]+</requirement> 
</route> 

2)你有更復雜的要求,和/或遵循特異性ic模式來命名您的控制器/操作,因此您需要編寫自定義UrlMatcherInterface實現。看看native implementation知道從哪裏開始。它可以讓你定義一個回退。

+0

乾杯的人,將檢查此並回饋給你! – Jimmyt1988

+0

它是一個很好的解決方案,但是你也需要保持對蠕蟲的控制,因爲當你有一個捕獲所有控制器時,除非你的控制器非常精確,否則它基本上不可能發生404異常。 – Flosculus

+0

Flosculus,沒錯,但我認爲OP意識到了這樣的行爲,通過我們可以想象的路由器匹配來自數據庫的頁面,並在沒有找到匹配的情況下返回404。 –

0

這可以使用在講座和方法級過度或者SensioFrameworkExtraBundle的@Route註解......

...或更多地飄逸着更少的使用說明來實現FOSRestBundle的automatic route generation與隱性資源名稱。也許你需要使用一些FOSRestBundle的manual route definition annotations來更正一些生成的路線。

這兩種方法最初仍然需要明確地將路由資源添加到您的app/config/routing.yml

例爲進口@Route

# import routes from a controller directory 
blog: 
    resource: "@SensioBlogBundle/Controller" 
    type:  annotation 

例爲進口FOSRestBundle

users: 
    type:  rest 
    resource: Acme\HelloBundle\Controller\UsersController 

你可以解決具有導入所有資源:

如果您不打算使用數百個控制器,並且沒有太多的編譯器通行證,自定義註釋等的經驗,那麼只要將註冊資源註冊到路由配置。