您可以攔截請求並使用您自己的路由器偵聽器執行您的魔術。
我沒有測試它自己,但我只是想給你點到正確的方向。
在你service.xml文件,你可以添加類似的東西:
<parameters>
<parameter key="my.router_listener.class">MyBundle\Listener\RouterListener</parameter>
</parameters>
<services>
<service id="my.router_listener" class="%my.router_listener.class%">
<argument type="service" id="doctrine.orm.entity_manager" />
<tag name="kernel.event_subscriber" priority="33" />
</service>
</services>
這裏的優先級是很重要的。 32是默認路由器。你想成爲它。 http://symfony.com/doc/current/reference/dic_tags.html
然後創建這樣的服務:
class DynamicRouterListener extends RouterListener
{
private $entityManager;
public function __construct(EntityManager $entityManager)
{
//...
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$path = $request->getPathinfo();
// Some magic here
if(// magic is true) {
$request->attributes->set('_controller', 'MyBundle:MyController:myAction');
}
}
}
路由器默認的,那隨之而來的,將看到_ controller
參數已經存在,並會跳過匹配到dafult規則。
謝謝,這比使用控制器動作決定轉發請求的位置要好得多,並且不需要對404進行任何額外的處理。我想在此基礎上進行構建,這是使全局路由不會冒險發生衝突的最佳方式或需要一系列的數據庫查詢,將有一個'Route'實體與每種類型的內容有關?他們可以通過批量獲取(並在生產中緩存)用於我的路由器事件偵聽器使用的服務,這將處理檢查請求的URI是否存在? – Adam
@亞當我認爲這是一個設計問題。當然,您可以創建儘可能多的偵聽器作爲您想要的對象類型,但問題是您將擁有多少類型以及將來有可能如何更改?如果,正如你在帖子中提到的那樣,你有三種類型,那麼我會建議在一個類中處理它。只要保持小。 –