PHP 支持 MVP 模式吗?

2023-12-10

有很多使用 ASP.NET 解释 MVP 模式的示例,但没有找到任何使用 PHP 的示例。

我是 PHP 程序员,想知道在哪里可以获得 MVP 模式 PHP 示例?


简短的回答是:是的 PHP 可以.

(Note, its not exactly MVP as described in its original paper, but a variation for web)

MVC 和 MVP 之间的区别在于,视图是完全被动的并且不知道模型层。而在MVC它不是被动的并且了解模型层。在适当的MVP, View类(如果是的话)也不应该实现一个构造函数。

MVP 的典型示例将由以下部分组成:

  1. 数据访问层(DataMappers、ORM 等)
  2. 业务逻辑(如验证和计算)
  3. 被动视图类(它可以是一个模板,但最好坚持使用一个类)
  4. 连接模型和视图的演示者

如何使用 PHP 实现模型-视图-呈现器的示例

Note: A model in real-world scenario is not class, but abstraction layer, that contain a lot of classes to deal with application logic. I'd call it "Model" for demonstration purposes.

class Model
{
   public function getSomeStuff()
   {
       return array('foo' => 'bar');
   }
}


class View
{
   public function render($path, array $vars = array())
   {
      ob_start();
      extract($vars);
      require($path);
      return ob_get_clean();
   }
}



class Presenter
{ 
     private $model;

     private $view;

     public function __construct(Model $model, View $view)
     {
         $this->model = $model;
         $this->view = $view; 
     }

     public function indexAction()
     {
        $data = $this->model->getSomeStuff();  

        // Variables are set now, render the HTML
        // And returns as a string
        return $this->view->render('path/to/template.phtml', $data);
     }
}

文件:模板.phtml

<!DOCTYPE html>
<html>
<head>
  <title>...</title>
</head>

<body>

  <?php foreach($vars as $key => $value): ?>
      <p><?php echo $key; ?> : <?php echo $value; ?></p>
  <?php endforeach; ?>

</body>
</html>

用法是:

$model   = new Model();
$view    = new View();

$presenter = new Presenter($service, $view);

echo $presenter->indexAction();

