带 MVC 的 PHP 前端控制器

2024-03-01

我正在尝试通过前端控制器设计深入研究 MVC。

我想通过使用一行来调用我的整个应用程序,例如在index.php中:

require_once(myclass.php);
$output = new myClass();

我很想摆脱 require_once 行,但我不知道如何在不包含它的情况下加载我的类?

无论如何,我的主要问题是如何使用一个前端类加载各种控制器、模型和视图等。到目前为止我已经想出了:

class myClass
{
    private $name;
    public $root = $_SERVER['DOCUMENT_ROOT'];
    private $route = array("Controller" => "", "Model" => "", "View" => "", "Paremeters" => "");
    function __construct() 
    {   $uri = explode("/",$_SERVER['REQUEST_URI']);
        if(isset($uri[2])) {$this->route['Controller'] = $uri[2];}
        if(isset($uri[3])) {$this->route['Model'] = $uri[3];}
        if(isset($uri[4])) {$this->route['View'] = $uri[4];}
        if(isset($this->route['Controller'])) 
        {
            include($this->root."/".$this->route['Controller'].".php");
        }
    }

}

但这似乎有点令人费解,而且有些过头了。另外,一旦我将新类包含在 __construct 中,我应该如何加载它?

我很抱歉缺乏知识,我已经在谷歌上搜索了很多次,但我不断出现相同的页面,这些页面似乎并没有扩展我对此事的知识。


如果您的网址肯定会是http://domain.com/[控制器]/[操作]/ http://domain.com/%5Bcontroller%5D/%5Baction%5D/参数,那么你的前端控制器可能如下所示:

<?php
class Application
{
    public function __construct()
    {
        $this->setupAutoloader();
        $this->route();
    }

    private function setupAutoloader()
    {
        // do your autoloading here
    }

    private function route()
    {
        $request = explode('/', trim($_SERVER['REQUEST_URI'], '/'));

        $controller = isset($request[0]) ? ucwords(array_shift($request)) . 'Controller' : 'HomeController';
        $action = isset($request[0]) ? array_shift($request) : 'index';
        $parameters = $request;

        $response = call_user_func_array(array($controller, $action), $parameters);
    }
}

从这里,您可以添加自动加载器实现,对响应执行任何您想要的操作,然后从您的索引.php如下:

<?php
require 'path/to/Application.php';

$application = new Application();

不幸的是,如果第一个文件存储在文件系统的其他位置,那么您总是必须包含它,但如上所述,您可以从这里自动加载其他类,例如库、控制器、模型等。

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

