【问题标题】:MVC form data submission to controllerMVC 表单数据提交给控制器
【发布时间】:2013-04-06 19:03:13
【问题描述】:

我正在设法部署一个非常简单的实现,其中包含一个注册表单,出于演示目的,我选择使用 MVC 模式。

我的小问题是,当我按下提交按钮时,我希望通过控制器的合适方法处理提交的数据。

例如:

在视图部分,我这样声明表单:

<form action="controller/validate" method="post"/>

我假设这是与路由相关的事情,但我很好奇是否可以建议另一种方式。

--

问候,

西奥

【问题讨论】:

    标签: php forms model-view-controller


    【解决方案1】:

    路由器可以像 switch 语句一样简单,而不是小型站点的成熟路由器:

    switch($_SERVER['REQUEST_URI']) {
        case 'controller/validate':
            $view = new \Views\User\Registration();
            $controller = new \Controllers\UserRegistration($view);
            $method = 'validate';
            break;
    
        default:
            $view = new \Views\Error\NotFound();
            $controller = new \Controllers\Error($view);
            $method = 'notFound';
            break;
    }
    
    echo $controller->$method();
    

    还请注意,您通常不是基于当前路径执行相对 URL,而是希望执行到文档根目录的相对 URL:

    <form action="/controller/validate" method="post"/>
    

    注意前面的斜线。

    以上只是一个简单的(未经测试的)半伪代码示例

    【讨论】:

    • +1 为简单起见。在考虑纯 PHP 时,长期使用框架的用户(比如我)似乎倾向于把事情复杂化。
    • 是的,它不会是一个复杂的构建,因此您的回复非常接近我的要求。您是否建议将其创建为独立文件(就不是控制器而言),将其集成到 index.php 中,或遵循其他方式?
    • @thitami 每当我在上面使用时,我都会在我的引导文件中执行此操作(基本上是大多数应用程序中的 index.php 文件)。引导文件为应用程序执行所有可能的初始化操作。
    • 我可能会将其放入bootstrap.php 之类的内容中,并将其包含在index.php 中。但话又说回来,我会关心未来的扩展(比如多个前端控制器 - 也许debug.php)。在您的情况下,index.php 可能就足够了。
    • 谢谢大家。非常感谢您的帮助。我接受 PeeHaa 的回答。
    【解决方案2】:

    通常,您可以通过路由(如POST /register)使您的控制器可访问。在引导文件中将控制器操作分配给此路由。一些伪代码:

    $framework->route('GET', '/register',
                      'RegistrationController::action_form');
    $framework->route('POST', '/register',
                      'RegistrationController::action_submit');
    

    另一种方法是将路由直接映射到控制器(有些框架会这样做,我相信 Kohana 就是其中之一),如下所示:

    • 路线:/register/submit
    • 解析为:RegisterContoller::action_submit()
    • 请求方法的管理(标准 HTTP 中的GETPOSTPUTDELETE)发生在操作方法中。

    【讨论】:

    • 谢谢你,卢卡斯。我目前正在寻找的是寻找是否有更短的路由替代方式。
    • @thitami 那将最接近我提到的第二种方式。 路由只是某事的名称;您总是必须以某种方式将控制器分配给请求。我的建议是自动映射这样的请求:/&lt;Class&gt;/&lt;Method&gt; 映射到 &lt;Class&gt;Controller::action_&lt;Method&gt;()。请注意名称的 Controller 后缀和 action_ 前缀。这样可以避免其他类或方法(如InternalClass::do_something_internally())被公众调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多