Обернуть суперглобалы в классе?

Должен ли я просто назвать их по имени $_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, объекту приложения.

Ред. Добавлена ​​часть класса запроса, который я написал для своих нужд, спасибо за комментарий Дэйва.

Поднятый вопрос. Я также заинтересован в альтернативных решениях.

Другие вопросы по тегам