Фильтрация ввода URL в Zend Framework

Каков наилучший способ фильтрации ввода URL ($_GET контейнер) в Zend Framework?

Вот моя текущая реализация: у меня есть BookController с indexAction это занимает page, order а также dir параметр. Сначала я выбираю эти параметры и указываю их значения по умолчанию _getParam(),

Для каждого из этих параметров я создаю метод в своем слое Service, который проверяет и фильтрует конкретный параметр. Если вход действителен, его отфильтрованное значение возвращается, в противном случае он возвращает FALSE.

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

class BookController extends Zend_Controller_Action
{
    public function indexAction()
    {
        // Fetch params and define default values
        $page   = $this->getParam('page', 1);
        $order  = $this->getParam('order', 'id');
        $dir    = $this->getParam('dir', 'asc');

        // Instantiate service layer and validate individual parameters
        $service = new Service_Book;
        $page   = $bookService->validatePageFromUrl($page);
        $order  = $bookService->validateOrderFromUrl($order);
        $dir    = $bookService->validateDirFromUrl($dir);

        if ($page && $order && $dir)
        {
            // We're okay
        }
        else
        {
            // Redirect
        }
    }
}

На уровне сервиса

class Service_Book
{
    public function validatePageFromUrl($page)
    {
        $filters = array(
            'page' => array(
                'HtmlEntities',
                'StripTags',
                'StringTrim'
                )
            );

        $validators = array(
            'page' => array(
                'int'
                )
            );

        $data['page'] = $page;

        $input = new Zend_Filter_Input($filters, $validators, $data);

        if ($input->isValid())
        {
            return $input->page;
        }
        else
        {
            return FALSE;
        }
    }

    public function validateOrderFromUrl($order)
    {
        $filters = array(
            'order' => array(
                'HtmlEntities',
                'StripTags',
                'StringTrim'
                )
            );

        $validators = array(
            'order' => array(
                array('InArray', 'haystack'  => $this->getColumnNames())
            )
        );

        $data['order'] = $order;

        $input = new Zend_Filter_Input($filters, $validators, $data);

        if ($input->isValid())
        {
            return $input->order;
        }
        else
        {
            return FALSE;
        }
    }

    public function validateDirFromUrl($dir)
    {
        $filters = array(
            'dir' => array(
                'HtmlEntities',
                'StripTags',
                'StringTrim'
                )
            );

        $validators = array(
            'dir' => array(
                array('InArray', 'haystack'  => array('asc', 'desc'))
            )
        );

        $data['dir'] = $dir;

        $input = new Zend_Filter_Input($filters, $validators, $data);

        if ($input->isValid())
        {
            return $input->dir;
        }
        else
        {
            return FALSE;
        }
    }
}

1 ответ

Решение

Я думаю что page всегда int значение. Так что вы можете использовать Zend_Filter_Int, За order Я хочу использовать InArray тоже. Ваш код немного сложен.

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