请注意,这是一个非常简化的示例。在现实场景中,任何基于 MVP 的应用程序SHOULD还实现诸如:路由器、SPL 类自动加载器等功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 支持 MVP 模式吗? 的相关文章

  • 如何在 Zend Framework 中存储 cron 作业的脚本?

    因为 ZF 的所有 URL 都依赖于 mod 重写 所以我并不清楚应该在哪里存储用于 cron 作业的本地脚本 有人有什么建议 或者有 正式接受 的方式吗 我用模块化目录结构 http framework zend com manual e
  • 覆盖供应商自动加载编辑器

    有没有办法让您创建的自动加载文件在调用供应商自动加载之前运行 我们似乎遇到了 SimpleSAML 的自动加载覆盖我们创建的自动加载文件之一的问题 我是 Composer 的新手 似乎无法在网上找到任何解决方案 我尝试将我们的自动加载文件包
  • session_regenerate_id 没有创建新的会话 id

    我有一个脚本 旨在完成当前会话并开始新的会话 我使用了一段代码 它在我的开发计算机上运行良好 但是 当我将其发布到生产服务器时 会话 ID 始终保持不变 以下是我重新启动会话的代码 session start SESSION array P
  • 如何为本机启用现有 WCF 服务的 JSONP?

    我有一个现有的服务 如下方法 AspNetCompatibilityRequirements RequirementsMode AspNetCompatibilityRequirementsMode Allowed ServiceBehav
  • IoC 服务的抽象类还是接口?

    我目前正在使用 IoC 在项目中提供存储库的具体实现 我读过的所有示例都使用接口作为服务的定义 但是 在阅读了 Microsoft 的建议后 建议更喜欢抽象类而不是接口 http msdn microsoft com en us libra
  • 如何从导出的 csv 文件中删除双引号

    我正在使用 Laravel 5 8 并且添加了 Maatwebsite 包 用于从数据库表导出 CSV 文件 这是我导出的类 class ConfirmedExport implements FromCollection WithHeadi
  • 当路径长度超过 260 个字符时 System.IO.DirectoryNotFoundException [重复]

    这个问题在这里已经有答案了 我有 ASP NET Core MVC 项目 针对 NET 4 62 我正在尝试保存文件 当路径长度低于 260 或 248 我不确定 时 一切正常 但是当路径长度更长时 我会得到一个System IO Dire
  • TOMCAT 6 中的 PHP - 异常

    我一直在努力融入PHP in APACHE TOMCAT 6依照指示second answer为了QUESTION https stackoverflow com questions 779246 run a php app using t
  • php 中的简单授权/登录功能

    我希望第一次实现用户登录到我的网站 我很高兴构建自己的解决方案 或者实现一些开源的东西 但是到目前为止 在我的搜索中没有任何包是明显的选择 同样 我完全意识到 作为一名中级 php 程序员 如果我推出自己的解决方案 并真正敞开大门 我很可能
  • 如何以编程方式获取 WooCommerce 中的所有产品?

    我想获取 WooCommerce 中的所有产品数据 产品 sku 名称 价格 库存数量 可用性等 我可以使用 wp query 来做到这一点吗 这样你就可以通过 wp query 获取所有产品 global wpdb all product
  • Laravel 广播:通知与事件

    我阅读了 laravel 文档Events and Notifications 似乎我们可以触发一个事件 并从该事件中触发 使用ShouldBroadcast接口 将其广播到我理解的 laravel echo 另一方面我们可以使用通知via
  • 如何将 mysql 转换为 mysqli? [复制]

    这个问题在这里已经有答案了 我厌倦了将 mysql 转换为 mysqli 但似乎收到了很多错误和警告 连接到数据库没有问题 但其余代码似乎错误 我做错了什么 sql
  • 管理调试和发布连接字符串

    在 NET SQLServer 应用程序中管理调试和发布连接字符串的好方法是什么 我有两个 SQL Server 一个是生产服务器 一个是构建 调试服务器 我需要一种在部署 ASP NET 应用程序时在这两个服务器之间进行切换的方法 目前
  • ASP.Net 应用程序中的音频/视频/文本聊天

    我需要在 ASP Net 中开发一个聊天系统 我已经浏览了很多关于类似主题的问题 但没有找到任何一个令人满意的 是否可以从头开始创建它 或者我是否需要使用一些 API 我的要求仅限于我的网站用户 可以说基于内联网 请帮我 要进行文字聊天 人
  • 工厂模式但带有对象参数

    采用以下经典工厂模式 public interface IPizza decimal Price get public class HamAndMushroomPizza IPizza decimal IPizza Price get re
  • Web 表单中的 IRouteHandler:路由需要 HttpContext.User 的请求

    我正在尝试向 Asp Net Web Forms 应用程序添加一个非常基本的路由 在 IIS 7 下运行 集成模式 http mydomain com foo http mydomain com foo 我想显示动态页面的结果 http m
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • mysqli bind_param 中的 NULL 是什么类型?

    我正在尝试将参数绑定到 INSERT INTO MySQLi 准备好的语句 如果该变量存在 否则插入 null 然后我知道 type variable i corresponding variable has type integer d
  • “pdo_mysql”已禁用,我无法启用它。我在 iMac 7.1 OSX 10.6.8 上安装了 MAMP v. 3.0.4

    pdo mysql 已禁用 我无法启用它 我在 iMac 7 1 OSX 10 6 8 上安装了 MAMP v 3 0 4 在我的 phpinfo 页面上 我可以看到唯一启用的 PDO 是 sqlite 如果我查看 php 5 5 10 扩

