在 PHP 控制器中调用模型功能的最佳选择

2024-04-16

我正在使用 PHP 构建自定义 MVC 框架。我的问题是当我想通过控制器类访问任何模型类时。我见过的一种方法是通过使用 get 和 set 等神奇方法的注册表设计模式,尽管 PHP get 和 set 被一些人认为是不好的做法。我读过有关通过容器完成的依赖注入的内容,但我看不到它有效地工作,因为容器必须调用模型,或者它必须包含模型,这会破坏 MVC 的目的并创建一个巨大的超类。 Singleton 被视为不好的做法。我提到的方法有什么解决方案或改进吗?可能只是我的理解和PHP知识需要提高。

目前我有这个:router.php(通过 GET 变量加载控制器

 <?php

class router {



function __construct() {

    if (file_exists("controller/".$_GET['url']."Controller.php"))  {


       function __autoload($controller) {

           $controlinclude = "controller/".$controller.".php";
            include $controlinclude;

      }
       $control = $_GET['url']."Controller";
        new $control();


    }
    else    {

        // throw exception
    }

}

}
?>

希望这是有道理的


首先...不要将自动加载脚本放入路由机制中。你正在混合责任。您最好为此创建一个单独的类spl_autoload_register http://php.net/manual/en/function.spl-autoload-register.php.

Neeext .. 不要在构造函数上进行复杂的操作。它使您的代码有些难以测试。也许你应该是这样的:

// you might want to replace $_GET with $_SERVER['QUERY_STRING'] later
$router = new Router( $_GET['url'] );

// where 'default' is the name of fallback controller
$controller_class = $router->get_controller( 'default' );
$method_name = $router->get_action( 'index' );

$model_factory = new ModelFactory( new PDO( ... ) );
$controller = new {$controller_class}( $model_factory );
$controller->{$method_name}();

另外,你应该看看 php命名空间 http://php.net/manual/en/language.namespaces.php。结束课程没有意义...Controller只是想知道课程将在哪里进行。

好吧......回到模型。

在 Web 开发社区中,对于模型存在相当普遍的误解(我将这种混乱归咎于 RoR)。MVC 中的模型不是类,而是包含大量实例的应用程序层。大多数实例属于两种类型的类之一。具有以下职责:

  • 领域逻辑 :

    处理所有的计算、计算和所有领域特定的细节。该组中的对象不知道数据实际存储在何处以及如何存储。他们只是操纵信息。

  • 数据存取

    通常由适合的物体制成数据映射器 http://martinfowler.com/eaaCatalog/dataMapper.html模式(不要与同名的 ORM 混淆……没有共同点)。负责存储域对象中的数据并检索它们。可能在数据库中..可能不在。这就是您的 SQL 查询所在的位置。

在半现实世界的情况 () 中,它可能看起来像这样(与上面的代码相关):

class SomeController
{
   // ... snip ...
   protected $model_factory = null;
   // ... snip ...

   public function __construct( ModelFactory $factory )
   {
       $this->model_factory = $factory;
   }
   // ... snip ...
   
   public function action_foobar()
   {
      $user = $this->model_factory->build_object( 'User' );
      $mapper = $this->model_factory->build_mapper( 'User' );

      $user->set_id(42);
      $mapper->fetch($user);

      if ( $user->hasWarning()  )
      {
          $user->set_status( 'locked' );
      }

      $mapper->store( $user );
   }

   // ... snip ...
}

如您所见,没有任何迹象表明数据是如何存储的。用户帐户是新帐户还是已经存在都没有关系。

您可能会发现一些有用的材料

Videos

  • 高级面向对象模式 https://vimeo.com/21173483 (slides) http://qafoo.com/talks/11_11_osidays_advanced_oo_patters.pdf
  • 整洁代码讲座:不要寻找东西! http://www.youtube.com/watch?v=RlfLCWKxHJ0
  • 整洁代码讲座:单元测试 http://www.youtube.com/watch?v=wEhu57pih5w
  • 干净代码讲座:全局状态和单例 http://www.youtube.com/watch?v=-FRm3VPhseI

Books:

  • 用于开发高质量 PHP 框架和应用程序的实际解决方案 https://rads.stackoverflow.com/amzn/click/com/0470872497
  • 企业应用架构模式 https://rads.stackoverflow.com/amzn/click/com/0321127420
  • 干净的代码:敏捷软件工艺手册 https://rads.stackoverflow.com/amzn/click/com/0132350882
  • SQL 反模式:避免数据库编程的陷阱 https://rads.stackoverflow.com/amzn/click/com/1934356557
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 PHP 控制器中调用模型功能的最佳选择 的相关文章

  • 如何处理 PHP 中浮点数的奇怪舍入

    众所周知 浮点运算并不总是完全准确 但是如何处理它的不一致之处呢 As an example in PHP 5 2 9 this doesn t happen in 5 3 echo round 14 99225 4 14 9923 ech
  • curl 无法获取网页内容,为什么?

    我正在使用curl 脚本转到链接并获取其内容以进行进一步操作 以下是链接和curl脚本
  • 从 json 数组获取值并执行 sql 插入

    这是我的数组 json 1 Device ID a9a3346be4375a92 Date 2012 05 31 Time 15 22 59 Latitude 51 4972912 Longitude 0 1108178 2 Device
  • 服务器响应中的“连接:保持活动状态”

    我正在尝试建立从 Silverlight 应用程序到 Apache 服务器托管的 PHP 页面的 HTTP 持久连接 即无需为每个 HTTP 请求创建新的 TCP 连接 为此 我需要网络服务器发送其 HTTP 响应 并将 Connectio
  • 匹配括号内任何字符的正则表达式

    尝试创建一个与括号内的任何字符匹配的正则表达式 我的正则表达式模式是这样的 preg match listanswer answer 括号内的所有字符串都是匹配模式 但问题是 当我尝试匹配例如 this word sample data 它
  • 如何在 Laravel 中 session_write_close() ?

    Running session write close before sleep 在 Laravel 中似乎不起作用 因为会话仍然被其他请求阻止 直到当前连接完成 我试图sleep 在 Laravel 中 不会阻止其他请求 发现 sessi
  • PHP语言问题

    我有一个 php 页面 它将邮件发送到特定电子邮件 其中包含此页面表单中的数据 邮件必须以网站的母语 阿拉伯语 发送 但是当我单击表单上的提交按钮时 收到的邮件一半可读 阿拉伯语 另一部分不可读 符号 我想知道如何解决这个问题并且能够发送邮
  • ajax 会增加还是降低安全性?

    我正在创建一个网站 到目前为止它是纯 PHP 的 我在想 既然很少有人没有启用 JavaScript 我想知道为什么 也许我应该将我的网站创建为一个完全 PHP 的网站 而不使用任何 AJAX 难道是我想错了 可以肯定的是 如果我实施一些
  • PHP,文本从数据库中回显,没有换行,全部一体

    我的数据库中有一个长文本 从 php mayadmin 来看它看起来很好 但是当我将它回显到页面时 它会丢失所有格式 即没有新行 全部都在一个块中 有任何想法吗 Thanks 可能是因为换行符是 n 并且 html 想要 br 所以使用nl
  • 在 Laravel 中按数据透视表 create_at 排序

    在我的数据库中 我有以下表格 courses id 名称 创建时间 更新时间 students id 名称 创建时间 更新时间 课程 学生 id course id student id created at updated at 我正在尝
  • Lumen 微框架 => php artisan key:generate

    我正在尝试 PHP 微框架 Lumen 来自 Laravel 我的第一步就是调查 env example文件并复制一份以供我使用 env文件 就像 Laravel 中一样 有一个变量 APP KEY 现在我尝试了简单的命令php artis
  • 如何在PHP中将图像从内存上传到AWS S3?

    所以我目前有一个使用 AWS S3 上传图像的上传系统 这是代码 Upload image to S3 s3 Aws S3 S3Client factory array key gt mykey secret gt myskey try s
  • 如何使用多个数据库设置 symfony 3 学说迁移?

    我在验证和更新模式时努力让 symfony doctrine 排除数据库视图 我第一次尝试没有教条迁移 看到这个问题 https stackoverflow com questions 46775200 symfony 3 doctrine
  • 使用 Flot、html、PHP 和 MySql 查询绘制多个图表

    我正在尝试使用 Flot html PHP 和 MySql 查询绘制多个图表 但我陷入了困境 因为我找不到在同一个 html 页面中绘制多个 flot 的方法 为简单起见 在数据库 test db3 映像中包含以下字段 表1 用户名 发送邮
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • 检查 Objective-C 块类型?

    这主要是出于好奇 我不太确定它的实际用途是什么 但就这样吧 由于块也是 Objective C 对象 是否可以检查它们的类型 也就是说 它是否响应isKindOfClass 消息以及如何使用该消息来处理块 我天真的以为事情大概是这样的 vo
  • 由于未定义符号,PECL solr 未加载:curl_easy_getinfo

    我正在尝试加载 PECL solr 扩展 我尝试使用 pecl install solr 并下载并使用 phpize configure make 来安装它 在这两种情况下 扩展安装时都没有错误 但在 apache 重新启动后 或在命令行上
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 准备好的语句需要 0 个参数,给定 1 个参数..,使用 php 手册示例 [重复]

    这个问题在这里已经有答案了 我直接从 php 手册示例中获取了这个 它几乎与我需要的相同 但我仍然收到此错误 有人可以告诉我我错过了什么吗 stmt link gt prepare SELECT obitBody Photo FROM tn
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应

随机推荐

  • Maven-resources-plugin不会复制.metadata文件夹

    我正在尝试使用 maven resources plugin 复制文件夹或以下结构 root metadata Project gitignore 项目目录和 gitignore 文件被复制 但 metadata 目录由于某种原因被遗漏 如
  • Go:使用 gdb 打印变量

    在此程序中 如何使用调试器中断执行并打印 i 的值 package main import fmt func main x abc i 3 fmt Println i fmt Println x 我无法打印我 不过我可以打印 x go bu
  • 将工具栏设置为片段中的操作栏

    我想将我的工具栏设置为操作栏 但由于您的工具栏是布局元素 因此它必须位于您的布局中 现在我的布局在我的片段中 我在布局中添加了工具栏 并在片段中调用它 Toolbar Toolbar toolbar Toolbar getActivity
  • 如何有条件地要求 Angular 4 中的表单输入?

    我正在使用模板驱动的表单来添加任务 并且有 2 个数字类型的输入字段用于估计完成任务的分钟数 一个字段用于估计小时数和 另一个是完成任务的估计分钟数 因为任务估计可以在几小时内完成 例如1hrs 或者像这样的小时和分钟1小时30分钟 所以我
  • PHP7 - nusoap - nusoap_client 有一个已弃用的构造函数

    我想用nusoap on Laravel 5 3 with PHP7 但是当我生病时尝试安装它composer从该包中 https github com codecasts nusoap php7 https github com code
  • unique_together 中的多个元组

    当我定义模型并在元中使用 unique together 时 我可以定义多个元组 这些是进行 OR 运算还是 AND 运算 可以说我有一个模型 class MyModel models Model druggie ForeignKey dr
  • 给定一个字符串数组,返回所有属于字谜词组的字符串

    给定一个字符串数组 返回所有属于字谜词的字符串组 我的解决方案 对于数组中的每个字符串单词 对其进行排序 O m lg m m 是单词的平均长度 建立一个哈希表 将排序后的单词作为键放入哈希表中 并生成该单词的所有排列 O m 如果字典中存
  • 用于验证 Google Analytics UA 编号的正则表达式

    我并不是 100 清楚 Google Analytics UA 编号始终是 6 位数字 一个破折号和 2 位数字 正如 Google 在其文档中经常提到的那样 常见的反例是帐户部分使用少于 6 个 配置文件使用少于 1 4 个 所有示例都始
  • WCAG:应用样式时,Firefox 和 Edge 不会在焦点输入元素上显示轮廓

    我正在创建一个表单 它遵循一些 WCAG 准则 其中之一是 G165 使用平台的默认焦点指示器 以便继承高可见度的默认焦点指示器 https www w3 org TR 2016 NOTE WCAG20 TECHS 20161007 G16
  • 不同日志文件中不同级别的日志

    我们如何编写一个简单的 log4j2 xml 文件 将不同级别的日志放入不同的文件中 例如 我们有错误日志和任何信息日志 我需要将所有错误日志消息推送到一个日志文件中 并将所有信息日志消息推送到另一个文件中 我希望 InfoControll
  • 在 Eval 中设置变量 (JavaScript)

    我正在编写一个 GreaseMonkey 脚本 使用 JQuery 并且我需要一些由原始页面中的脚本设置的变量 如下所示 我从另一个页面获取这个元素并尝试评估它 奇怪的是这不起作用 get link url null function da
  • golang中的[]string和...string有什么区别?

    在 Go 语言中 string是一个字符串数组 我们还使用 string作为参数 有什么不同 函数定义 func f args string 我可以像下面这样调用这个函数吗 args string a b f args string是一个字
  • c中的double和float可以存储多大的数字?

    我试图弄清楚我可以使用多大的数字作为浮点数double 但除了整数值之外 它并没有按照我预期的方式存储 double应该保存 8 个字节的信息 足以保存变量 a 但它保存得不正确 表明1234567890123456768其中最后 2 位数
  • 如何从 Django QuerySet 获取绝对图像 URL 列表?

    在 Django 中 当您使用 CDN 提供媒体文件时 构建图像 URL 的绝对路径的最佳方法是什么 就我而言 我有一个 Movie 对象的 QuerySet 并且我想检索电影的图像属性的绝对 URL 其中图像是 ImageField 有没
  • http 请求每 x 秒一次(角度)

    我试图在 angular2 中每 x 秒刷新一次 http 调用 ionViewDidLoad let loader this LoadingController create content Please Wait loader pres
  • Linux Bash:将多个不同的文件移动到同一目录中

    作为一个相当新手的 Linux 用户 我似乎不知道如何做到这一点 我正在尝试将一个目录中的所有唯一文件移动到另一个目录中 例子 ls vehicle car txt bicycle txt airplane html train docx
  • 查找到节点的连接边数以及具有最大连接边的节点

    在图中 如何找到与节点相连 直接绑定 的边数 然后 这将是微不足道的 但如果有任何直接方法来找到具有最大边连接的唯一节点 那就太好了 我正在使用 Python 2 7 和 Networkx 到目前为止 我正在这样做 sG list nx c
  • vite无法处理xxx.html文件

    我有一个 Vue2 的 Vite 项目 它包含一个静态 html 文件 喜欢关注 import template from editor html export default template template 当我跑的时候yarn de
  • 如何获得比 HostingEnvironment.ShutdownReason 更详细的有关 ASP.NET 应用程序重新启动的详细信息?

    我正在对 ASP NET 应用程序中的重新启动进行故障排除 该应用程序每天重新启动大约 20 次 我正在使用 log4net 库进行日志记录 遵循以下建议这个问题 https stackoverflow com questions 8293
  • 在 PHP 控制器中调用模型功能的最佳选择

    我正在使用 PHP 构建自定义 MVC 框架 我的问题是当我想通过控制器类访问任何模型类时 我见过的一种方法是通过使用 get 和 set 等神奇方法的注册表设计模式 尽管 PHP get 和 set 被一些人认为是不好的做法 我读过有关通