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

时间:2011-03-31 16:37:41

标签: php httpwebrequest abstract-class

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

PS我认为这应该是一个社区维基,但我不确定如何设置它。

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),但由于这是一个个人项目,我可以控制它是否发生。

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

以下是AControllerControllerView类:

AController

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

3 个答案:

答案 0 :(得分:4)

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

1.我不了解这样一个课程的必要性,但你要做的第一件事是为post制作两个单独的类,并获得扩展AHttpRequestHandler类。这样你只需要一个抽象函数handleRequest,你将在子类中实现它。

2.您应该申请&#34;意图揭示名称&#34;。您的类应该是RequestHandler,并且您的方法不应包含Request。你知道从班级名称。

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

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

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

答案 1 :(得分:0)

  1. see ref
  2. see ref
  3. see ref
  4. see ref
  5. 并且Controller应该接收请求(命令),而不是扩展请求以保持分离。对此没有任何口号,也许是关注的问题。这是上面1.的扩展,但前提是你真的需要一个请求对象。

答案 2 :(得分:0)

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

class Request{

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

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

此外,我们将有一个基本控制器类,至少包含以下选项

class Controller
   {
     public $request;
     public function __construct() {
      $this->setRequest(new Request());
     }

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

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