Меня интересует только обработка запросов 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
, например 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();
}
}
View
//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();