【问题标题】:Laravel 4: Create a default routeLaravel 4:创建默认路由
【发布时间】:2013-09-27 08:51:42
【问题描述】:

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

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

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

我也尝试按照in this post 的建议使用any,但这也不起作用:

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

当我调用不存在的路由时,该路由也不会触发。

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

【问题讨论】:

    标签: php laravel laravel-4


    【解决方案1】:

    我花了一段时间才弄明白,实际上@devo 非常接近:

    Route::get('{slug}', function($slug) {
    
        // check your DB for $slug, get the page, etc...
    
    })->where('slug', '^.*');
    

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

    【讨论】:

    • 我打算写同样的答案... +1 以节省我的时间:D
    【解决方案2】:

    如果没有匹配的路由,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
    });
    

    【讨论】:

      【解决方案3】:

      试试这样的,

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

      【讨论】:

      • 这仅适用于像 /foo 这样的简单 url。如果你有 /foo/bar 它不会抓住它...
      【解决方案4】:

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

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

      或者

      Route::any('/{default?}', 'TestController@yourMethod'); // pointing to a method displaying a 404 custom page
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-06
        • 1970-01-01
        • 2014-09-05
        • 2017-08-11
        • 2014-01-11
        • 1970-01-01
        • 2018-09-29
        • 2020-05-17
        相关资源
        最近更新 更多