Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
开发健壮的PHP回发处理程序_Php_Mysql - Fatal编程技术网

开发健壮的PHP回发处理程序

开发健壮的PHP回发处理程序,php,mysql,Php,Mysql,我正在开发一个基于php的CMS,目前我正在将其重新写入一个可供客户使用的状态。(我的第一个版本只是内部版本;有点混乱:P) 在我的第一个版本中,我有一个名为HandlePostBack()的函数,它检查是否存在大量的$\u POST变量,即每个可能表单中的submit按钮。如果已设置,则将执行相应的命令 我想知道有没有更好的办法?我可以迁移到交换机,查找每个表单中包含的单个$\u POST变量,然后执行该命令。最少的代码就好了,这样我就可以快速轻松地扩展系统。我会尝试以不同的方式进行扩展。 为

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

在我的第一个版本中,我有一个名为HandlePostBack()的函数,它检查是否存在大量的$\u POST变量,即每个可能表单中的submit按钮。如果已设置,则将执行相应的命令


我想知道有没有更好的办法?我可以迁移到交换机,查找每个表单中包含的单个$\u POST变量,然后执行该命令。最少的代码就好了,这样我就可以快速轻松地扩展系统。

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


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

在我看来,您的表单系统可能需要一些修改。为什么不将每个表单表示为一个类,并将
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使用标准格式(如
\u 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();
    }
}

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


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

做这类事情的一种方法是将您的请求路由到类,如果
$\u服务器['REQUEST\u 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();

请看一看将这一想法带到了何处。

隐藏“行动”的一般想法元素非常常见,但您的方法似乎不必要地依赖javascript可用和启用。为什么不使用按钮名称?为什么不使用?如果您喜欢,可以使用它。但我更喜欢为按钮创建onClick处理程序。在复杂的项目中,通常需要在提交之前执行一些额外的任务。但这是我的想法偏好…这正是我想要的。这里还有一些其他感兴趣的想法。
// 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();