我可以从视图中调用模型吗?
而不是使用一个完整的PHP MVC,我正在devise一个最适合我的用途。 我已经完成了基本框架,并编写了我需要的模型和控制器来运行我的网站。
现在我正在进入意见,我遇到了一个小小的困境。 我的方法对我来说工作得很好,但为了将来的参考,我想知道我正在做的是一个坏习惯。
我在做什么:
在我的视图中,我打电话给运行我的身份validation系统的模型,并请求用户的login状态。 然后我使用该布尔值来决定是否在视图中显示某些元素,以及在哪里放置其他元素。
我应该为每个login状态devise单独的视图,还是这种方法很好? 但是,如果我要将这个MVC用于我为客户做的工作,那么我需要使用最佳实践。
任何意见将不胜感激!
我可以从视图中调用模型吗?
是的你可以。 只要您保持M,V和C之间的关注点分离 ,您可以自由地从视图调用Model(或Controller)。 大多数MVC图表至less在View和Model之间显示双向连接。 你不想做的是将模型(或控制器)的逻辑/代码放入视图中,而不想从那里修改模型。
例如,您的网页上可能有一个小工具,用于汇总您网站每个页面上最新的十篇博客文章标题。 你可以通过调用MyFavFeeds::getLatest();
获得头条新闻MyFavFeeds::getLatest();
在你的模型中。 你现在有什么select?
- 您可以添加代码以将标题提取到控制器中,但这需要您在每个控制器操作中复制它,这违背了DRY原则。 此外,控制器的担心是处理用户input的具体行为和提取标题在每个电话很可能甚至不涉及到这些行动。
- 如果你的架构支持它,你可以在某种preDispatch钩子中获取这些数据,也就是说,标题被加载并从插件或callback中注入到视图中。 这将是干的,但第二个开发人员可能不知道这个插件,意外地覆盖了控制器操作头条新闻的variables。 而且,有些情况下您不想加载标题,例如,当呈现表单提交的确认页面时,您必须具有禁用插件的机制。 这是很多考虑。
- 您将调用(而不是代码)
MyFavFeeds::getLatest()
放入视图或布局模板中,或者更好的方法是将调用封装到您的模型类并呈现该小部件。 这样你不必担心重写任何variables或重复。 而当你不需要你的看法的头条新闻,你根本不包括它。
关于你的另一个问题:
在我的视图中,我打电话给运行我的身份validation系统的模型,并请求用户的login状态。 然后我使用该布尔值来决定是否在视图中显示某些元素,以及在哪里放置其他元素。
在任何控制器操作被调用之前,身份validation是您在应用程序stream程早期要做的事情。 因此,您不应该在View中运行您的(整个)身份validation系统 。 实际的身份validation不是视图相关的逻辑。 另一方面,在authentication之后请求用户状态也是可以的。 例如,如果你想渲染一个显示用户名和给出login/注销button的小部件,那么可以做一些像
<?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的较大部分被用户的angular色修改,您可能希望将视图拆分为部分块,并根据状态将其包含在内,而不是将所有HTML写入视图助手。
如果您只想根据用户angular色呈现导航,请查看Zend Framework的Zend_Navigation
和Zend_Acl
,看看它们是如何实现的。
你可以 ,但你不应该 。 除了一些极端情况(根据login状态分支你的视图绝对不是一个“极端情况”),从视图中调用模型的东西几乎总是一个坏主意。
你可能想要做的是通过控制器将布尔值传递给视图。 这样,如果你改变了用户模型的一些东西,视图不必知道,只要控制器保持相同的行为。
好的,我会尽量保持我的视图尽可能无逻辑。 如果您需要根据例如模型方法的结果来切换任何东西,请放置一个控制器来委托渲染。
只要确保遵循以下基本思路:在模型中做你的东西,告诉你的模型从你的控制器中做什么,并告诉你的观点从你的控制器中显示什么。
虽然我只知道MVC让自己陷入困境,但我一直以来都认为,除非您的观点是严格的用户界面,否则不应该在那里。
另外,我也跑了瘦控制器,胖模型的想法。
从这些,我build议添加一个方法到您的身份validation系统模型,返回适当的视图来呈现,并将其传递到视图。