我可以从视图调用模型吗?

2024-01-14

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

现在我正在转向视图,我遇到了一个小困境。我的方法对我来说效果很好,但为了将来的参考,我想知道我所做的是否是一个坏习惯。

我正在尝试做的事情:

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

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

任何意见,将不胜感激!


我可以从视图中调用模型吗?

是的你可以。只要你保持关注点分离在 M、V 和 C 之间,您可以自由地从视图调用模型(或控制器)。大多数 MVC 图至少显示视图和模型之间的双向连接。但你不想做的是地方逻辑/代码从模型(或控制器)到视图,并且您不想从那里修改模型。

例如,您的页面上可能有一个小部件,用于聚合网站每个页面上您最喜欢的博客中的最​​新十篇博客文章标题。你打电话就能上头条,比如说MyFavFeeds::getLatest();在你的模型中。你现在有什么选择?

  1. You could添加代码以将标题获取到控制器中,但这需要您在每个控制器操作中复制它,这违反了 DRY 原则。另外,控制者关心的是处理特定操作的用户输入并且在每次通话中获取头条新闻甚至可能与这些操作无关。
  2. 如果您的架构支持它,您可以在某种 preDispatch 挂钩中获取该数据,也就是说,标题会从插件或回调加载并注入到视图中。这将是 DRY,但第二个开发人员可能不知道该插件,并意外地覆盖了其控制器操作中保存标题的变量。在某些情况下,您可能不想加载标题,例如当只是渲染表单提交的确认页面时,因此您必须有禁用插件的机制。这需要考虑很多。
  3. 您拨打电话(而不是代码)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(使用前将#替换为@)

我可以从视图调用模型吗? 的相关文章

  • 使用 PHP 中的 GD 库在图像上绘图

    我创建了一个代码来生成随机图案图像 它创建一个具有给定宽度和高度的图像 并用 40x40 像素的小矩形填充它 这是我的代码
  • 如何使用Jquery获取MS下拉列表的选定值

    我在我的 MVC 项目中使用了 MS 下拉列表 现在我想使用 Jquery 获取 MS 下拉值 如何才能做到这一点呢 Country msDropdown 我想使用 JQuery 获取 INDIA 的选定值 var countryName
  • 使用 ImageMagick (PHP) 将 2 个图像并排合并为 1 个图像

    我认为这是一件容易的事 我有 2 张图片 JPG 我希望它们合并成一张图片 其中 2 张图片并排 所以我有图片 A 和图片 B 我想要图片 AB 并排 两个图像具有相同的宽度和高度 在本例中 宽度 200px 高度 300px 但是第二个图
  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 我可以让 swagger-php 在查询字符串上使用数组吗?

    我使用 Swagger php 当我定义查询字符串上的参数时 它可以是一个数组 但据我所知 它不支持这种查询字符串 https api domain tld v1 objects q 1 q 5 q 12 我相信这会被设定in the co
  • 如何让Apache服务index.php而不是index.html?

    如果我将以下行放入index html文件 使 Apache 包含index php file 参观index html页面向我显示了这个 这是为什么 为什么它实际上不包含 PHP 文件 正如其他人指出的那样 您很可能没有 html设置为处
  • get url 重定向时 File_get_contents() 不起作用

    我正在使用的功能是 function http post url data data url http build query data data len strlen data url date default timezone set
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • WordPress 包含 SVG 文件错误

    我使用 PHP 和 WordPress 在本地主机上 我可以毫无问题地包含 SVG 文件 但在实时服务器上 我尝试包含一个 SVG 文件以便能够使用 CSS 对其进行样式设置 我收到此错误消息 Parse error syntax erro
  • Facebook 应用程序无法获取会话

    我正在 Heroku 上为 Facebook 开发一个非常基本的 PHP 应用程序 它显示非常基本的用户信息 如姓名 个人资料图片 但该应用程序在 getToken 方法中停止 我在登录我的个人资料后尝试了该应用程序 但仍然出现相同的消息
  • 在 Yii 的标准中如何获得计数 (*)

    我正在尝试构建一个具有以下内容的查询group by属性 我正在尝试得到id和count它一直告诉我count is invalid列名 我怎样才能得到count来自group by询问 工作有别名 伊伊 1 1 11 其他不及格 crit
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • Facebook PHP SDK - 如何获取访问令牌?

    我正在尝试从我的应用程序在用户的 Facebook 墙上发帖 用户授予应用程序在他的墙上发布的权限 并且我在数据库中有用户ID 我需要自动发送帖子 而无需用户再次登录 我的代码是 try require once dirname FILE
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 如何删除文件

    我们有一个脚本 scripts ourscript php和一个文件 media movie1 flv 当我们运行时 我们如何删除这个文件ourscript php Using unlink http php net manual en f
  • 我可以在 PHP 会话变量中安全地存储用户名和密码吗?

    我想在 REST api 之上制作一个轻量级的 web 应用程序 用户只需进行一次身份验证 从那时起 所有针对 web api 的请求都希望通过以某种方式保持用户名和密码有效来完成 我已经做了一个工作原型我在哪里将用户名和密码存储在会话变量
  • 反向引用在 PHP 中不起作用

    最近我一直在研究 更多的是在实践中说实话 正则表达式 我注意到他的力量 我提出的这个要求 link https stackoverflow com questions 30380397 take the text up to a speci
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for

随机推荐

  • C# 将 Lambda 表达式函数转换为描述性字符串

    我有一个完全不必要的困境 我正在懒洋洋地寻找一个将 lamda 表达式转换为字符串的函数 让我烦恼的是 我每次都输入这个缓存键 但我真的不想花时间创建它 我想将它用于我创建的缓存函数 如果我想获取一个人的名字而不是每次都调用该函数 那么在哪
  • 直观地看 For 循环中 fork() 会发生什么

    我一直在试图理解fork http en wikipedia org wiki Fork system call 行为 这次在一个for loop 观察以下代码 include
  • 对于 Swing 应用程序,通过 JNA 调用 GetOpenFileName 失败

    我正在尝试使用 Java 中的本机 Windows 文件对话框 使用 JNA 调用 comdlg32 函数GetOpenFileName 我做了一个静态方法 OpenFileDialog display看起来像这样 public stati
  • Prolog 中的简单图搜索

    我正在尝试在 SWI Prolog 中编写一个简单的图形搜索代码 我想出了以下程序 adjacent 1 4 adjacent 4 2 adjacent 3 6 adjacent 6 4 adjacent 7 10 adjacent 4 9
  • 如何正确地与反应形式进行双向绑定?

    到目前为止 我一直认为你不应该混合使用 ngModel 与反应形式 而不是简单地使用formControlName 然而 对我来说 这似乎不起作用 我有一个表单并向其中添加控件 this exportForm addControl surc
  • 如果字段为空,则通过 jQuery 禁用发送按钮

    如果有一个或多个输入字段为空 如何禁用发送按钮 我在伪代码中的尝试 if input empty input disabled else enable the ask question button 我一直在阅读这些文章但没有找到正确的解决
  • 在 Swift 中包含 C++ 头文件

    我有一个 C 头文件 名为header h 我想将其包含到我的 Swift 项目中 由于我想要包含的 C 框架尚未完成 所以我现在只有头文件 我的 C 头文件header h看起来有点像这样 include
  • 在两个 tomcat 服务器上的两个应用程序之间保持 JSP 会话处于活动状态

    您好 我想在 2 个 tomcat 服务器上运行的两个不同应用程序之间保持相同的会话 我在一台服务器上运行一个应用程序 在登录时为其创建一个会话 如果我单击应用程序上的链接 它将被重定向到另一个 tomcat 服务器上的第二个应用程序 此时
  • Bootstrap:模态上的弹出窗口

    我想使用 Twitter 的 Bootstrap CSS 库在现有模态对话框上使用弹出窗口效果 我将弹出框绑定到小图像图标 infoIcon popover offset 50 placement right 模态本身也是根据文档添加的 m
  • Python 列表中的 Numpy.Array?

    我有一个 numpy 数组列表 用作堆栈 现在我想检查数组是否已在列表中 例如 如果它是元组 我会简单地写一些相当于 1 1 in 1 1 2 2 然而 这不适用于 numpy 数组 np array 1 1 in np array 1 1
  • 将元数据添加到 Stripe 客户对象

    我正在使用 Stripe 设置支付系统 我想向客户对象添加一些元数据 我想将我的工作区 ID 添加到客户的元数据属性中 我尝试了下面的代码 但它返回以下错误 Error Error Invalid val bsontype gt Objec
  • 具有在编译时评估的向量的构建器模式(使用“consteval”)

    我正在尝试创建一个遵循构建器模式并且在编译时完全运行的类 使用新的constevalC 20 中的关键字 但无论我尝试什么都不起作用 例如 这是行不通的 include
  • 无法将 json 转换为模型

    我有来自 url 的 json 我需要将此 json 转换为模型 someField 3 datesField 2017 08 19 2017 08 20 2017 08 26 2018 12 30 我创建用于映射的模型 Data NoAr
  • 为什么我的迷宫解算器不起作用?

    我正在尝试编写一个程序 以递归方式解决特定输入的迷宫 并在每次移动后输出它在迷宫中的位置 每当我尝试运行代码时 它都会立即崩溃 并收到 maze exe 已停止工作 错误 为什么我的代码不起作用 include
  • 我可以将多个 Android 密钥库文件合并为一个吗?

    我在使用 Android 密钥库文件时遇到了一个有点烦人的情况 目前 我有几个不同的应用程序 每个应用程序都使用不同的密钥库文件进行签名 有点像这样 使用 AppName1 keystore 签名的 AppName1 apk 使用 AppN
  • Android onItemClicklistener 在列表视图中不起作用

    谁能帮我解决我的问题 我有一个 TabActivity 每个选项卡在触摸时都会打开一个新的活动 该活动扩展了 ListActivity 此时我得到了所需项目的列表 我想通过使用 OnItemClickListener 使其可点击 我正在附上
  • 使用 bash、sed 或 awk 拆分 CSV 文件并排除输出中的列

    我有一个 CSV 文件 其中包含如下数据 1 275 275 17 3 0 2011 05 09 20 21 45 2 279 279 17 3 0 2011 05 10 20 21 52 3 276 276 17 3 0 2011 05
  • 如何在 vscode 中将 .ipynb 作为常规文本而不是 IPython 笔记本查看

    VS Code 最近添加了使用 Jupyter Notebooks 的功能 ipynb文件 这就是说它将它们呈现为笔记本而不是底层文本 我遇到的问题是我想对原始文本而不是 笔记本 进行一些编辑 但我不知道如何像其他编辑器那样将其显示为文本文
  • git push -f 与 +

    这样做有什么区别 git push f origin my branch my branch and git push origin my branch my branch 这是实现同一目标的两种语法 除了那个git push force当
  • 我可以从视图调用模型吗?

    我没有使用成熟的 PHP MVC 而是设计了一个最适合我的用途的 MVC 我已经完成了基本框架 并编写了运行网站所需的模型和控制器 现在我正在转向视图 我遇到了一个小困境 我的方法对我来说效果很好 但为了将来的参考 我想知道我所做的是否是一