2011-07-14 90 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