在Zend Framework中过滤URL输入($_GET
容器)的最佳方法是什么?
以下是我目前的实施情况:我的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;
}
}
}
答案 0 :(得分:0)
我认为page
始终是int值。所以你可以使用Zend_Filter_Int
。对于order
,我也想使用InArray
。你的代码有点难。