我没有使用成熟的 PHP MVC,而是设计了一个最适合我的用途的 MVC。我已经完成了基本框架,并编写了运行网站所需的模型和控制器。
现在我正在转向视图,我遇到了一个小困境。我的方法对我来说效果很好,但为了将来的参考,我想知道我所做的是否是一个坏习惯。
我正在尝试做的事情:
在我的视图中,我正在调用运行我的身份验证系统的模型,并请求用户的登录状态。然后,我使用该布尔值来决定是否在视图中显示某些元素以及将其他元素放置在何处。
我应该为每个登录状态设计单独的视图,还是这种方法可以?但是,如果我要将这个 MVC 实施到我为客户所做的工作中,我需要使用最佳实践。
任何意见,将不胜感激!
我可以从视图中调用模型吗?
是的你可以。只要你保持关注点分离在 M、V 和 C 之间,您可以自由地从视图调用模型(或控制器)。大多数 MVC 图至少显示视图和模型之间的双向连接。但你不想做的是地方逻辑/代码从模型(或控制器)到视图,并且您不想从那里修改模型。
例如,您的页面上可能有一个小部件,用于聚合网站每个页面上您最喜欢的博客中的最新十篇博客文章标题。你打电话就能上头条,比如说MyFavFeeds::getLatest();
在你的模型中。你现在有什么选择?
- You could添加代码以将标题获取到控制器中,但这需要您在每个控制器操作中复制它,这违反了 DRY 原则。另外,控制者关心的是处理特定操作的用户输入并且在每次通话中获取头条新闻甚至可能与这些操作无关。
- 如果您的架构支持它,您可以在某种 preDispatch 挂钩中获取该数据,也就是说,标题会从插件或回调加载并注入到视图中。这将是 DRY,但第二个开发人员可能不知道该插件,并意外地覆盖了其控制器操作中保存标题的变量。在某些情况下,您可能不想加载标题,例如当只是渲染表单提交的确认页面时,因此您必须有禁用插件的机制。这需要考虑很多。
- 您拨打电话(而不是代码)
MyFavFeeds::getLatest()
到 View 或 Layout 模板中,或者更好的是 ViewHelper 中,它封装了对模型类的调用并呈现小部件。这样您就不必担心覆盖任何变量或重复。当您的视图中不需要标题时,您只需不包含它即可。
关于你的另一个问题:
在我看来,我调用的模型是
运行我的身份验证系统,并且
请求用户的登录状态。
然后我用这个布尔值来决定
是否显示某些元素
在视图内以及放置位置
其他的。
身份验证是您希望在应用程序流程的早期、调用任何控制器操作之前执行的操作。因此,您不应该运行您的(整个)身份验证系统在视图中。实际的认证并不是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 的较大部分需要由用户角色进行修改,您可能希望将视图分成部分块并根据状态包含它们,而不是将所有 HTML 写入视图助手中。
如果您只想根据用户角色呈现导航,请查看 Zend Framework 的Zend_Navigation
and Zend_Acl
看看他们是如何做到的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)