在拉拉维尔自动设置视图


Auto set view in Laravel

我想在 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或我可以做到这一点的地方有类似上面的东西?

从这里的臀部射击,但你能像下面这样做你的路由吗? 完全按照所示使用这是一个坏主意,但可能是您要执行的操作的起点。

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

这将起作用(Laravel 4)

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

在任何版本中重命名操作并在控制器类中实现魔术方法__call。例如,对于路由到"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 ...
}