ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

批判抽象类来处理GET和POST请求?

2019-11-02 19:29:06  阅读:245  来源: 互联网

标签:abstract-class httpwebrequest php


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

PS:我认为这应该是社区Wiki,但是我不确定如何设置它.

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

回应评论:

我只会处理其中一个(GET或POST),永远不会同时处理.
HTML表单将通过POST提交,或者使用查询字符串(即GET请求)进行重定向.我不熟悉如何发出混合请求(GET和POST),但是由于这是一个个人项目,因此我可以控制它是否发生.

我通过在子类(抽象控制器AController)中实现handleGetRequest()和handlePostRequest()方法来使用AHttpRequestHandler类(上述).然后,对于CMS的每一页,我创建AController的子类,例如ImageUpload或ImageDetailsEditor.如果有帮助,我可以提供更多详细信息.

这是AController,Controller和View类:

控制器

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();
}

控制者

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();
    }
}

视图

//An over-simplified view for example use only
class View
{
    public $content;

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

实际使用:

require_once 'Controller.php';
$controller = new Controller();

解决方法:

首先,您可以同时发出GET请求和POST请求.想想您发布的表单,但该URL在查询中有一些变量(get).

1.我不了解是否需要这样的类,但是您可以做的第一件事是为post创建两个单独的类,并获取它们以扩展AHttpRequestHandler类.这样,您只需要将在子类中实现的抽象函数handleRequest.

2.您应使用“意图显示名称”.您的类应该是RequestHandler,并且您的方法中不应包含Request.您从类名知道这一点.

3.对此进行思考:您可能需要在一个控制器中处理发布请求.因此,您每次都必须添加第二个抽象方法,以尊重抽象类.

4.您不应在课程之间进行循环通话(好莱坞原则).从子类中调用handleRequest,然后父类从子类中调用handleGetRequest或handlePostRequest.

就像我说的那样,您是开发人员,您知道每个控制器将使用什么:POST或GET(COOKIEs呢?),因此您可以在控制器级别处理它们,而不必为此额外添加类.

标签:abstract-class,httpwebrequest,php
来源: https://codeday.me/bug/20191102/1993954.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有