2011-11-02 49 views
1

我正在使用symfony 2實現一個Web應用程序。它有一個通過「CoreBundle」提供的主頁面,該頁面加載了div內其他應用程序包的內容。爲了處理這個問題,我想讓CoreBundle路由捕獲所有路由,然後將請求轉發到應用程序包以獲取div內的內容。在特定捆綁包中查找路線

的路線是:

@Route("{app_name}/{garbage}", name="_core_app_garbage", requirement={"garbage"=".*"}) 

這個偉大的工程。它將$ app_name設置爲應用程序的名稱(第一個子目錄)以及$ garbage中的其餘uri。

我的問題是在特定的應用程序中試圖找到$垃圾的路線。核心包擁有應用程序包名稱的知識。

到目前爲止,我曾嘗試以下兩件事情:

  1. 使用路由器服務來查找路線,但試圖刪除捕獲所有路由:似乎

    $router->getRouteCollection()->remove("_core_app_garbage"); 
    

    不是改變任何事情(我得到的路線仍然是全部)。

  2. 創建我自己的路由器。我嘗試了各種配置,但它似乎需要大量的類創作和特定的類創建(AnnotationDirectoryLoader在我的情況)。這對我習慣Symfony來說似乎過於困難,如果我決定改變路由格式(例如,以YAML爲例),它不可移植。

是否有一個快速簡便的方法來做到這一點?

+0

你有沒有嘗試過將捕獲所有的路由移動到你的路由配置的底部? – prehfeldt

回答

1

我找到了一個不錯的解決方案,雖然它並不完美:

基本上我加載路由集合使用「routing.loader」服務的特定包。然後我創建自己的UrlMatcher以匹配這些路線。

// Get the route collection for the app's bundle 
$kernel = $this->container->get('kernel'); 
$routingFilesLocation = $kernel->locateResource('@'. $app->getBundle() . '/Controller/'); 
$routeLoader = $this->container->get('routing.loader'); 
$collection = $routeLoader->load($routingFilesLocation); 

// Ensure that we don't get in a redirect loop when 
// loading the dashboard of core 
$collection->remove('_core_redirect_home'); 

// Try to match the rest of the url to one of the routes 
$router = $this->container->get('router'); 
$routeString = $routingFilesLocation . "<br/>"; 
$url = "/" . $garbage; 

$matcher = new UrlMatcher($collection, $router->getContext()); 
try 
{ 
    $routes = $matcher->match($url); 
} 
catch(ResourceNotFoundException $e) 
{ 
    throw $this->createNotFoundException('Could not find "' . $url . '" route within ' . $app_name); 
} 
$response = $this->forward($routes['_controller']); 

這裏的問題是,我硬編碼僅查找在包內的「控制器」文件夾中的控制器。