2012-07-06 132 views
1

我有一些相當複雜的路由規則,只能使用自定義代碼實現,而不能使用默認路由器。使用Symfony 2自定義路由

路由器還要考慮到域名。

是否有可能(以及如何)定義我自己的路由器類,這將有一個方法接受Request並返回包/控制器名稱?

+0

可能重複http://stackoverflow.com/questions/8384660/custom-route-class) – 2012-07-06 17:17:06

+0

@Peter Bailey:我已經讀過這個問題,我甚至提供過並且獎勵了它。這個問題更具體,因爲我不是隻根據請求URI進行路由,而是根據域名進行路由。 – Benjamin 2012-07-07 23:06:07

+0

好吧,有一些bundle基於域進行路由,但它也被放到了Symfony 2.2的核心中https://github.com/symfony/symfony/pull/3378。此外,另一個答案就可能適合http://stackoverflow.com/questions/5366234/symfony2-routing-route-subdomains – 2012-07-10 14:32:07

回答

4

爲了達到你的要求奏鳴曲管理包,你並不需要完全重新定義了路由器

你可以簡單地寫自己的類,它實現UrlMatcherInterface。如果您希望能夠生成與您的方案相匹配的URL,則必須創建另一個類別,以覆蓋UrlGeneratorInterface

爲了考慮域名,你需要使用RequestContext,它被傳遞給它們的構造函數(沒有很好的文檔記錄,但是檢查Router ::獲得{Matcher,Generator}的細節)。

一旦你的類準備好了,你可以通過重寫你的包中的參數「router.options.generator_class」和「router.options.matcher_class」來將它們注入到路由器中。


然而,它可能不是你想要的東西,最好的方法 - 覆蓋路由器的部分一樣,需要大量的護理,以保持所有的緩存。

您可能需要考慮使用Symfony2的普通路由器,但根據請求的域名來處理不同的路由文件。如果您將Web服務器配置爲設置變量或根據域名執行不同的前端控制器,則可以輕鬆完成此操作。

使用這些信息,您可以爲每個請求加載一個不同的「環境」,不同環境之間的唯一區別是它們使用不同的路由文件。

+0

如何擴展Symfony路由的UrlMatcher,並注入?這樣,您可以保留原始路由邏輯,並在必要時注入自己的路由邏輯。我還沒有測試過,但我想這樣做來檢查特定路由的瀏覽器類型,因此它們可用於特定(例如移動)瀏覽器。 – GergelyPolonkai 2012-08-07 19:13:21

+0

這正是我在回答的第一部分所建議的內容(router.options.matcher_class參數是您用來注入自定義UrlMatcher的參數)。但請記住,如果您希望生成的URL正常工作,則還必須覆蓋UrlGenerator。 – 2012-08-08 00:56:26

0

是指由具有自定義路由class

1

在學習了Matthias Noback的教程之後,我對CRUD路由構建器做了一些修改。

前和使用CrudLoader在這裏可以看到在routing/crud/acompetencies.yml

後,這僅僅是一個解決辦法或資源,你可以在這個CrudLoader類看的濫用。

我不知道這是對還是不好的做法。它似乎運作良好。

0

symfony的2.5需要參數定製匹配:router.options.matcher_base_class 和其實現的Symfony \元器件\路由\匹配器\ RequestMatcherInterface類

[自定義路由類(的