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