2013-02-18 33 views
0

我試圖防止一個方法執行,如果驗證在構造函數失敗。我使用AJAX,並將請求發送到像example/search這樣的網址。我目前正在檢查一個變量是否不是錯誤的,但我認爲有更好的方法去做,不是嗎?CodeIgniter不調用一個方法,如果在構造函數驗證失敗

class Example extends CI_Controller { 

     public $error; 
     function __construct() { 
      parent::__construct(); 
        //validation rules  
      if($this->form_validation->run() == FALSE) { 
       $this->error=1; 
      } 

     } 
     function search() { 
      if(!$this->error) { 
      //code 
      } 
     } 
    } 
+0

的形成要檢查確認在你的構造 – 2013-02-18 13:07:51

+0

簡單的解決方案是移動的run()執行到搜索方法,這取決於如果你靠這個結果各種其他方法。你也可以添加一個靜態屬性來運行方法(包含run的類)來存儲最後的結果,並在設置時返回這個值,但是當數據/規則改變時你也需要重置它。你也可以添加isValid()來封裝這個邏輯......許多方法來解決這個問題。公開$錯誤是相當糟糕的,至少使它保密。 – Mahakala 2013-02-18 13:17:04

+0

還有其他方法,不僅是'search'和表單驗證總是一樣的。 – lam3r4370 2013-02-18 13:20:18

回答

1

應用/配置/ form_validation.php

$config = array(
    'search' => array(
     array('field'=>'', 'label'=>'', 'rules'=>''), 
     array('field'=>'', 'label'=>'', 'rules'=>'') 
    ), 
); 

-

控制器

public function search(){ 

    //is ajax request? 
    if(!$this->input->is_ajax_request()) 
    { 
     return show_error('Bad Request!'); // bye bye, stop execution 
    } 

    $this->output->set_status_header('200'); 

    if(! $this->form_validation->run('search')) 
    { 
     echo json_encode(array(
      'error' => 1, 
      'errors' => array(
       'field' => form_error('field') 
      ) 
    )); 
     return; // bye bye, stop execution 
    } 

    //all good, continue executing 
    //..... 
} 

編輯

//For just a constructor 

protected $isValidated = TRUE; 

public function __construct(){ 

    //check for valid ajax request 
    //do this in parent class(ajax_controller) ? 

    if(!$this->form_validation->run('search')) 
    { 
     $this->isValidated = FALSE; 
     return echo json_encode(array('error' => 1)); 
    } 

    if($isValidated) 
    { 
     $this->_search($this->input->post()); 
    } 
} 

protected function _search($input){} 

-

class Ajax_Controller extends CI_Controller{ 
    public function __construct(){ 
     if(!$this->input->is_ajax_request()) 
     { 
      return show_error('Bad Request!'); 
     } 

     $this->output->set_status_header('200'); 
    } 
} 
+0

它仍然調用該方法。 – lam3r4370 2013-02-18 14:16:00

+0

搜索方法將被調用,無論!從OP代碼中,如果(!$ this-> error) – Philip 2013-02-18 14:22:52

相關問題