0

我正在从头开始创建一个自定义 MVC 样式框架,现在我需要实现代码来控制在POST.

目前我有一个主 index.php 作为控制器并将数据传递给其他控制器,例如:

profilecontroller.class.php 论坛控制器.class.php

目前,我看到关于 POST 控制器可以去哪里的两个选项..

第一种方法

首先对于站点范围的帖子,例如可以在任何页面上发生的登录,我会在第一个 index.php 中使用类似的东西将所有 POST 重定向到特定的 POST 控制器,然后将数据发送到要处理的模型:

if($_POST)
    //post controller, works on specific form id's

替代方法

我看到的另一个选择是将POST标识符构建到模型构建部分中,但我认为这不是非常易于管理/明智的,因为它们总是被检查并导致更多加载的代码?

那里有什么好的/简单的例子吗?

我正在创建我的 mvc 以使其尽可能轻,这就是我从头开始的原因。

4

2 回答 2

3

在 RESTful 设置中,您通常会有一个对象的控制器,例如,news然后是、等操作。addeditdelete

在您的操作中,您应该断言应该使用什么 HTTP 方法来访问该方法(如果应该使用的话)。例如:

<?php
class NewsController extends AbstractController {
    public function save() {
        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
            header('HTTP/1.1 405 Method Not Allowed');
            die('Please use POST.');
        }
        // carry on knowing we're working with a POST request
    }
}

正如您所说,为 POST 请求创建一个单独的控制器会很快变得不守规矩和难以管理。

如果您正在寻找一种在不同控制器操作中处理不同 HTTP 方法的请求的方法,那么不妨看看ToroPHP。它是一个轻量级(单个文件)路由器,您可以将请求映射到称为处理程序的类,然后该处理程序具有用于不同 HTTP 方法的方法。一个简单的例子:

<?php

require 'lib/torophp/toro.php';
require 'classes/handlers/HomeHandler.php';

$toro = new ToroApplication(array(
    array('/', 'HomeHandler')
));
$toro->serve();

然后你HomeHandler会如下所示:

<?php
class HomeHandler {
    public function get() {
        echo 'Hello, world!';
    }
    public function post() {
        echo 'Try performing a GET request for the home page, buddy.';
    }
    // and so on...
}

希望有帮助。

于 2012-04-27T18:45:00.650 回答
0

这是我的默认控制器:

<?php
Class Controller_Home{
    public $Registery = null;

    final public function __construct($Registery){ $this->Registery = $Registery; }

    final public function Init($Method=null){
        # Quelle action on fait ?
        if($Method){
            $Split = explode('_', $Method);

            $MethodName = 'Action';
            foreach($Split as $Splitted){
                $MethodName.= '_'.ucfirst($Splitted);
            }

            if(method_exists($this, $MethodName)){
                $this->$MethodName();
            } else {
                echo '404';
                die;
            }
        } else {
            $this->Action_Default();
        }
    }

    final public function Action_Default(){
        $this->Registery->Import('Library.Account');

        var_dump($this->Registery->Account);
        echo 'Default Home';
    }
}

如您所见,一旦您进入 Action_Default,您就可以根据 $_GET、$_POST 做任何您想做的事情......

因此,使用此代码:

website.com/home/bob/ 将使用Action_Bob控制器内的函数Home( Home::Action_Bob) ...如果你看到 $_POST 就放在Action_Bob这个里面

public function Action_Bob(){
    if($_POST){
        $this->Action_Bob_Post();
    }
    // continue
}
于 2012-04-27T18:28:48.707 回答