如何直接从方法呈现视图,而不将View或Response返回给调用方法

时间:2014-05-14 18:52:50

标签: laravel laravel-4

我的BaseController中有一个方法(这里简化了以避免因不重要的细节而分心):

protected function handle_empty($report) {
  if (count($report) == 0) {
    return Response::make('Error: that report does not have any data available.', 404, array());
  }
}

它旨在用于许多不同的控制器方法来处理我从JSON生成报告的情况,并且我已经获得了JSON而没有任何报告数据。

我希望能够在(例如)ScandownController的{​​{1}}方法(以及createHTML()createPDF方法中使用它,以及所有方法在我必须生成的十几个其他报告的所有其他控制器中使用相同的方法,我想在一行中完成,最好是这样:

createXL

这(当然!)不起作用,因为$this->handle_empty($report); 返回 a handle_empty。无论如何我可以直接从那里渲染它吗?类似的东西:

Response

我不想将protected function handle_empty($report) { if (count($report) == 0) { # NOTE: *render* instead of *return*: render Response::make('Error: that report does not have any data available.', 404, array()); } } / if子句复制并粘贴到每个报告的then方法,createHTML方法和createPDF方法中,因为那只是一种可怕的做法。我有一个解决方法,允许我在每个报告生成方法中使用一行,但它是丑陋的,并没有更好。

createXL

那么Laravel立即呈现的是什么,而不是仅仅将值返回给路由器调用的方法?

我根据Googling找到的内容尝试了这个(有和没有回声),它没有用:

if ($this->is_defective($report)) { return $this->bail(); }

<小时/> 更新

我试图仅包含有助于解释问题的详细信息,并包含所有有用的细节,但如果所有前面的信息对您没有意义,那么问题归结为:

辅助方法(由控制器操作调用)如何强制呈现Response::make('blah blah', 404, array())->render(); View,而不仅仅Response将其转换为控制器操作return 1}}。

1 个答案:

答案 0 :(得分:3)

  1. 定义扩展Exception的新Exception类。说,class YourNameSpace\CustomException extends Exception {}

  2. YourNameSpace\CustomException

    投掷handle_empty()
    protected function handle_empty() {
         if (count($report) == 0) throw new YourNamespace\CustomException;
    }
    
  3. 处理App :: error中的异常。 (在app/start/global

    App::error(function(YourNamespace\CustomException $exception)
    {
         // Handle the exception...
         return Response::make('Error: that report does not have any data available.', 404, array());
    });
    
  4. 确保它出现在App::error(function(Exception $exception){});处理程序之前。

相关问题