开发一个强大的PHP回发处理程序

时间:2009-05-27 16:14:14

标签: php mysql

我正在开发基于php的CMS,我目前正在将其重新编写为可供客户使用的状态。 (我的第一个版本只是内部版本;而且有点混乱:P)

在我的第一个版本中,我有一个名为HandlePostBack()的函数,它检查了大量$ _POST变量的存在 - 每个可能形式的提交按钮。如果已设置,则执行相应的命令。

我想知道是否有更好的方法?我可以迁移到一个开关,并查找每个表单中包含的单个$ _POST变量,然后执行该命令。最少的代码会很好,所以我可以快速,轻松地扩展系统。

4 个答案:

答案 0 :(得分:2)

在我看来,你的表格系统可能会使用一些改造。为什么不将每个表单表示为一个类,并使HandlePostBack函数成为一个方法?然后,您可以检测已提交的表单并进行处理。

class ProfileForm extends Form {
    private $form_items = array(
        new FormItem('name', 'datatype', 'other_parameters'),
        new FormItem('another_name', 'datatype', 'other_parameters'),
        ...
    );

    public function render() {
        ...
    }

    public function handlePostData() {
        ...
    }
}

如果您使用标准格式的提交按钮ID(类似<form_name>_submit),您可以在提交时执行以下操作:

foreach ($_POST as $key => $value) {
    if (substr($key, strlen($key) - 7) == '_submit') {
        $className = ucfirst(substr($key, 0, strlen($key) - 7)) . 'Form';
        $form = new $className();
        $form->handlePostBack();
    }
}

答案 1 :(得分:1)

我会尝试以不同的方式做到这一点。 为什么你的所有帖子都需要一个中心点?这真的是不好的做法。

不要试图改进它,尝试重新思考有一个中心点并摆脱它的整个想法。

答案 2 :(得分:0)

在类似情况下,我通常使用隐藏输入'form_action',因此我可以使用不同的提交按钮来提供不同的操作(例如'添加','编辑','删除'等...)

<input type="submit" onclick="assignAction(this.form, 'myItem_delete');"...>

然后在服务器端我可以用“_”分割动作并使用第一部分作为表单类标识符(即简单的开关或反射......),第二部分说明表单类应该采用什么方法处理回发数据。通用代码就像这样

$handler = explode('_', $_POST['form_action']);
$className = $handler[0]; // not secure, but simple enough for example
if (class_exists($className))
{
   $form = new $className();
   $method = $handler[1]; // again too simple
   if (method_exists($form, $method))
   {
      $form->$method($_POST, $other_params...);
   }
}

当然,这个例子太简单了。但对我来说,这个常见的想法很好。

答案 3 :(得分:0)

执行此类操作的一种方法是将请求路由到类,如果$_SERVER['REQUEST_METHOD'] == 'POST'然后调用该类的post()方法。这意味着表单上的操作将直接映射到某个具有post方法的类。

// routed from URL: /users
class Users implements Resource
{
    public function post() 
    {
        // do your post here
    }

    public function get()
    {
        // do it for GET requests too
    }
}

虽然这与您之前所做的基本相同,但它可以让您更好地组织代码,因为您可以通用方式处理请求:

$resource = $resourceFactory->getResource($url);
$method = strtolower($_SERVER['REQUEST_METHOD']);
$response = $resource->$method(); // eg: $resource->post();
$response->respond();

看看recess framework这个想法有很长的路要走。