首页 > 解决方案 > 从存储库加载可重用数据的最简洁方法是什么?

问题描述

我在 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();

}

或制作将加载该数据并在每种方法中运行此服务的服务。我想问其中哪个想法是最好的(“最干净的”)解决方案。也许这是另一个更好的选择??

谢谢你的帮助,克里斯

标签: phpsymfonydoctrine-orm

解决方案


一个简单的解决方案可能是一个单独的控制器操作来获取菜单的类别,例如:

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


推荐阅读