如何从 HTML (PHP) 表单中调用我的 (tiny) mvc 方法?
Posted
技术标签:
【中文标题】如何从 HTML (PHP) 表单中调用我的 (tiny) mvc 方法?【英文标题】:How to call my (tiny) mvc methods from HTML (PHP) forms? 【发布时间】:2012-01-04 19:25:34 【问题描述】:我在 gist 中发布了相关代码:
https://gist.github.com/1561520
我想知道是否有人可以告诉我从我的表单中调用 ReportsController->create() 方法的正确方法是什么。我能想出的唯一想法是让表单有一个随机动作,比如action="application/views/reports/new.php"
,然后从那里调用我的控制器创建方法。问题是,这违背了__autoload
函数的目的,除非我弄错了。
感谢您的帮助!
【问题讨论】:
有人告诉我“绑定”框架将如何做到这一点。有人有什么入门技巧吗? 我不知道什么是“绑定”框架。看起来您需要找到控制器的表单操作 href。创建您自己的“链接”,在请求进入时转换它们,并在响应发出时在 html 输出中替换它们。您可以使用一些逻辑调用函数或使用输出缓冲(后处理视图)。 【参考方案1】:我会试试PHP-router 这样的简单路由器。
<?php
require 'Router.php';
$r = new Router();
// maps '/report/create' to controller ReportsController->create().
$r->match('/report/create','ReportsController#create');
if($r->hasRoute()) ?>
<h1>Route found!</h1>
<p><b>Controller: </b><?php echo $r->getRoute()->controller; ?></p>
<p><b>Action: </b><?php echo $r->getRoute()->action; ?></p>
<p><b>Params: </b><?php var_dump($r->getRoute()->params); ?></p>
<?php
// Load controller
$controller = new $r->getRoute()->controller;
// Call controller action, and pass params
call_user_func_array(array($controller, $r->getRoute()->action), $r->getRoute()->params);
else
die('<h1>No route found.</h1>');
【讨论】:
【参考方案2】:绑定框架不过是 index.php 中的一个逻辑,用于根据 HTTP 请求的属性(尤其是 URI)自动加载相关控制器。
如果您愿意,可以在这里混合使用 RESTful 语义。因此,使用表单中的数据发送到/reports
将创建报告。 GET 到/reports/...
将获取报告等...
过去,我所做的就是利用$_SERVER['PATH_INFO']。
所以表单将 POST 到 index.php/reports
,这将为您的 index.php 提供足够的信息来决定哪个控制器实例化,以便处理请求。您可以将更多选项编码到 URI 中,例如 index.php/reports/create
,但这有点难看 IMO。我个人更喜欢这里的 RESTful 概念。所以如果你要使用 RESTful,你需要检查 $_SERVER['REQUEST_METHOD'] 并决定调用哪个函数。明智的做法是决定和标准化处理每个 HTTP 方法的函数的名称,例如 Create 用于 POST、Fetch 用于 GET、Remove 用于 DELETE 等。
现在我们知道要加载哪个控制器以及必须执行什么操作,您需要让控制器实例化模型,然后根据方法(或 PATH_INFO 中的额外参数)调用相关函数。
我希望我已经给了你足够的帮助,让你摆脱手头的问题。
【讨论】:
这是我已经开始前进的方向,你让我对 RESTful 方式有了很好的了解。作为一名 Rails 开发人员,我真的更喜欢休息。 很高兴我能帮上忙;顺便说一句,即使我已经做了很多 MVC(仅由于我公司的限制/约定),我更喜欢在资源概念之上建模 RESTful API。恕我直言,用于简单 Web 应用程序的 MVC 被高估了!祝你冒险进入自己的 PHP 框架;很好玩!以上是关于如何从 HTML (PHP) 表单中调用我的 (tiny) mvc 方法?的主要内容,如果未能解决你的问题,请参考以下文章