采用 KNPMenu 构建器来构建主导航、帐户导航和管理导航
**您的功能请求是否与问题有关?请描述。** 导航包含功能标记、权限、用户状态和部署选择。当这些条件存在于 Twig 模板中时,它们很难单独测试,可选扩展必须复制或覆盖全局模板。这会导致合并摩擦,使小菜单的增加成本过高。 此外,多个页面还直接在 Twig 中定义 Materialize 标签导航。虽然这些标签包含较少的可见性决策,但单独维护它们的标记会阻止导航组件遵循单一、一致的实现。 **请描述您希望的解决方案** 采用与 2.7 平台兼容的 `KnpMenu` 和 `KnpMenuBundle` 版本。定义主导航、帐户导航、管理导航和标签导航的服务构建器。将可见性决策放置在 Symfony 服务中,以便可以单元测试它们,并且可以依赖身份验证的用户和已启用的功能,而无需模板逻辑扩散。 将所有现有 Materialize 标签导航作为同一实现的一部分进行迁移,包括用户配置、内部设置、关于和如何使用页面。为它们的通用 Materialize 标记使用共享的 KNP Twig 模板,同时保留每个页面的现有标签、标签、片段目标、排序和行为。 通过 KNP Twig 帮助程序/模板渲染这些菜单,同时保留 Materialize 标记、可访问性语义、活动状态样式、翻译和响应式行为。发布适于装饰的具体服务边界,以便可选的捆绑可以扩展和装饰核心构建器,以添加、删除或重新排序自己的项目,而无需替换核心模板。对于这些扩展点,不需要专用的应用程序接口。 **请描述您考虑过的替代方案** 继续以手动渲染的 Twig 标记的形式保留现有标签将会减少当前的范围,但会导致相同的导航组件有两种不同的实现,并重复 Materialize 标签渲染,该渲染已通过此工作引入。 **额外上下文** 此工作应遵循专用的前提条件重构,该重构将 JavaScript 仅限链接替换为整个应用程序中的语义按钮。KNP 渲染器应保留由此产生的区分,即导航链接、有意义的片段链接和 JavaScript 动作按钮,而不是重新引入虚假链接目标。 建议的接受标准: * 主、帐户、管理和标签菜单树具有命名构建器和文档扩展点; * 用户配置、内部设置、关于和如何使用页面上的所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染; * 所有现有 Materialize 标签都通过 KNP Menu 渲染
内容来源: wallabag/wallabag