2011-07-14 87 views
8

我試圖使用Silex的做一些事情(使用的Symfony路由組件 - 這樣的答案可以適用於Symfony的爲好)在Silex/Symfony中路由。提供了一條默認路由

我加入的Silex到遺留應用程序提供路由,但我需要尊重現有的用於加載文件的應用程序默認實現(這只是從指定的URL從文件系統加載文件)。

編輯:澄清: 在進行一系列引導調用後,現有文件作爲包含在父模板中的文件系統加載。

我發現,如果沒有定義的路徑來匹配傳統頁面,Silex會拋出一個異常。

我真的需要一種方法來提供處理這些遺留頁面的默認(回退)機制 - 但我的模式必須匹配整個url(不只是一個片段)。

這可能嗎?

// Include Silex for routing  
require_once(CLASS_PATH . 'Silex/silex.phar'); 

// Init Silex 
$app = new Silex\Application(); 

    // route for new code 
    // matches for new restful interface (like /category/add/mynewcategory) 

    $app->match('/category/{action}/{name}/', function($action, $name){ 
     //do RESTFUL things 
    }); 

    // route for legacy code (If I leave this out then Silex 
    // throws an exception beacuse it hasn't matched any routes 

    $app->match('{match_the_entire_url_including_slashes}', function($match_the_entire_url_including_slashes){ 
     //do legacy stuff 
    }); 

    $app->run(); 

這必須是一個常見用例。我想提供一種方法來有靠遺留代碼RESTful接口(負載/myfolder/mysubfolder/my_php_script.php)

+1

我有一個問題,關於你的問題,不應該URL重寫上已經阿帕奇處理現有網絡沒有將URL映射到您的index.php文件?聽起來很奇怪...... – mpm

+0

@camus不,因爲我需要通過前端控制器路由每個請求,以引導應用程序(安全性,數據庫連接等)。編輯:我已經添加了一個問題的澄清 – calumbrodie

回答

4

您可以使用錯誤處理,有類似的東西:

use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpKernel\Exception\HttpException; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

$app->error(function (\Exception $e) use ($app) { 
if ($e instanceof NotFoundHttpException) { 
     return new Response('The requested page could not be found. '.$app['request']->getRequestUri(), 404); 
    } 
    $code = ($e instanceof HttpException) ? $e->getStatusCode() : 500; 
    return new Response('We are sorry, but something went terribly wrong.', $code); 
}); 
+0

嗨查爾斯,問題不是錯誤沒有被處理 - 而是它被拋出首位。我找到了解決我的問題的方法。感謝您的輸入。 – calumbrodie