我正在设计一个最适合我的用途,而不是使用成熟的PHP MVC。我已经完成了基本框架,并编写了运行网站所需的模型和控制器。
现在,我进入“视图”,遇到了一个小难题。我的方法对我来说很好,但是为了将来参考,我想知道我在做什么是否有不好的习惯。
我正在尝试做的是:
在我的视图中,我正在调用一个运行身份验证系统的模型,并请求用户的登录状态。然后,我使用该布尔值来决定是否在视图中显示某些元素,以及在其他位置放置其他元素。
我应该为每种登录状态设计单独的视图,还是这种方法很好?但是,如果要在为客户执行的工作中实施此MVC,则需要使用最佳实践。
任何意见,将不胜感激!
我可以从视图中调用模型吗?
是的你可以。 只要您保持M,V和C之间 的关注 点 分离 ,就可以从视图中自由调用模型(或控制器)。大多数MVC图至少在View和Model之间显示双向连接。但是,您不想执行的操作是将模型(或控制器)中的 逻辑/代码 放入视图中,而您不想从那里修改模型。
例如,您的页面上可能有一个小部件,该小部件汇总了网站每个页面上您喜欢的博客中最新的十个博客文章标题。您可以通过MyFavFeeds::getLatest();在模型中说出来来获得头条新闻。您现在有什么选择?
MyFavFeeds::getLatest();
MyFavFeeds::getLatest()
关于您的其他问题:
身份验证是您希望在调用任何控制器操作之前在应用程序流程的早期进行的事情。因此,您不应在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 Helper。
如果您只想基于用户角色呈现导航,请查看Zend Framework Zend_Navigation并Zend_Acl查看其操作方式。
Zend_Navigation
Zend_Acl