2

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

这可能吗?不幸的是,我在文档中一无所获,所以我尝试使用通配符 ( *) 作为我的最后一个 Route 定义,routes.php但这不起作用。

Route::when("*", function(){
    throw new CustomizedException('Route not found...');
});

当我有这条路线并做一个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');
});

当我调用不存在的路线时,这条路线也不会触发。

任何提示,我做错了什么将不胜感激。

4

4 回答 4

19

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

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

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

})->where('slug', '^.*');

这也会捕获 / 。如果您希望单独处理主页,请将正则表达式更改为: where('slug', '^.+');

于 2013-10-13T03:48:03.323 回答
8

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

添加以下两个块之一(例如,在“应用程序错误处理程序”块中的“app/start/global.php”中):

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

或者:

App::missing(function($exception)
{
    // do something
});
于 2013-09-22T11:01:00.460 回答
1

试试这样的,

Route::get('{slug}', function($slug) {
    // get the page from database using Page model
    $page = Page::where('slug', '=', $slug)->first();

    if ( is_null($page) ) {
        return App::abort(404);
    }

    return View::make('page')->with('page',$page);
});

// Show 404 Page

App::missing(function($exception)
{
    return Response::view('errors.missing', array(), 404);
});
于 2013-09-22T10:19:02.110 回答
1

试着把它放在你的路由文件的末尾?

Route::any( '/{default?}', function( $page ){
    throw new ValidationException('Custom error');
});

或者

Route::any('/{default?}', 'TestController@yourMethod'); // pointing to a method displaying a 404 custom page
于 2017-08-26T16:03:23.320 回答