2012-11-26 9 views
2

Zend Framework에서 URL 입력 ($_GET 컨테이너)을 필터링하는 가장 좋은 방법은 무엇입니까?Zend Framework의 URL 입력 필터링

여기에 내 현재의 구현이다 : 나는 page, orderdir 매개 변수를 취하는 indexActionBookController 있습니다. 먼저이 매개 변수를 가져 와서 기본값을 _getParam()으로 지정합니다.

각 매개 변수에 대해 특정 매개 변수의 유효성을 검사하고 필터링하는 메서드를 내 서비스 계층에 만듭니다. 입력이 유효한 경우 필터링 된 값이 반환되고, 그렇지 않으면 FALSE가 반환됩니다. 컨트롤러에서

: 서비스 층

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

내가 page 항상 INT 값이라고 생각에서

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 
     } 
    } 
} 

. 따라서 Zend_Filter_Int을 사용할 수 있습니다. order의 경우 InArray도 사용하고 싶습니다. 귀하의 코드는 조금 어렵습니다.

+0

"귀하의 코드는 조금 어렵습니다"는 의미는 무엇입니까? –