Обернуть суперглобалы в классе?
Должен ли я просто назвать их по имени $_GET, $_POST, $_SESSION //etc
, или я должен обернуть их в классе? Например, для POST superglobal, чтобы он возвращал false, если определенный индекс массива не установлен?
Допустим, у меня есть класс Validator. Так что я должен пройти через все поля, как это $_POST['name']
но если он не установлен, он вернет неопределенную ошибку индекса. Но если он вернет ложь, этого не произойдет.
Есть ли какой-либо предпочтительный способ или лучшая практика использования суперглобальных?
2 ответа
Вы можете создать класс Input, который позаботится об этом. Просто заглушка
class Input
{
private $_post;
private $_get;
private $_session;
private $_server;
public function __construct()
{
$this->_post = $_POST;
$this->_get = $_GET;
// and so on
}
public function post($key = null, $default = null)
{
return $this->checkGlobal($this->_post, $key, $default);
}
public function get($key = null, $default = null)
{
return $this->checkGlobal($this->_get, $key, $default);
}
// other accessors
private function checkGlobal($global, $key = null, $default = null)
{
if ($key) {
if (isset($global[$key]) {
return $global[$key];
} else {
return $default ?: null;
}
}
return $global;
}
}
Пример использования:
$input = new Input();
print_r($input->post()); // return all $_POST array
echo $input->post('key'); // return $_POST['key'] if is set, null otherwise
echo $input->post('key', 'default'); // return 'default' if key is not set
Конечно, вам нужно расширить это, но это идея.
Редактировать:
если вы чувствуете себя лучше, вы можете сделать эту часть вашего обработчика запросов:
namespace App;
use App\Input;
class Request
{
private $input;
public function __construct()
{
$this->input = new App\Input();
}
public function post($key = null)
{
return $this->input->post($key);
}
}
Вы можете иметь объект приложения и назначить им суперглобальные
class Request {
public static function GetUrlParameter($key, $default = '') {
return isset ($_GET[$key]) ? $_GET[$key] : $default;
}
}
$app = new Application();
$app->Page = Request::GetUrlParameter('page', 'home');
$app->PostBacks = $_POST;
$app->Render();
Конечно PostBacks быстро и грязно. Вы хотите иметь объект модуля для каждого модуля / формуляра, где вы можете назначить свои PostBacks (например, имя пользователя, пароль), такие как Page, объекту приложения.
Ред. Добавлена часть класса запроса, который я написал для своих нужд, спасибо за комментарий Дэйва.
Поднятый вопрос. Я также заинтересован в альтернативных решениях.