En esta sección daremos un ejemplo de como podemos usar filtros y validadores en nuestro controlador para transformar y revisar los datos extraídos de las variables GET y POST.
Supongamos que implementamos un sistema de intermediación de pagos y necesitamos
crear una página web que muestre el historial de pago de una tarjeta de crédito
en una determinada fecha. Esta página se puede gestionar por medio una acción
paymentHistoryAction()
de una clase controladora, el número de tarjeta de crédito
y la fecha se extraen de las variables GET. En el método paymentHistoryAction()
necesitamos implementar algunas revisiones de seguridad:
Abajo, podemos encontrar el código del método de acción:
<?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
{
// An action which shows the history of a credit
// card operations on certain date.
public function paymentHistoryAction()
{
// Get parameters from GET.
$cardNumber = (string)$this->params()->fromQuery('card', '');
$date = (string)$this->params()->fromQuery('date', date("Y-m-d"));
// Validate credit card number.
$isCardNumberValid = StaticValidator::execute($cardNumber, 'CreditCard');
if(!$isCardNumberValid) {
throw new \Exception('Not a credit card number.');
}
// Convert date to the right format.
$date = StaticFilter::execute($date, 'DateTimeFormatter',
['format'=>'Y-m-d']);
// The rest of action code goes here...
return new ViewModel();
}
}
Dentro del método de acción, usamos el complemento para controladores params()
(líneas 16-17) para capturar dos variables del arreglo super-global $_GET
: la
variable card
(número de tarjeta de crédito) y la variable date
(la fecha).
En la línea 20, validamos el número de tarjeta de crédito con la ayuda del validador
CreditCard
. Si el número de tarjeta no es aceptable, lanzaremos una excepción
indicando un error (línea 22).
En la línea 26, usamos el filtro DateTimeFormatter
para convertir la fecha al
formato correcto.