随机推荐

  • XCode:为什么我的活动没有添加到日历中?

    我已将以下代码添加到我的应用程序中 NSDate selected DatePicker date NSString date selected description NSDateComponents components NSCalen
  • Flash 使视图变为全屏

    我需要一个链接来调用 Flash 影片 使用 JavaScript 该影片将视图全屏显示并显示页面内容 就像用户按下了 F11 一样 有这样的flash电影吗 Edit这与 YouTube 和其他视频网站上的 Flash 播放器的不同之处在
  • 安装和导入后,colaboratory 将不会承认 arviz

    在Google的合作实验室中 安装了arviz然后导入arviz没有错误 但在代码单元中 pm plot posterior samples 得到错误 arviz未安装 尝试绘制贝叶斯代码 pm plot posterior samples
  • “模块是用不兼容的 Kotlin 版本编译的。其元数据的二进制版本是 1.5.1,预期版本是 1.1.16”

    当我尝试构建应用程序时出现以下错误 C Users Lenovo gradle caches transforms 2 files 2 1 32f0bb3e96b47cf79ece6482359b6ad2 jetified kotlin s
  • python networkx - 通过着色来标记边缘以进行图形绘制

    我正在使用 networkx 来研究图论实现 我想知道是否有一种方法可以标记给定图中的某些边 例如 假设我有一个图 G 并且我找到了从节点 x 到节点 y 的最短路径 我如何标记该路径 以便在绘制图时它将以不同的颜色绘制 标记边缘可以通过设
  • 关闭 BufferedReader 和 System.in

    Reader rdr new InputStreamReader System in BufferedReader br new BufferedReader rdr String s s br readLine br close Scan
  • 选择可变参数模板最后一个参数的有效方法

    我知道如何选择可变参数模板的第一个参数 template lt class Args gt struct select first template lt class A class Args gt struct select first
  • Python 中奇怪的前导字符 utf-8/utf-16 编码

    我写了一个简化版本来演示这个问题 我正在以 utf 8 和 UTF 16 格式对特殊字符进行编码 使用 utf 8 编码没有问题 当我使用 UTF 16 编码时 我得到一些奇怪的前导字符 我尝试删除所有尾随和前导字符 但错误仍然存 在 代码
  • jquery 每个循环内的 Ajax 调用

    这是一个我必须通过 ajax 调用写入 xml 文件的函数 第一次进行 ajax 调用时 代码可以正常工作 在第二个each 循环中 根本不进行ajax 调用 我不知道为什么 我将 asyn 指定为 false 但这没有帮助 无论如何 这似
  • Q-Learning 值太高

    我最近尝试在 Golang 中实现基本的 Q Learning 算法 请注意 我对强化学习和人工智能总体来说是新手 所以这个错误很可能是我的 以下是我如何在 m n k 游戏环境中实施解决方案 在每个给定的时间t 代理持有最后的状态动作 s
  • MVC 3 - 模型绑定表中的列表,每个记录是一列而不是行

    我可以找到有关如何在 MVC 3 中模型绑定项目列表的各种文章 甚至可以在表中进行模型绑定 但在每个示例中 行代表列表中的一条记录 我的观点的要求是每条记录必须是一列 我无法从以下文章中获得任何技巧 http blog stevensand
  • 根据列表中的条件合并列表项

    我有一个项目清单 例如 a IP 123 84 apple mercury IP 543 65 killer parser goat IP 549 54 pineapple django python 我想根据条件合并列表项 即合并所有项目
  • iOS:如何关闭弹出窗口[重复]

    这个问题在这里已经有答案了 可能的重复 如何关闭故事板弹出窗口 我有一个 iPad 故事板 将一个视图中的栏按钮项按住 Control 键拖动到另一个视图 并选择弹出框样式 当我按下按钮时 新的弹出窗口视图将显示在弹出窗口中 但我有两个问题
  • 使用 Java 中的 ImageIO 编写 TIFF 的平铺输出

    我拥有的是大量的帧 需要将它们放在一起形成更大的图像 如马赛克 所需的图像位置是已知的 图像数量非常多 因此将它们全部加载到内存中是不切实际的 根据这里的一些其他答案 我能够覆盖 RenderedImage 中的方法 特别是getData
  • 厨师食谱中使用了哪些 ruby​​ 功能?

    我刚开始使用 Chef 对 ruby 不太了解 我无法理解食谱中使用的语言语法 比如说 我在食谱中的recipes default rb 中创建一个目录 如下所示 directory home test mydir do owner tes
  • 确定 C++ 应用程序是否作为 UWP 应用程序运行并具有旧版支持

    我的第一个想法是使用GetPackageFamilyName 并寻找ERROR SUCCESS vs APPMODEL ERROR NO PACKAGE 但是 我需要支持 Windows 7 这使得GetPackageFamilyName
  • jQuery validate - 如何防止自动提交?

    我热衷于使用 jQuery 验证器插件来验证我的代码 但我想禁用自动提交表单 我宁愿自己使用 jQuery 发送它 post method 事实上 考虑到我的按钮不是类型 我不太确定为什么要提交表单submit但只是
  • java进程间通信

    是否可以使用在命令行中运行java类来运行正在运行的swing中的某个类或函数 例如 当java Test asd将setText一个正在运行的swing Jlabel设置为asd 这两个程序在不同的进程中运行 您需要在进程之间创建一个接口
  • 在正则表达式中获取非法字符范围:java

    我有一个简单的正则表达式模式来验证名称 但是当我运行它时 我收到非法字符范围错误 我认为通过转义 s 它将允许一个空格 但编译器仍然抱怨 public boolean verifyName String name String namePa
  • PHP 支持 MVP 模式吗?

    有很多使用 ASP NET 解释 MVP 模式的示例 但没有找到任何使用 PHP 的示例 我是 PHP 程序员 想知道在哪里可以获得 MVP 模式 PHP 示例 简短的回答是 是的 PHP 可以 Note its not exactly M