代码之家  ›  专栏  ›  技术社区  ›  EvilChookie

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

  •  1
  • EvilChookie  · 技术社区  · 16 年前

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

    在我的第一个版本中,我有一个名为handlePostback()的函数,它检查了大量$_post变量的存在性——每个可能表单中的提交按钮。如果已设置,则将执行相应的命令。

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

    4 回复  |  直到 16 年前
        1
  •  2
  •   Samir Talwar PruthviRaj Reddy    16 年前

    在我看来,你的表单系统可能需要一些修改。为什么不把每种形式表示为一个类,并使 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();
        }
    }
    
        2
  •  1
  •   Marius Burz    16 年前

    我会尝试用不同的方法。 为什么你所有的职位都需要一个中心点?这真是糟糕的做法。

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

        3
  •  0
  •   Jet    16 年前

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

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

    然后在服务器端,我可以通过“uu”拆分操作,并使用1-st部分作为表单类标识符(即,对于简单的切换或反射…),第二部分说明了表单类的哪些方法应该处理回发数据。在普通代码中是这样的

    $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...);
       }
    }
    

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

        4
  •  0
  •   rojoca    16 年前

    一种方法是将请求路由到类,如果 $_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 这需要很长的时间。

    推荐文章