[英]What is the best way to embed a part of one page in another in symfony
在我的項目中,我經常需要在不同的頁面上重復使用相同的模板,通常使用不同的過濾器參數。 我考慮使用控制器方法和樹枝render
函數來執行它。
在我的控制器中:
public function index(Request $request) {
return $this->render("index.html.twig");
}
public function list(Request $request, array $filterArray = []) {
return $this->render("list.html.twig", [
'items' => $this->getFilteredItems($filterArray)
]);
}
public function entry(Request $request, string $alias) {
return $this->render("entry.html.twig"[
'item' => $this->getItemByAlias($alias)
]);
}
在index.html.twig
:
{{ render(controller(
'App\\Controller\\SynthesisController::entityList', {},
{ }
)) }}
在list.html.twig
:
{% for item in items %}
<div class="">
<a href="">{{item.name}}</a>
</div>
{% endfor %}
因此,它允許我使用其布局重用其他頁面中的實體列表。 在entry.html.twig
:
<div class="synthesis-participants">
<div class="row">
<div class="col-sm-6 mb-4">
<div class="h5">Reagents:</div>
{{ render(controller(
'App\\Controller\\SubstanceController::entityList', { 'filterArray': {
'participate': { 'synthesis': item.id, 'role': 10 }
} }, { }
)) }}
</div>
<div class="col-sm-6 mb-4">
<div class="h5">Products:</div>
{{ render(controller(
'App\\Controller\\SubstanceController::entityList', { 'filterArray': {
'participate': { 'synthesis': item.id, 'role': 20 }
} }, { }
)) }}
</div>
</div>
<div class="row">
<div class="col-sm-6 mb-4">
<div class="h5">Diluents:</div>
{{ render(controller(
'App\\Controller\\SubstanceController::entityList', { 'filterArray': {
'participate': { 'synthesis': item.id, 'role': 30 }
} }, { }
)) }}
</div>
<div class="col-sm-6 mb-4">
<div class="h5">Catalysts:</div>
{{ render(controller(
'App\\Controller\\SubstanceController::entityList', { 'filterArray': {
'participate': { 'synthesis': item.id, 'role': 40 }
} }, { }
)) }}
</div>
</div>
<p class="mt-2">{{ item.text }}</p>
</div>
也許它可以以更好的方式到達?
在我看來,您應該避免這種方式,因為您嵌入了太多控制器,而且我發現開銷大於收益。
或者,您可以在每個控制器中添加一些功能以獲取必要的信息,然后在您的樹枝中包含適當的模板。
我會把你的控制器改成這樣:
public function index(Request $request) {
return $this->render("index.html.twig", [
'items' => $this->getFilteredItems()
]);
}
public function list(Request $request, array $filterArray = []) {
return $this->render("list.html.twig", [
'items' => $this->getFilteredItems($filterArray)
]);
}
public function entry(Request $request, string $alias) {
$item = $this->getItemByAlias($alias);
$items = [];
$titles = ['Reagents', 'Products', 'Diluents', 'Catalysts'];
foreach (range(10, 40, 10) as $key => $role) {
$filter['participate'] = [
'synthesis' => $item['id'], // $item->getId()
'role' => $role
];
$title = $titles[$key];
$items[$title] = $this->getFilteredItems($filter);
}
return $this->render("entry.html.twig"[
'item' => $this->getItemByAlias($alias),
'items' => $items
]);
}
最后,在您的entry.html.twig
:
<div class="synthesis-participants">
{% for key, itemArray in items %}
<div class="row">
<div class="col-sm-6 mb-4">
<div class="h5">{{ key }} :</div>
{% include 'list.html.twig' with {'items': itemArray} only %}
</div>
</div>
{% endfor %}
<p class="mt-2">{{ item.text }}</p>
</div>
我還建議函數getItemByAlias
、 getFilteredItems
不應存在於控制器中,而應存在於存儲庫或服務中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.