gpt4 book ai didi

php - 我可以从 View 中调用模型吗?

转载 作者:可可西里 更新时间:2023-11-01 13:07:09 25 4
gpt4 key购买 nike

我没有使用成熟的 PHP MVC,而是设计了一个最适合我的用途的。我已完成基本框架,并编写了运行我的网站所需的模型和 Controller 。

现在我转向 View ,遇到了一个小难题。我的方法对我来说效果很好,但为了将来引用,我想知道我正在做的事情是否是一个需要养成的坏习惯。

我正在尝试做的事情:

在我的 View 中,我正在调用一个运行我的身份验证系统的模型,并请求用户的登录状态。然后,我使用该 bool 值来决定是否在 View 中显示某些元素,以及将其他元素放置在何处。

我应该为每个登录状态设计单独的 View ,还是这种方法可以?但是,如果我要将此 MVC 实现到我为客户所做的工作中,我需要使用最佳实践。

如有任何建议,我们将不胜感激!

最佳答案

Can I call the model from the View?

是的,您可以。只要您保持 M、V 和 C 之间的关注点分离,您就可以自由调用模型(或 Controller ) )从 View 。大多数 MVC 图至少显示 View 和模型之间的双向连接。但是,您不想做的是将模型(或 Controller )中的逻辑/代码 放入 View 中,并且您不想从那里修改模型。

例如,您的页面上可能有一个小部件,它汇总了您网站每个页面上您最喜爱的博客的最新十篇博文标题。您可以通过在模型中调用 MyFavFeeds::getLatest(); 来获得头条新闻。你现在有什么选择?

  1. 可以添加代码以将标题提取到 Controller 中,但这将需要您在每个 Controller 操作中复制它,这违反了 DRY 原则。此外, Controller 关注的是处理特定操作的用户输入,并且在每次调用时获取标题可能甚至与这些操作无关。
  2. 如果您的体系结构支持它,您可以在某种预调度 Hook 中获取该数据,也就是说,标题从插件或回调中加载并注入(inject)到 View 中。那将是 DRY,但第二个开发人员可能不知道该插件并意外地覆盖了他的 Controller 操作中包含头条新闻的变量。在某些情况下,您可能不想加载标题,例如当只是呈现表单提交的确认页面时,那么你必须有禁用插件的机制。这需要考虑很多。
  3. 您将对 MyFavFeeds::getLatest() 的调用(而不是代码)放入 View 或布局模板中,或者更好的是,一个 ViewHelper,它封装了对您的模型类的调用并呈现小部件。这样您就不必担心覆盖任何变量或重复。当您不需要在您的 View 中显示标题时,您只需不包含它即可。

关于您的其他问题:

In my View, I'm calling a Model that runs my authentication system, and requesting the login status of a user. I then use that boolean to decide whether to show certain elements within the view, and where to place others.

在调用任何 Controller 操作之前,您需要在应用程序流程的早期执行身份验证。因此,您不应该在 View 中运行您的(整个)身份验证系统。实际的认证不是View相关的逻辑。另一方面,只需在身份验证后请求用户状态即可。例如,如果你想渲染一个显示用户名并提供登录/注销按钮的小部件,那么做类似的事情就可以了

<?php //UserHelper
class UserMenuHelper
{
public function getUserMenu()
{
$link = '<a href="/user/logout">Logout</a>';
if(MyAuth::userHasIdentity()) {
$link = sprintf('<a href="/user/logout">Logout %s</a>',
MyAuth::getUsername());
}
return $link;
}
}

如果用户角色要修改 GUI 的较大部分,您可能希望将 View 分成部分块并根据状态包含它们,而不是将所有 HTML 写入 View 助手。

如果您只想根据用户角色呈现导航,请查看 Zend Framework 的 Zend_NavigationZend_Acl 以了解它们是如何实现的。

关于php - 我可以从 View 中调用模型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973221/

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