我只对处理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().');
}
}回应评论:
我将只处理其中一个或另一个(得到或张贴),从来没有两个同时。要么通过POST提交HTML表单,要么使用查询字符串进行重定向,这将是一个GET请求。我不熟悉如何提出混合请求(既包括GET,也包括POST),但由于这是一个个人项目,我可以控制它是否发生。
我使用AHttpRequestHandler类(上面),在子类中实现handleGetRequest()和handlePostRequest()方法,即抽象控制器AController。然后,对于我的CMS的每一页,我创建一个AController的子类,例如ImageUpload或ImageDetailsEditor。如果有帮助的话,我可以提供更多的细节。
这里是AController**,** Controller**,和** View 类:
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();发布于 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呢?),所以您可以在控制器级别处理它们,而不需要仅仅为了它而额外的类。
发布于 2011-04-03 09:25:09
发布于 2011-04-07 13:17:02
为请求创建一个抽象类是个好主意,在所有框架中都有。但是我认为由所有控制器来扩展这个类是不好的。一个更好的解决方案是将其分为两个:抽象请求类和基本控制器类。在request类中,您可以使用方法来识别它是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请求,那也是可能的。以上所述当然是不完整的。您需要将更多的方法添加到基类中,这是您的选择。
https://stackoverflow.com/questions/5503248
复制相似问题