2011-02-09 82 views
24

如何在Symfony2中設置默認路由?在Symfony2中路由

在Symfony1它看起來是這樣的:

homepage: 
    url: /
    param: { module: default, action: index } 

default_symfony: 
    url: /symfony/:action/... 
    param: { module: default } 

default_index: 
    url: /:module 
    param: { action: index } 

default: 
    url: /:module/:action/... 

回答

3

下面是一個例子:http://docs.symfony-reloaded.org/master/quick_tour/the_big_picture.html#routing

路由定義只有一個強制參數pattern和三個自選參數defaultsrequirementsoptions

下面是從我自己的項目的路線:

video: 
    pattern: /watch/{id}/{slug} 
    defaults: { _controller: SiteBundle:Video:watch } 
    requirements: { id: "\d+", slug: "[\w-]+" 
+1

我知道如何給我的路線添加參數。但我想匹配控制器和行動有像/控制器/行動/參數路線... – umpirsky 2011-02-09 14:02:13

8

我不認爲這是可能與標準的路由組件。 看看這個包,它可以幫助: https://github.com/hidenorigoto/DefaultRouteBundle

+1

另一種方法是做到與註釋http://bundles.symfony-reloaded.org/frameworkextrabundle/#annotations-for-controllers仍然沒有默認路由。 – umpirsky 2011-03-08 12:27:40

+0

不,這是可能的。請參閱下面的答案。 – 2011-04-25 09:38:41

2

或者,您可以直接在控制器文件中使用@Route註釋。見https://github.com/sensio/SensioFrameworkExtraBundle/blob/master/Resources/doc/annotations/routing.rst

至於默認路由,我認爲Symfony2鼓勵明確的路由映射。

+0

我認爲奇怪的是,如果使用控制檯工具生成包,它會創建一個默認控制器,並通過註釋定義路由。但是官方書籍沒有提到通過註釋進行路由 - 這本書沒有提及。如果這是默認設置,我認爲應該指出它並提供文檔(或指向它的鏈接)。 – Eno 2011-12-01 23:32:21

1

您可以創建自己的包來處理所有請求並使用URL參數來構造一個字符串以傳遞給控制器​​的轉發方法。但是,這非常糟糕,我會使用明確定義的路線,它會保持網址清潔,並將URL和控制器名稱分開。如果您重新命名一個包或其他東西,那麼您是否必須重構您的URL?

28

我正在通過食譜來尋找答案,並認爲我找到了它here。默認情況下,所有的路由參數有他們的任何字符匹配除了 /字符([^ /] +)一個隱藏的需求,但這種行爲可以與要求的關鍵字覆蓋,迫使它來搭配任何字符。

以下應創建一個默認路由,以捕獲所有其他路由 - 因此,應該在您的路由配置中最後一個,因爲任何以下路由將與從不匹配。爲確保它與「/」匹配,還包括url參數的默認值。

default_route: 
    pattern: /{url} 
    defaults: { _controller: AcmeBundle:Default:index, url: "index" } 
    requirements: 
     url: ".+" 
+0

工作,歡呼,但只是爲了加強:「默認」是您的控制器的類名(首字母大寫沒有「控制器」部分)。 – domguinard 2013-06-03 17:04:06

2

創建默認路由不是一種好的編程方式。爲什麼?因爲這個原因實現了Exception。 012fSymfony2是爲了正確地完成正確的事情而構建的。

如果要重定向所有「未找到」的路線,你應該使用異常,像NotFound404或類似的東西。你甚至可以自己定製這個頁面。

一條路線是爲了一個目的。總是。其他人認爲是不好的。

1

如果你想創建一個「全部抓住」,你最好的選擇是鉤住KernelEvents::EXCEPTION事件。只要發生異常,就會觸發此事件至HttpKernel,這包括在路由器無法解析到控制器的路由時拋出的NotFoundHttpException

效果將類似於Symfony的風格化404頁面,當您通過app_dev.php發送請求時,會呈現該頁面。您不用返回404,而是執行您期望的任何邏輯。

4

Symfony2的標準路由組件不支持,但是,這個包填充Symfony1留下的空缺:

https://github.com/LeaseWeb/LswDefaultRoutingBundle

它做你的期望。

FosUserBundle: 
    resource: "@FosUserBundle" 
    prefix: /
    type:  default 

它會掃描你的包,並自動添加路由的路由表,你可以通過執行調試:自動添加默認路由的

app/console router:debug 

實例可以使用此語法缺省路由的包:

[router] Current routes 
Name       Method Pattern 
fos_user.user.login_check  ANY /user/login_check.{_format} 
fos_user.user.logout   ANY /user/logout.{_format} 
fos_user.user.login   ANY /user/login.{_format} 
... 

您會發現它也支持使用文件擴展名(html,json或xml)進行自動「格式」選擇。