带 MVC 的 PHP 前端控制器 的相关文章

  • 如何从 Laravel 中的表中选择所有列名称?

    我试图从表中获取所有列名Teller 功能 public function getTableColumns tables return DB select DB raw SELECT COLUMN NAME DATA TYPE COLUMN
  • 检查php中位字段是否打开的正确方法是什么

    检查位字段是否打开的正确方法是什么 在 php 中 我想检查来自 db mysql 的位字段是否打开 这是正确的方法吗 if bit 1 还有其他方法吗 我看到有人使用代码ord http jameslow com 2008 08 12 m
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • 通过 Ajax 加载内容时,WORDPRESS 音频播放器未加载,MediaElement.js 未应用

    我正在创建一个 WordPress 主题 当我使用 ajax 加载内容时 它不会将 MediaElements js 应用于我的音频播放器 因此不会显示音频 我认为这是因为 MediaElement js 加载了 wp footer 并且此
  • 如何使用 phpunit 运行单个测试方法?

    我正在努力运行一个名为testSaveAndDrop在文件中escalation EscalationGroupTest php with phpunit 我尝试了以下组合 phpunit EscalationGroupTest escal
  • 如何在响应ajax codeigniter后停止执行其他控制器

    我想知道如何在响应输出 json 数据后停止执行函数和涉及的其他控制器 就我这里的情况而言 我只是打电话test 函数于dashboard控制器 In dashboard构造函数将执行MY Login library In MY Login
  • 检查 PHP 中“@”字符后面的单词

    我现在正在制作一个新闻和评论系统 但是我已经在一个部分上停留了一段时间了 我希望用户能够在 Twitter 上引用其他玩家的风格 例如 用户名 该脚本看起来像这样 不是真正的 PHP 只是想象脚本 3 string I loved the
  • 服务层和存储库

    我使用 MVC 框架已经有一段时间了 我真的很喜欢如何分离关注点 我养成了让控制器做大量工作的坏习惯 所以我真的在寻求一些建议 当我第一次开始使用 MVC 时 我经常在数据库工作完成后让控制器对模型进行操作 我知道这很糟糕 所以将这项工作转
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关
  • 从 .phar 存档中提取文件

    对于 Phar 文件 我完全错过了一些东西 我正在安装一个需要 phpunit pdepend 和其他依赖项的项目 我将它们作为 phar 文件获取 但是 我无法使用命令行工具 php 命令 从中提取文件 我用谷歌搜索了这个问题 但没有发现
  • Demandware MVC 概念

    我是 Demandware 的新手 我正在从 Magento 切换到 Demandware Demandware 不是开源的 我没有得到适当的教程 无法理解它的概念 我来自 Magento 所以我知道 Magento MVC 结构 但在 D
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • PHP HEREDoc (EOF) 语法在 Sublime Text 3 上突出显示与正斜杠的差异

    我不熟悉 Sublime Text 3 如何使用语法突出显示 例如 如果它纯粹依赖于主题 或者它内置于主题运行的标准中 但就我而言 使用 PHP 的 HERE 文档和转发存在一些语法突出显示差异斜线 一旦出现正斜杠 ST3 就会认为以下所有
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • Magento - 自定义支付模块

    这是一个非常普遍的问题 但这里是 我正在尝试在 Magento 中创建一个自定义支付模块 我创建了一个 常规 模块 可以连接到 Magento 事件 观察者模型 但是我如何告诉 Magento 将模块视为支付模块 以便它显示在管理后端和结账
  • 对具有混合类型值的数组进行数字排序

    我有一个像这样的混合数组 fruits array lemon Lemon 20 banana apple 121 40 50 然后申请sort 其功能如下 sort fruits SORT NUMERIC foreach fruits a

