php - 从存储库加载可重用数据的最简洁方法是什么?
问题描述
我在 symfony 中有一个菜单栏,它被加载到我项目中的每个站点。通常我加载这样的数据:
/**
* @Route("", name="main")
*
*
*/
public function main()
{
$category_rep = $_om->getRepository(Category::class);
$this->categories = $category_rep->findAll();
....
}
很好,但我正在寻找更好的解决方案来将数据加载到整个控制器或项目。我通过以下方式找到了自动加载数据的解决方案:
@Entity("category", expr="repository.find($id)")
public function index(Category $category)
但它只能给我一个来自类别实体的结果(在菜单栏中,我想显示存储库中的所有类别)。第二个想法是在控制器中创建构造函数,它像这样加载这些数据:
private $categories;
public function __construct(ObjectManager $_om)
{
$category_rep = $_om->getRepository(Category::class);
$this->categories = $category_rep->findAll();
}
或制作将加载该数据并在每种方法中运行此服务的服务。我想问其中哪个想法是最好的(“最干净的”)解决方案。也许这是另一个更好的选择??
谢谢你的帮助,克里斯
解决方案
一个简单的解决方案可能是一个单独的控制器操作来获取菜单的类别,例如:
class MenuController extends AbstractController
{
public function displayMainMenu()
{
$categories = $this->getDoctrine()->getRepository(Category::class)->findAll();
return $this->render('menu/main.html.twig', [
'categories' => $categories,
]);
}
}
这将返回一个部分模板,其中仅包含菜单 HTML,如下所示:
# menu/main.html.twig
{% for category in categories %}
<div>
<a href="{{ path('/url/to/view/category/with/id', { id: category.id }) }}">
{{ category.name }}
</a>
</div>
{% endfor %}
现在您只需要base.html.twig
通过嵌入控制器来包含该呈现的模板:
<div class="menubar">
{{ render(controller('App\\Controller\\MenuController\\displayMainMenu')) }}
</div>
对于更高级的菜单,您可以考虑使用专用包,例如KnpMenuBundle
推荐阅读
- r - 使用 dplyr 进行分组和转置
- java - Class.getCanonicalName 有性能问题吗?
- vim - 如何在文档的最开头启动 Vim 语法区域,同时在同一位置允许关键字匹配?
- postgresql - 在 postgresql 中喜欢和不喜欢
- python - PyQt5 突出显示选定的 TreeWidget 单元格
- arrays - 获取 json 对象数组并映射到模型类 Laravel
- python - 如何使用 Python 将注册表单连接到 MySQL?
- node.js - express 是怎么知道这个路由的?
- python - execute和execute_script selenium函数python有什么区别
- docker - 在 golang 中导入存档/tar 时 docker run 失败