В этом разделе мы приведем пример того, как можно использовать фильтры и/или валидаторы в контроллере для преобразования и проверки данных, извлеченных из переменных GET и/или POST.
Предположим, мы реализуем систему платежного шлюза, и нам нужно создать веб-страницу,
отображающую историю платежей с заданной кредитной карты для заданной даты. Эта страница
может обрабатываться действием paymentHistoryAction()
класса контроллера, а номер
кредитной карты и дата будут извлечены из GET-переменных. Для метода paymentHistoryAction()
нам нужно реализовать несколько проверок безопасности:
Ниже приведен код метода действия:
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Filter\StaticFilter;
use Zend\Validator\StaticValidator;
class IndexController extends AbstractActionController
{
// Действие, показывающие историю операций по кредитной
// карте на определенную дату.
public function paymentHistoryAction()
{
// Получаем параметры от GET.
$cardNumber = (string)$this->params()->fromQuery('card', '');
$date = (string)$this->params()->fromQuery('date', date("Y-m-d"));
// Валидируем номер кредитной карты.
$isCardNumberValid = StaticValidator::execute($cardNumber, 'CreditCard');
if(!$isCardNumberValid) {
throw new \Exception('Not a credit card number.');
}
// Конвертируем дату в правильный формат.
$date = StaticFilter::execute($date, 'DateTimeFormatter',
['format'=>'Y-m-d']);
// Остальной код действия...
return new ViewModel();
}
}
Внутри метода действия мы используем плагин контроллера params()
(строки 16-17), чтобы
извлечь две переменные из суперглобального массива $_GET
: переменную card
(номер кредитной
карты) и переменную date
(дату).
В строке 20 мы валидируем номер кредитной карты с помощью валидатора CreditCard
.
Если номер карты недопустим, мы выбрасываем исключение, указывающее на ошибку (строка 22).
В строке 26 мы используем фильтр DateTimeFormatter` для конвертации даты в правильный формат.