通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

2024-05-20

今年夏天我安装了两个不同的 PHP 系统。每个都使用两种不同的方法:

方法#1:每个任务一个 PHP 文件

该方法需要一个PHP为每个主要任务创建文件。例如,我的上传脚本可以通过http://www.domain.com/upload.php. On upload.php,实例化并使用“控制器”和“视图”类。例如,upload.php可能看起来像这样:

<?php
require_once PATH_LIBRARY . 'control/Uploader.class.php';
require_once PATH_LIBRARY . 'view/UploaderPage.class.php';

$uploader = new Uploader();
$uploader->setView(new UploaderPage());
$uploader->init();
?>

在上面的脚本中,如果我想调用另一个脚本,我只需重定向并附加必要的 URL 编码变量(header('Location: edit_details.php?image_id=456');).

方法#2:主要方法index.php处理所有请求的文件

该方法不需要PHP为每个主要任务创建文件。相反,系统中使用的每个“控制器”类都注册在index.php我称之为一个独特的班级Router。路由器决定指定的控制器是合法还是非法,并相应地采取行动(将浏览器路由到正确的控制器)。例如,简化版本index.php script:

<?php
require_once 'bootstrap.inc';
require_once PATH_LIBRARY . 'router/Router.class.php';

$router = new Router();
$router->register('Uploader', PATH_LIBRARY . 'control/Uploader.class.php');
$router->register('DetailsEditor', PATH_LIBRARY . 'control/DetailsEditor.class.php');
$router->route();
?>

因此,每个动作都发生在index.php。不需要大量文件,这些文件不执行太多其他操作来实例化特定视图和控制器类。但是,如果您想从脚本/类 B 调用脚本/类 A,那么您需要在 URL 上传递控制器类的名称:header('Location: index.php?controller=DetailsEditor&image_id=456').

到目前为止,我不太喜欢需要在 URL 中包含控制器名称这一事实。我觉得它向最终用户暴露了太多的底层系统。但是,我确实喜欢这样一个事实:我可以在一个页面上注册所有控制器类。大多数情况下,我不知道暴露控制器名称是否安全。另一个烦恼是,如果我想通过 POST 请求调用脚本,我必须包含一个隐藏的输入来指定所需的控制器类(例如<input type="hidden" name="controller" value="DetailsEditor" />).

我希望这足以继续下去。我只是担心第二种方法在接下来的几个月里并不能真正为我服务。我很快就有一小段时间可以选择其中之一。

谢谢。


使用 Router 处理效率更高,因为您只有一个地方需要更改,如果您将来被迫更改文件/目录结构,并且如果有任何协作者到来,则更容易理解系统如何工作,如果每个负载仅由一个“路由器/算法”完成

只是我的观点

PS想象一下,如果您必须更改目录结构,您将被迫重写一堆包含内容,这很耗时,并且可能会产生错误,并且需要时间:)

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

