gpt4 book ai didi

php - Yii 框架 : Menu content that appears on every page

转载 作者:搜寻专家 更新时间:2023-10-31 21:40:23 24 4
gpt4 key购买 nike

我正在使用 Yii 框架开发一个使用 2 列布局的网站。一栏是实际内容,另一栏是带有站点链接的菜单、有关登录用户的一些信息和最新帖子的列表。菜单出现在所有页面上,但没有与当前页面(或路由)相关的信息。

每次呈现菜单时,我都需要从数据库中检索最新帖子列表和用户相关数据。我不确定如何最好地呈现此菜单,这样我就不会在网站上的每个操作中重复获取数据的代码。

我想到了几种方法,我想知道其中哪一种(如果有的话)是处理这种情况的正确方法。

  • Controller::beforeRender 方法中获取数据,然后在部分 View 中呈现菜单,该 View 在 CClipWidget block 中显示数据。然后,在布局 View 中,显示菜单所在的 block 。这个方法可行,但我觉得它很笨重,因为 beforeRender。如果我添加了一个没有菜单的页面,我需要为此添加一个检查。此外,在阅读 Yii 文档后,我不明白 beforeRender() 是否也为 renderPartial() 调用,或者只是为 render().

  • 保留菜单的部分 View 并从布局 View 中呈现它。菜单 View 中的数据是从放置在其他地方(可能在模型中)的静态方法获取的。这涉及编写非常少的代码,但我不确定这是否是 MVC 范例的良好做法。在 View 中获取数据让我有点畏缩,即使它只是调用静态函数。

  • 将菜单变成一个小部件。数据在 run() 方法中获取并从小部件 View 呈现。但是,使用小部件会施加一些额外的限制。如果我想使用在 Controller 中呈现最新帖子的 View ,我会遇到问题。小部件不能使用 renderPartial() 并且必须一直使用 render()。如果我弄清楚如何检查正在渲染 View (小部件或 Controller )并适本地调用 render()renderPartial() ,我就可以解决这个问题。此外,小部件 View 必须与站点 View 分开,但我可以通过指定完整的 View 路径来解决这个问题,比如 application.views.controller.view,尽管它可能很笨重。此外,我仍然不确定小部件是否应该自己获取数据库数据。

所有这些方法都有效,但它们都有一些问题。我敢肯定很多网站都处于同样的情况,我想看看最好的选择是什么。

最佳答案

您应该能够通过简单地缓存数据库结果(在内存中或在文件中这取决于您和您的设置)来避免重新请求此数据的大部分性能损失。这是一个简单的小例子:

$posts = Post::model()->cache(600)->with('comments')->findAll(array('blah=blahdyblah'));

这会将返回的数据缓存 10 分钟。

为了完整起见,这里再次提供了 Yii 缓存指南的链接: Caching Guide

要在每个页面上实际获取此数据,您最好将代码放在您自己的小部件中,并在布局文件中的某处调用它。

可以处理你列出的widget限制:

  • 首先,当小部件呈现时,它只会render(),但没有布局。这在大多数情况下都很好,但是如果您确实想要一个只包含该小部件的页面,假设您想要一个真正的 render(),那么就完全那样做,只需创建一个只调用该小部件的 View 。

  • 其次,没有理由必须将小部件完全从您的应用程序中抽象出来并且不使用它的数据 + 模型。是的,它们可以是“可插入的”,这是一个非常好的特性,但这并不意味着它们必须如此,您只是使用它们来分离代码。

  • 最后,如果您确实想使用小部件中的“部分”数据而不是全部,或者稍微更改它,那么您在小部件中使用的方法和 View 应该使用足够的抽象来构建,以便您可以单独使用您需要的零件。实现此目的的一个好方法是在 ActiveRecords、迷你 View 文件上充分利用 scopes,并对较大的非数据逻辑 block 使用组件。

当然,如果您确实在性能极限下运行并且需要将请求时间减少千分之一秒,那么您应该研究 View 缓存并使用 fragment caching of views :

关于php - Yii 框架 : Menu content that appears on every page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11819078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com