Фильтрация ввода 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
тоже. Ваш код немного сложен.