我想在 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 ...
}