Laravel "top-down" 模板渲染
Laravel "top-down" template rendering
我在使用 Laravel and/or Blade 时遇到了一个简单的问题,但没有弄清楚如何将其纳入 Laravel 范式:
我有一个应该显示不同子视图列表的父视图。在我目前的理解中,我需要深入到列表元素和 "extend" 父元素。但是我应该如何插入兄弟模板呢?我需要一种方法来渲染模板 "top-down" 而不是 "bottom-up".
------ Parent template -----
group.show
--------- List ---------
group_assets.type-A.show
group_assets.type-B.show
group_assets.type-B.show
group_assets.type-B.show
group_assets.type-C.show
group_assets.type-A.show
我的方法如下:
class GroupController extends Controller {
...
public function show($id){
$group = Group::find($id);
$view = view('groups.show', [
'group' => $group
]);
$groupAssetController = new GroupAssetController();
foreach($group->assets as $i => $asset){
$view->with($groupAssetController->show($asset->id));
}
return $view;
}
...
}
class GroupAssetController extends Controller{
...
public function show($id){
$asset = GroupAsset::find($id);
return view('group_assets.' . $asset->type . '.show', [
"asset" => $asset
]);
}
...
}
您可以使用 @include
指令在主视图中包含子视图。首先,您应该 eager-load 资产:
class GroupController extends Controller {
public function show($id) {
// Eager load assets
$group = Group::with('assets')->find($id);
return view('groups.show', [
'group' => $group
]);
}
}
然后您可以动态包含子视图并传递每个子视图应该可用的资产模型:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Master View</title>
</head>
<body>
{{-- include subviews for each asset --}}
@foreach($group->assets as $asset)
@include('group_assets.' . $asset->type . '.show', ['asset' => $asset])
@endforeach
</body>
</html>
我在使用 Laravel and/or Blade 时遇到了一个简单的问题,但没有弄清楚如何将其纳入 Laravel 范式:
我有一个应该显示不同子视图列表的父视图。在我目前的理解中,我需要深入到列表元素和 "extend" 父元素。但是我应该如何插入兄弟模板呢?我需要一种方法来渲染模板 "top-down" 而不是 "bottom-up".
------ Parent template -----
group.show
--------- List ---------
group_assets.type-A.show
group_assets.type-B.show
group_assets.type-B.show
group_assets.type-B.show
group_assets.type-C.show
group_assets.type-A.show
我的方法如下:
class GroupController extends Controller {
...
public function show($id){
$group = Group::find($id);
$view = view('groups.show', [
'group' => $group
]);
$groupAssetController = new GroupAssetController();
foreach($group->assets as $i => $asset){
$view->with($groupAssetController->show($asset->id));
}
return $view;
}
...
}
class GroupAssetController extends Controller{
...
public function show($id){
$asset = GroupAsset::find($id);
return view('group_assets.' . $asset->type . '.show', [
"asset" => $asset
]);
}
...
}
您可以使用 @include
指令在主视图中包含子视图。首先,您应该 eager-load 资产:
class GroupController extends Controller {
public function show($id) {
// Eager load assets
$group = Group::with('assets')->find($id);
return view('groups.show', [
'group' => $group
]);
}
}
然后您可以动态包含子视图并传递每个子视图应该可用的资产模型:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Master View</title>
</head>
<body>
{{-- include subviews for each asset --}}
@foreach($group->assets as $asset)
@include('group_assets.' . $asset->type . '.show', ['asset' => $asset])
@endforeach
</body>
</html>