Документация InstantCMS

для администраторов и разработчиков

Инструменты пользователя

Инструменты сайта


dev:controllers:request

Обработка запросов

Виды запросов

Контроллер компонента может получать данных из запросов различных видов:

  • URL - site.ru/component/action/param1/param2
  • GET - site.ru/component/action?param1=value1&param2=value2
  • POST - отправка формы пользователем
  • AJAX - асинхронный GET или POST
  • внутренний - запрос из другого контроллера

Обработка первого вида запросов осуществляется через передачу аргументов экшенам и рассмотрена в соответствующем разделе.

Объект request

Для обработки GET, POST и внутренних запросов внутри контроллера используется объект

$this->request

Этот объект создается автоматически при запуске контроллера и доступен из любых его методов, а так же из экшенов расположенных в отдельных файлах.

С помощью этого объекта контроллер может определять тип запроса и читать переданные данные.

Объект является экземпляром класса cmsRequest, определение которого находится в файле /system/core/request.php. В этом файле можно ознакомиться с полным списком доступных методов объекта.

Обращаем ваше внимание, что в зависимости от контекста вызова контроллера, в объекте $this→request может не быть данных, переданных в GET или POST. Гарантировано данные запроса страницы ($_REQUEST) всегда хранятся в объекте ядра движка. Получить к ним доступ можно так:

в любом месте кода движка

cmsCore::getInstance()->request

в контроллере:

$this->cms_core->request

Определение типа запроса

Для определения типа запроса предусмотрены методы:

  • isStandard() - Стандартный запрос через URL, методом GET или POST
  • isAjax() - AJAX-запрос, методом GET или POST
  • isInternal() - Внутренний запрос из другого компонента

Примеры использования:

if ( $this->request->isStandard() ){
    // Стандартный запрос через URL, методом GET или POST
}
if ( $this->request->isAjax() ){
    // AJAX-запрос, методом GET или POST
}
if ( $this->request->isInternal() ){
    // Внутренний запрос из другого компонента
}

Проверка наличия данных

Проверить наличие нужных данных в запросе можно с помощью методов has($var) и hasInQuery($var).

Первый проверяет наличие переменной в запросе независимо от способа ее передачи, второй - только среди переменных переданных методом GET.

Получение данных

Получить значение переменной из запроса можно с помощью метода get($var[, $default[, $var_type]]). Первый аргумент - название переменной, второй (не обязательный) значение по-умолчанию, которое вернется если переменной в запросе не окажется. Если $default не указан, возвращается false. Третий аргумент (не обязательный) это тип переменной, к которому приведется возвращаемое значение. Стоит отметить, что если третий аргумент не задан, то тип переменной определяется по типу переменной значения по умолчанию. Если же и значение по умолчанию не задано, то возвращаемая переменная не типизируется. Старайтесь всегда, либо задавать значение по умолчанию с нужным типом, либо задавать непосредственно тип.

Пример проверки и получения переменной:

if ($this->request->has('myvar')){
    $var = $this->request->get('myvar');
}      

Пример получения переменной со значением по-умолчанию:

$name = $this->request->get('name', 'Vasiliy');

Обратите внимание, что тип переменной значения по умолчанию string, поэтому и возвращаемое значение $name будет иметь такой же тип.

Пример получения переменной заданием типа:

$page = $this->request->get('page', false, 'integer');

В переменной $page всегда будет число. Или тоже самое можно записать по другому:

$page = $this->request->get('page', 0);

Значение по умолчанию имеет тип integer, следовательно и возвращаемое значение будет иметь этот же тип.

Получить все входящие данные одним запросом можно при помощи метода getAll():

$request_array = $this->request->getAll();

Обратите внимание! При получении всех данных значения не типизируются.

Проверка полученных данных

При получении данных из форм движок автоматически проводит всю необходимую валидацию согласно настроек полей. Если вы получаете данные напрямую (как описано выше), то их необходимо проверять согласно правил валидации. По умолчанию все методы проверки данных реализованы в классе основного (базового) класса контроллеров, файл которого находится по пути /system/core/controller.php. Имена таких методов (функций) начинаются на validate_, например validate_email, validate_alphanumeric, validate_required. Например, у нас есть некий контроллер, в нем нам нужно получить из запроса некий email.

class mycontroller extends cmsFrontend {
 
	public function actionIndex(){
 
            $email = $this->request->get('email', ''); 
            // если не передан email, то в переменной $email будет
            // пустая строка, переменная $email будет типа string
            if(!$email){
                // тут выполняем действия, если переменная пустая
                // например, редиректим назад или показываем 404 страницу
            }
            // теперь проверяем, email ли мы получили
            // тут уже предполагается, что переменная не пустая, имеет тип string
            // и с ней мы можем проводить любые строковые операции
            if($this->validate_email($email) !== true){
                // переменная проверку не прошла
                // выполняем нужные действия на этот случай
                // обратите внимание на тройной знак "равно" - 
                // это строгое сравнение
            }
 
        }
 
}

В своем контроллере вы можете реализовать свои методы проверки по аналогии с существующими. Возвращать такие методы должны строго true в случае успешной проверки и текст ошибки, если проверка не пройдена.


Вернуться к оглавлению

dev/controllers/request.txt · Последнее изменение: 02.05.2016 19:13 — fuze