我正在开发基于php的CMS,我目前正在将其重新编写为可供客户使用的状态。 (我的第一个版本只是内部版本;而且有点混乱:P)
在我的第一个版本中,我有一个名为HandlePostBack()的函数,它检查了大量$ _POST变量的存在 - 每个可能形式的提交按钮。如果已设置,则执行相应的命令。
我想知道是否有更好的方法?我可以迁移到一个开关,并查找每个表单中包含的单个$ _POST变量,然后执行该命令。最少的代码会很好,所以我可以快速,轻松地扩展系统。
答案 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这个想法有很长的路要走。