A free and open-source book on ZF3 for beginners


9.8. Использование фильтров и валидаторов вне форм

В этом разделе мы приведем пример того, как можно использовать фильтры и/или валидаторы в контроллере для преобразования и проверки данных, извлеченных из переменных 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` для конвертации даты в правильный формат.


Top