在Zend Framework中过滤URL输入

时间:2012-11-26 15:53:19

标签: zend-framework zend-filter

在Zend Framework中过滤URL输入($_GET容器)的最佳方法是什么?

以下是我目前的实施情况:我的BookController indexAction带有pageorderdir参数。首先,我获取这些参数并使用_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 个答案:

答案 0 :(得分:0)

我认为page始终是int值。所以你可以使用Zend_Filter_Int。对于order,我也想使用InArray。你的代码有点难。