【问题标题】:Routing in Silex/Symfony. Providing a default routeSilex/Symfony 中的路由。提供默认路由
【发布时间】:2011-10-05 08:00:20
【问题描述】:

我正在尝试使用 Silex(它使用 Symfony 路由组件 - 所以答案也可能适用于 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)

【问题讨论】:

  • 我有一个关于你的问题的问题,不应该在没有将 url 映射到 index.php 文件的情况下,在 apache 上重写 url 处理已经存在的文件吗?听起来很奇怪......
  • @camus 不,因为我需要通过前端控制器路由应用程序中的每个请求,以便引导应用程序(安全性、数据库连接等)。编辑:我已经对问题进行了澄清

标签: symfony routing silex


【解决方案1】:

我在 symfony 食谱中找到了答案...

http://symfony.com/doc/2.0/cookbook/routing/slash_in_parameter.html

$app->match('{url}', function($url){
    //do legacy stuff
})->assert('url', '.+');

【讨论】:

  • 您会将上面的代码放在哪个文件中?它是否与 routes.yaml 共存?
【解决方案2】:

您可以使用错误处理,例如:

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);
});

【讨论】:

  • 嗨,Charles,问题不在于错误没有得到处理 - 而在于它首先被抛出。我找到了解决我的问题的方法。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2012-03-17
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多