【问题标题】:Symfony2 templates/layoutsSymfony2 模板/布局
【发布时间】:2013-02-08 17:18:52
【问题描述】:

我是 symfony2 的新手,所以如果这是一个愚蠢的问题,请原谅我。

Symfony2 以捆绑的形式组织 - 所以一切都是捆绑的,对吧?

基于此,我创建了以下捆绑包,以便拥有一个简单的登录机制:

  • 应用程序
    • 主包将包含所有全局功能
  • 用户
    • 将用于代表用户

所以捆绑包可以正常工作,一切都很好。

现在我想不出向网站添加布局/主题结构的最佳方法。

我显然需要一些全局资源,例如页眉、导航和页脚。但除此之外,还需要一些全局的 css 样式表、jquery 等。

最明显的地方 bundle 是 App - 但是我如何让所有其他 bundle 继承这个 bundle 的主题。比如用户bundle模板需要扩展App bundle等。

bundle 的想法是它们是模块化和自包含的,因此如何实现这一点

【问题讨论】:

  • 您可以通过它们的包名称访问任何其他包模板等。把它们想象成一个类,它们被包含,但可以访问。
  • 阅读 SF2 书籍! :) symfony.com/doc/current/book/index.html

标签: symfony


【解决方案1】:

我个人是这样使用的:

有 MainBundle(在您的情况下是 App),它提供全局服务、树枝扩展和布局。全局资产包含在此文件中。

所有其他包的主布局扩展了 MainBundle 的布局。每个 bundle 中的模板都扩展到它的主布局,这扩展了 MainBundle 的布局。例如,

- MainBundle
    - views
         - layout.html.twig
- UserBundle
    - views
         - layout.html.twig (extends to MainBundle/layout)
         - show.html.twig (extends to UserBundle/layout)
         - friends.html.twig (extends to UserBundle/layout)

【讨论】:

  • 这是我的想法,但这意味着 UserBundle 必须“了解” MainBundle,在我的例子中是 App.所以它们现在是耦合的,我安装的所有其他捆绑软件也是如此
  • @MartyWallace 你说得对,因为它们完全与你的应用程序耦合,你没有理由/意图将它们分开,将它们作为单独的包没有任何好处。在下面检查我的答案。
  • 然后你可以在config中定义你的App bundle;每个其他捆绑软件都会从配置参数中“了解”它。除此之外,您无能为力。我知道它们是自包含的,但您必须在某一时刻相互关联,就像应该在 config.yml 中配置一些第 3 方一样
【解决方案2】:

一切都在官方文档中解释:http://symfony.com/doc/current/templating.html

基本的全局视图(模板)资源放在以下目录中:

app/Resources/views/index.html.twig

如果您有特定用途,或者捆绑包、模板,请将它们放在子目录中,例如:

app/Resources/views/blog/index.html.twig

如果您想将所有内容保留在捆绑包中(对于可重用代码而言是必须的),请使用以下约定:

[VendorName/]YourBundle/Resources/views/Blog/index.html.twig

(当然,除 Twig 的“.html.twig”扩展名外,任何名称都可以更改为您喜欢的名称)

【讨论】:

    【解决方案3】:

    我更喜欢的策略是将我的应用程序组织在一个包中。如果您不打算在多个应用程序中重复使用不同的独立功能,那么这是最合适的方式。在您自己的应用程序命名空间中拥有“UserBundle”可能没有意义。您添加了许多对您没有任何好处的额外结构。请考虑一下:

    - MainBundle
        - Controller
            - UserController
            - OtherController
        - Resources
            - views
                - layout.html.twig
                - User
                    - show.html.twig
                    - update.html.twig
                    - friends.html.twig
                - Other
                    - some_other_view.html.twig
    

    在这种情况下,控制器目录下的模板将扩展 MainBundle::layout.html.twig

    【讨论】:

    • 安装第 3 方捆绑包怎么样。这将如何选择 MainBundle 布局?这是否意味着更改第 3 方捆绑代码?我认为这在某种程度上违背了捆绑的目的。就像 zend 有模块一样,symfony 有包,这种模块化的方法有很多好处。我明白你关于重用的观点,但我认为这不仅仅是重用。关注点的逻辑分离是有意义的,并使代码更易于维护,不是吗?
    • 这不会阻止您使用第三方捆绑包。与第三方捆绑包和您的应用程序代码之间没有一对一的关系。所以我不太清楚你的意思。
    • 这意味着你应该有一个应用程序包?为什么要打扰捆绑系统?
    • 好的,假设我向系统引入了第 3 方捆绑包。它有一些页面视图。我显然希望它采用与网站上其他页面相同的布局。如何在不修改 3rd 方捆绑代码的情况下进行配置
    • 这就是重点,捆绑“之上”没有任何东西。这只是一种组织代码的方式,以便 Symfony 的其他部分知道在哪里寻找东西。
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2016-09-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多