通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点? 的相关文章

  • php 中的浏览器名称?

    我们如何使用php脚本获取浏览器名称和版本信息 正如 Palantir 所说 另外看看 get browser 函数 您还可以在其中检查浏览器中启用的功能
  • 重置密码 电子邮件

    我是 Laravel 开发新手 目前正在从事小型项目 我想自定义重置密码的电子邮件模板 甚至将其链接到完全不同的模板 对于身份验证脚手架 我使用了php artisan make auth命令 但是 默认重置密码功能使用默认的 Larave
  • LinkedIn Groups API - 在单个 API 请求中获取多个群组的群组徽标

    Using LinkedIn 群组 API http developer linkedin com documents groups api 我正在显示用户在 LinkedIn 上所属的组列表 使用以下命令可以清楚地在一次调用中获取组列表
  • 从 php 中的 PKCS7 签名中提取证书

    我需要从 pkcs7 签名文件中提取用户证书 我可以使用以下命令通过命令行来完成此操作 openssl pkcs7 in somesign pks7 inform PEM print certs 这将为我提供整个证书链 我可以处理生成的文件
  • 如何从 IIS 7.5 中的 PHP 页面诊断内部服务器错误 (HTTP 500)

    我正在尝试获取在我的本地开发计算机 带有 IIS 7 5 的 Windows 7 64 位 上运行的 aMember 会员管理系统的试用副本 我有 MySQL 5 5 10 和 PHP 5 3 6 后者是我使用 Windows 安装程序包安
  • 如何使用过滤器进行输出编码以防止XSS?

    我在 servlet 中使用以下代码 protected void doGet HttpServletRequest request HttpServletResponse response throws ServletException
  • 强制 nginx 立即关闭连接

    如何让nginx在请求完成后立即关闭tcp连接 我刚刚找到了解决方案 location ip keepalive timeout 0
  • 安装 Symfony 2.4.1 lib-icu 4.4 依赖项时出现问题

    我遇到了与以下相同的问题this one https stackoverflow com questions 16753105 problems with lib icu dependency when installing symfony
  • 使用键模式从 Laravel 4 缓存中删除?

    对于我的包 我们使用 Laravel 缓存 我们创建的每个缓存键都有前缀 所以我们得到mypackage config mypackage md5ofafilename有时我需要刷新我的包创建的所有缓存文件 问题是什么 我只知道缓存键的模式
  • Zend 框架将字母“f”输出到我的页面上

    我已经下载了 Zend 框架稳定版本 我相信是 1 11 上传到我的服务器 并将其添加到我的 php 包含路径中 我的目标是使用 Feed 和 Feed Writer 模块来处理一些 RSS 和 Atom 的繁重工作 问题是 每当我包含 F
  • 如何使用 PHP SDK 在 AWS SES 发送的电子邮件中实现 List-Unsubscribe 标头

    我尝试使用 AWS PHP SDK 添加自定义标头 以便可以实现 List unsubscribe 标头 问题是我找不到任何地方如何实现它 我已阅读文档但什么也没有 http docs aws amazon com aws sdk php
  • 为什么我的函数将布尔值更改为“on”?

    所以我是 php 编程世界的新手 我正在在线学习和其他形式等 但我找不到任何东西来帮助回答我的问题 这就是我在这里的原因 任何帮助当然不胜感激 谢谢 我想将下面的代码变成我可以调用的函数 它的工作原理如下所示 如果我选中表单中的复选框 它会
  • Codeigniter:重置表单值

    在我看来 我想要做的是在用户成功注册后清除表单字段 这里一切正常 即用户正在注册 成功消息正在向用户显示 除了我想要做的是清除表单字段的值 我正在使用这个 Clear the form validation field data so th
  • 从 XML 节点 PHP DOM 中删除所有子节点

    我想使用 PHP DOM 从 XML 节点中删除所有子节点 以下之间有什么区别 A while parentNode gt hasChildNodes parentNode gt removeChild parentNode gt chil
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • PHP 等级分类器 - 数组的问题[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 您好 我正在开发一个 docker 微服务等级检查器应用程序 我正在从 HttpRequest 获取用户输入 我缺乏一些关于数组的基本知识以
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • PHP - Filter_var 替代方案?

    我构建了一个 php 脚本来输出以表单形式发布的数据 但遇到了问题 网站将运行的服务器运行 PHP 5 1 6 此版本的 PHP 不支持 filter var 我需要知道短期内的替代方案 最好是昨天 但在 Google 或 Stack Ov
  • 为什么我不能在 TCPDF 表中使用 č,ć,đ 图表?

    我正在为我的网站构建一个 tcpdf 文件 该 tcpdf 文件中有一个包含一些数据的表格 但我无法使该章程正常工作 对于编码 我使用 windows 1250 宪章女巫不起作用 我已经尝试过 utf 8 但仍然没有得到这个章程 tcpdf

随机推荐

  • C# 在不创建实例的情况下获取属性值?

    是否可以在不创建实例的情况下获得价值 我有这门课 public class MyClass public string Name get return David public MyClass 现在我需要获取值 David 而不创建 MyC
  • 安卓无法玩ogg

    有人知道这是什么意思吗 ogg使用phonegap is Media播放 它使用MediaPlayer 05 26 15 41 50 007 1160 3631 E AudioFlinger no more track names avai
  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • PostgreSQL函数中sql语言和plpgsql语言的区别

    我很新数据库开发所以我对下面的例子有一些疑问 函数 f1 语言 SQL create or replace function f1 istr varchar returns text as select hello varchar istr
  • GridView 中多次调用 getView()

    我的 Activity 由包含 40 多个元素的 GridView 组成 开始活动后 用户最多可以看到 15 个项目 3 行 每行 5 个项目 我在 getView 正文中编写传递给获取 View 的 LogCat 编号 Log i get
  • Relay 中的联合类型支持

    当您将字段定义为两种类型的联合时 示例机器包含 Ships 和 Droid 那么在 Relay 中您可以执行类似的操作 fragment on Faction relay plural true name machines on Ship
  • 为什么卡夫卡这么快[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如果我有相同的硬件 请使用 Kafka 或我们当前的解决方案 ServiceMix Camel 有什么区别吗 Kafka 能处理比它
  • 获取字符串中的最后一个整数

    我需要隔离包含多个整数的字符串中最新出现的整数 我怎样才能得到23代替1 for lastnum1 text 1 out of 23 lastnum1 this gt getEval eregi replace out of text 你可
  • 无法使用 Xamarin 和 WCF 访问 Web 服务

    我想使用 Xamarin 和 WCF 来使用公共 Web 服务 对于这个演示 我将使用Xamarin iOS 这是我试图使用的 公共 网络服务 http www webservicex net globalweather asmx WSDL
  • 为什么我的 tableView 函数运行了 3 次?

    我有一个 UITableView 并且有执行它所需的方法之一 func tableView tableView UITableView numberOfRowsInSection section Int gt Int println sec
  • 围绕 readline 构建的 python 批处理的触发器选项卡完成

    背景 我有一个 python 程序 它导入并使用 readline 模块来构建自制的命令行界面 我有第二个 python 程序 围绕 Bottle 一个 Web 微框架构建 充当该 CLI 的前端 第二个 python 程序向第一个程序打开
  • 为什么 Opencv Findcontour 在 Emgu c# 中表现不同?

    你好 opencv c 方法Findcontours返回数组层次结构并获取孔的边界 我可以获取层次结构 我怎样才能在 emgu 简历中得到这些边界请帮忙 我怎样才能找到 emgu 简历中的漏洞 您可以使用以下代码获取 Emgucv 中的轮廓
  • 使用远程管理凭据将文件复制到远程计算机

    我正在使用 C 我需要能够将一组文件复制到大约 500 台不同的计算机上 我已成功地使用 LogonUser 方法来模拟具有复制文件所需权限的域帐户 文件的目标路径类似于 远程计算机 C SomeFolder 我的问题是 有没有办法做到这一
  • 从作用域 '' 引用了类型 '' 的变量 '',但未定义

    好吧 下面的代码是不言自明的 我想使用将两个表达式合并为一个And操作员 最后一行导致 rune time 错误 附加信息 从范围 引用了 System String 类型的变量 y 但未定义 Code Expression
  • Airflow 1.10.3 - 空白“最近任务”和“DAG 运行”

    我在 Ubuntu 18 10 上安装了 Airflow 1 10 3 并且能够添加 DAG 并运行它们 但 Web UI 中的 最近任务 和 DAG 运行 为空 我所看到的只是一个黑色虚线圆圈 它不断加载 但什么也没有实现 我最近将 Ai
  • 从数据框中按索引删除行

    我有一个数组wrong indexes train其中包含我想从数据框中删除的索引列表 0 63 151 469 1008 要删除这些索引 我正在尝试这样做 df train drop wrong indexes train 但是 代码失败
  • 如何重新加载 jquery dropkick 对象

    我使用一个简单的选择列表和 jquery dropkick 库来使其美观 现在我想在更改相应的选择元素后更改 dropkick 内容 出现了一个新选项 但只需调用 select dropkick 不起作用 而且好像不支持 只需从头开始重建那
  • scrapy LinkExtractors 最终会得到唯一的链接吗?

    所以 我有一个包含很多文章和页码的页面 现在 如果我想提取一篇文章 我会使用 Rule LinkExtractor allow article html callback parse article 对于页面我使用这个规则 规则 LinkE
  • 在 Swift 中自动移动 UISlider

    我想在按下按钮时将 UISlider 从 minValue 循环移动到 maxValue 并在再次按下按钮时将其停止在当前位置 我想使用 Swift 我遇到的主要问题是函数 slider setValue 太快了 我希望动画更慢 IBAct
  • 通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

    今年夏天我安装了两个不同的 PHP 系统 每个都使用两种不同的方法 方法 1 每个任务一个 PHP 文件 该方法需要一个PHP为每个主要任务创建文件 例如 我的上传脚本可以通过http www domain com upload php O