随机推荐

  • 使用 Swift 以编程方式将文本标签和按钮添加到动态表格视图单元格

    我有一个动态表格视图和一个显示数组的原型单元格 我的问题是如何在单元格左侧添加一个在每个单元格上显示不同名称的按钮 然后在右侧添加一个显示数组信息的标签 谢谢 D 想象一下这是下面的单元格 左侧 Button 数组信息 右侧 TextLab
  • 如何动态从数据库获取.cshtml

    我不得不说 这是一个与以下问题不同的问题 http craftycodeblog com 2010 05 15 asp net mvc render partial view to string http craftycodeblog co
  • R 中的 JSON 到数据帧

    我正在尝试将 json 文件转换为数据框架以进行数据可视化 如果我运行下面的代码 我会得到图 1 library jsonlite jdata lt fromJSON test json data lt as data frame jdat
  • 无法“brew link”未链接的小桶

    which node node bash node command not found brew install node Error node 0 6 18 already installed brew doctor Error You
  • Android Gradle 项目中包含 Apache HttpComponents 的问题

    我尝试使用 build gradle 文件将 httpmime 包含在我的应用程序中 并且一切都可以正常编译 相反 当应用程序尝试实际使用 MultipartEntityBuilder 类时 日志上会出现一堆 WARN 级别消息 表明存在问
  • F#:类型和函数之间可以相互递归吗?

    我可以使用and关键字来设置相互递归的函数定义 我也可以使用and对于相互递归的类型 但是如果类型和函数之间存在相互递归的关系怎么办 是我使该函数成为该类型的成员的唯一选择还是我可以使用类似的东西and这里也 编辑 添加一个简化的伪示例 我
  • Bing API 请求的 Ajax 授权标头是什么?

    我正在向 Bing 搜索 API 发送 ajax 请求 当我将请求放入浏览器中时 我用于请求的 URL 就会起作用 使用 ajax 时出现 401 错误 The authorization type you provided is not
  • CTE 内的 CTE

    是否可以在 CTE 中编写 CTE 我希望它遵循这个逻辑 但解释器不喜欢这段代码 with outertest as with test as select SRnum gamenumber StartOfDistribution Appl
  • Java.lang.NoSuchFieldError:LUCENE_3_6

    我正在运行 1 7 2 elasticsearch 服务器 并使用 org elasticsearch elasticsearch groovy 1 7 2 客户端通过 TransportClient 连接到它 elasticsearch
  • 检查组件是否附加了事件侦听器

    假设有一些
  • 从 Python 句子中提取三元组

    我正在尝试使用Python中的斯坦福依赖解析器从给定的句子中提取三元组 主语 谓语 宾语 有人可以指导我完成这个任务吗 提前致谢 您可以参考以下链接来从句子中提取三元组 https github com tdpetrou RDF Tripl
  • 如何在 MediaPlayer 上设置代理

    在我的音乐流程序中 如何设置代理android media MediaPlayer通过代理网络传输链接文件的类 我了解 NTCredential UsernamePasswordCredential Proxy Authorization
  • 如何使用 github graphql API 创建新的提交?

    我正在尝试使用 github graphql api 创建一个新的提交 使用创建CommitOnBranch https github blog changelog 2021 09 13 a simpler api for authorin
  • 如何删除添加到列表中的最后一个元素?

    我在 C 中有一个列表 我在其中添加列表字段 现在 在添加时我必须检查条件 如果条件满足 那么我需要删除从列表中添加的最后一行 这是我的示例代码 List lt gt rows new List lt gt foreach User use
  • 如何使用 php / symfony 进行 Windows 身份验证

    我在 Symfony 应用程序 Intranet 上工作 我听说可以使用身份验证窗口 而不必使用传统的身份验证窗口登录 有人可以给我 1 或 2 个有关该主题的链接地址吗 我自己搜索过 但找不到合适的关键词 他是WSSE吗 先感谢您 如果您
  • MFC中Tree(CTreeCtrl)中添加特定树项的图标

    我们可以为特定的树项目添加图标吗 我使用以下功能添加带有图标的项目 HTREEITEM InsertItem LPCTSTR lpszItem int nImage int nSelectedImage HTREEITEM hParent
  • 海龟图形 - 如何控制窗口何时关闭?

    我有一个小的 python 脚本 可以绘制一些海龟图形 当我的脚本运行完毕后 海龟屏幕会自动关闭 因此为了能够暂时看到图形 我必须使用time sleep 5 在脚本末尾以延迟关闭 有什么方法可以使其更加动态 即告诉 python 我想自己
  • Vba Excel从关闭的文件中进行vlookup

    我想从关闭文件到活动打开文件进行 vlookup 关闭文件的路径将作为变体给出 可以说mypath C list 我不知道是只设置路径更好还是设置完整路径 路径 文件名 你能帮忙吗 您将需要完整路径 Example Option Expli
  • 使用 SAN 证书时公用名称无效

    我已经为内部服务器生成了一个证书 该证书也可以从外部访问 根据this https stackoverflow com a 5937270 918406所以回答 CN 和 SAN 字段相互补充 因此我将 CN 设置为 server doma
  • 带 MVC 的 PHP 前端控制器

    我正在尝试通过前端控制器设计深入研究 MVC 我想通过使用一行来调用我的整个应用程序 例如在index php中 require once myclass php output new myClass 我很想摆脱 require once