首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >评论处理GET和POST请求的抽象类?

评论处理GET和POST请求的抽象类?
EN

Stack Overflow用户
提问于 2011-03-31 16:37:41
回答 3查看 1.5K关注 0票数 3

我只对处理GET或POST请求感兴趣,所以我设计了这个抽象类来确定哪个请求已经发出并随后调用适当的函数。我真的很感谢你对此的反馈。谢谢!

PS我认为这应该是一个社区wiki,但我不知道如何设置它。

代码语言:javascript
运行
复制
abstract class AHttpRequestHandler
{   
    public function handleRequest()
    {
        if($_SERVER['REQUEST_METHOD'] == 'POST') {
            $this->handlePostRequest();
        } else if($_SERVER['REQUEST_METHOD'] == 'GET') {
            $this->handleGetRequest();
        } else {
            $this->handleIllegalRequest();
        }
    }

    abstract protected function handleGetRequest();
    abstract protected function handlePostRequest();

    protected function handleIllegalRequest()
    {
        throw new Exception('Illegal request detected in HttpRequestHandler::handleIllegalRequest().');
    }
}

回应评论:

我将只处理其中一个或另一个(得到或张贴),从来没有两个同时。要么通过POST提交HTML表单,要么使用查询字符串进行重定向,这将是一个GET请求。我不熟悉如何提出混合请求(既包括GET,也包括POST),但由于这是一个个人项目,我可以控制它是否发生。

我使用AHttpRequestHandler类(上面),在子类中实现handleGetRequest()handlePostRequest()方法,即抽象控制器AController。然后,对于我的CMS的每一页,我创建一个AController的子类,例如ImageUploadImageDetailsEditor。如果有帮助的话,我可以提供更多的细节。

这里是AController**,** Controller**,和** View 类:

AController

代码语言:javascript
运行
复制
abstract class AController extends AHttpRequestHandler
{
    protected $view;

    public function __construct()
    {
        $this->handleRequest();
    }

    protected function handleGetRequest()
    {
        throw new Exception('handleGetRequest not yet implemented.');
    }

    protected function handlePostRequest()
    {
        throw new Exception('handlePostRequest not yet implemented.');
    }

    abstract protected function initView();
}

控制器

代码语言:javascript
运行
复制
class Controller extends AController
{
    protected $content;

    public function __construct()
    {
        $this->view = new View();
        parent::__construct();
    }

    protected function handleGetRequest()
    {
        $this->content = 'GET Request';
        $this->initView();
    }

    protected function handlePostRequest()
    {
        $this->content = 'POST Request';
        $this->initView();
    }

    protected function initView()
    {
        $this->view->content = $this->content;
        $this->view->display();
    }
}

视图

代码语言:javascript
运行
复制
//An over-simplified view for example use only
class View
{
    public $content;

    public function display()
    {
        echo "<p>$this->content</p>";
    }
}

实际使用:

代码语言:javascript
运行
复制
require_once 'Controller.php';
$controller = new Controller();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-02 20:30:27

首先,您可以同时提出GET请求和POST请求。假设您发布了一个表单,但是url在查询( get )中有一些变量。

1.我不理解这样一个类的必要性,但您可以做的第一件事是为post创建两个单独的类,并得到扩展AHttpRequestHandler类的类。这样,您只需要在子类中实现一个抽象函数handleRequest。

2.你应使用“意图披露姓名”。您的类应该是RequestHandler,您的方法不应该包含它们中的请求。你从班级名称就知道了。

3.想一想:您可能需要在一个控制器中处理post请求。因此,为了尊重抽象类,每次都必须添加第二个抽象方法。

4.你不应该在班级之间打循环电话(好莱坞原则)。从子类调用handleRequest,然后父类从子类调用handleGetRequest或handlePostRequest。

就像我说的,您是开发人员,您知道每个控制器将使用什么:POST或GET ( COOKIEs呢?),所以您可以在控制器级别处理它们,而不需要仅仅为了它而额外的类。

票数 4
EN

Stack Overflow用户

发布于 2011-04-03 09:25:09

  1. see ref
  2. see ref
  3. see ref
  4. see ref
  5. And控制器应该接收一个请求(命令),而不是扩展请求以将事情分开。没什么可说的,也许是分开关心的。这是上面1.的扩展,但前提是您确实需要一个请求对象.
票数 0
EN

Stack Overflow用户

发布于 2011-04-07 13:17:02

为请求创建一个抽象类是个好主意,在所有框架中都有。但是我认为由所有控制器来扩展这个类是不好的。一个更好的解决方案是将其分为两个:抽象请求类和基本控制器类。在request类中,您可以使用方法来识别它是get请求还是post请求,如

代码语言:javascript
运行
复制
class Request{

public function isPost() {
      return ($_SERVER['REQUEST_METHOD'] == 'POST');
}

    public function isGet() {
      return ($_SERVER['REQUEST_METHOD'] == 'GET');
    }
}

此外,我们还将有至少具有以下选项的基类控制器

代码语言:javascript
运行
复制
class Controller
   {
     public $request;
     public function __construct() {
      $this->setRequest(new Request());
     }

     public function setRequest(Request $request) {
       $this->request = $request;
      }
    }

我们所有的客户控制器将像往常一样扩展基本控制器。这种方法的优点是客户端控制器可以自由地确定请求类型。如果他们想一次使用GET和POST请求,那也是可能的。以上所述当然是不完整的。您需要将更多的方法添加到基类中,这是您的选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5503248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档