其他分享
首页 > 其他分享> > 批判抽象类来处理GET和POST请求?

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

作者:互联网

我只对处理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