Laravel中的自动设置视图

时间:2013-11-02 14:40:04

标签: php constructor routing laravel laravel-4

我想在Laravel中自动设置GET请求的视图。在BaseController构造函数中,我执行此操作:

if (Request::server('REQUEST_METHOD') === 'GET')
{
    $action = explode('@', Route::currentRouteAction());
    $view = explode('get', $action[1]);
    $view = strtolower(end($view));
    $controller = strtolower(explode('Controller', $action[0])[0]);

    $this->data['view'] = $controller . '.' . $view;
}

所以基本上如果我们发出/some/page请求,它会查找名为views/some/page.blade.php的视图文件。

目前,我使用$this->data设置了一些数据和其他属性。所以我在每个方法中发送视图之前构建我的数据:

$this->layout->with($this->data);

我最终在每个GET方法中进行了上述调用,并希望自动执行此操作。使用$this->data的问题是我无法访问任何过滤器或其他闭包。是否有一个魔术方法或全局数据存储,我没有使用,我可以在每个请求结束时调用,只是抽出布局?

function afterEveryThing()
{
    $this->layout->with($this->data);
}

BaseController中的上述内容或我能做到的地方?

2 个答案:

答案 0 :(得分:1)

在这里从臀部拍摄,但你可以做下面的路由。完全按照所示使用这是一个坏主意,但可能是你想要做的事情的起点。

Route::any('{controller}/{method}', function($controller, $method) {

   $controllerName = ucfirst($controller) . "Controller";

   $controllerObject = new $controllerName;

   if (Request::server('REQUEST_METHOD') === 'GET')
   {
          $controllerObject->$method();

          return View::make("$controller.$method")->with('data', $controllerObject->data);
   }
   else
   {
          return $controllerObject->$method();
   }

});

答案 1 :(得分:0)

这将有效(Laravel 4)

App::after(function($request, $response)
{
    //
});

在任何版本中重命名操作并在控制器类中实现魔术方法 __ call 。例如,路由到“IndexController @ 索引”操作:

IndexController.php

private function __call($method, $args) {

     ... look for a view...

    if (in_array('my_'.$method, self::$methods)) {
        //call to index translated to my_index
        call_user_func_array(array($this,'my_'.$method), $args); 
    } else {
        //error no action
        abort(404);
    }

     ... after every thing ...

}
public function my_index(Request $request)  {
    ... do action ...
}