Laravel 4:创建默认路由

Ste*_*n S 2 php laravel laravel-4

我正在尝试在我的Laravel 4 REST API中创建一个默认路由,当我的其他任何定义的路由都没有匹配请求时,该路由会将特定错误返回给调用者.

这可能吗?不幸的是,我在文档中找不到任何内容,所以我玩了一下并尝试使用通配符(*)作为我的最后一个路径定义,routes.php但这不起作用.

Route::when("*", function(){
    throw new CustomizedException('Route not found...');
});
Run Code Online (Sandbox Code Playgroud)

当我有这条路线并做一个artisan routes,我得到一个例外: {"error":{"type":"ErrorException","message":"Object of class Closure could not be converted to string","file":"\/Applications\/MAMP\/htdocs\/CampaigningTools\/vendor\/laravel\/framework\/src\/Illuminate\/Foundation\/Console\/RoutesCommand.php","line":153}}

调用不存在的路由不会触发我的自定义异常,而是标准的异常: {"error":{"type":"Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException","message":"","file":"\/Applications\/MAMP\/htdocs\/CampaigningTools\/vendor\/laravel\/framework\/src\/Illuminate\/Routing\/Router.php","line":1429}}

我也试过any按照这篇文章的建议使用,但这也行不通:

Route::any( '(.*)', function( $page ){
    throw new ValidationException('Custom error');
});
Run Code Online (Sandbox Code Playgroud)

当我呼叫一条不存在的路线时,这条路线也不会开火.

任何提示,我做错了将不胜感激.

iva*_*hoe 19

我花了一段时间来弄清楚这一点,实际上@devo非常接近:

Route::get('{slug}', function($slug) {

    // check your DB for $slug, get the page, etc...

})->where('slug', '^.*');
Run Code Online (Sandbox Code Playgroud)

这将赶上/.如果您更愿意单独处理主页,请将正则表达式更改为:where('slug','^.+');

  • 这是一个非常好的答案.需要更多的赞成. (3认同)

pus*_*sch 8

如果没有匹配的路由,Laravel会抛出"Symfony\Component\HttpKernel\Exception\NotFoundHttpException".您可以简单地编写自己的错误处理程序来捕获该异常并执行其他操作(请查看http://laravel.com/docs/errors).

添加以下两个块之一(例如,在"Application Error Handler"块中的"app/start/global.php"中):

App::error(function(\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $exception, $code)
{
    // do something
});
Run Code Online (Sandbox Code Playgroud)

要么:

App::missing(function($exception)
{
    // do something
});
Run Code Online (Sandbox Code Playgroud)