2011-09-27 76 views
0

我剛開始使用MVC框架,特別是Codeigniter,我在維護我的代碼和放置函數(控制器或模型)的位置時遇到了一些麻煩。Codeigniter註冊控制器代碼審查

現在我建立一個註冊制度,我有名字signup.php控制器

這是我的代碼:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

Class Signup extends CI_Controller { 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function index() 
    { 
     $this->form_validation->set_rules('username', 'Username', 'trim|required|callback_check_valid_username|min_length[6]|max_length[20]|xss_clean'); 
     $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email'); 
     $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[6]|max_length[32]'); 

     if ($this->form_validation->run() == false){ 
      $this->load->view("register/index"); 
     }else{ 
      $this->submitRegistration(); 
     } 
    } 

    public function ajaxup(){ 
     if ($this->input->isAjaxRequest()){ 
      header('Content-type: application/json'); 

      $error = false; 
      $message = ''; 

      $this->form_validation->set_rules('username', 'Username', 'trim|required|callback_check_valid_username|min_length[6]|max_length[20]|xss_clean'); 
      $this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email'); 
      $this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[6]|max_length[32]'); 

      if ($this->form_validation->run() == false){ 
       $message = validation_errors(); 
       $error = true; 
      }else{ 
       $this->_submitRegistration(); 
       $message = 'Successfully registered.'; 
      } 

      $return = array(
       'error' => $error, 
       'message' => $message 
      ); 

      $return = json_encode($return); 

      echo $return; 

     } 
    } 

    public function _submitRegistration(){ 
     $username = $this->input->post('username'); 
     $email = $this->input->post('email'); 
     $password = $this->input->post('password'); 

     $data = array(
      'username' => $username, 
      'email' => $email, 
      'password' => $password 
     ); 

     $this->load->model('users_model'); 

     $this->users_model->register_user($data); 
    } 

    public function check_valid_username($username){ 

     $this->load->model('users_model'); 

     if (!$this->users_model->is_valid_username($username)){ 
      $this->form_validation->set_message('check_valid_username', 'The %s field should contain only letters, numbers or periods'); 
      return false; 
     } 

     return true; 

    } 

} 

有什麼我可以寫更好地維護我的代碼並且可讀?

* 注意: *當用戶單擊按鈕並執行ajax調用時,將使用函數ajaxup。

謝謝

回答

3

看起來相當不錯。這裏有一些想法/建議,爲今後的改進:

  • index()您呼叫$this->submitRegistration()但我想你想被調用$this->_submitRegistration()

  • 由於您在index()ajaxup()方法中都使用相同的驗證規則,因此可以將它們拉出到數組中,並將它們作爲控制器的屬性或放入配置文件中。

有關文檔,請參閱herehere

$validation_rules = array(
    array(
     'field' => 'username', 
     'label' => 'Username', 
     'rules' => 'trim|required|callback_check_valid_username|min_length[6]|max_length[20]|xss_clean' 
    ), 
    array(
     'field' => 'email', 
     'label' => 'Email', 
     'rules' => 'trim|required|valid_email' 
    ), 
    array(
     'field' => 'password', 
     'label' => 'Password', 
     'rules' => 'trim|required|min_length[6]|max_length[32]' 
    ), 
); 

然後在你的方法,你會做類似的東西$this->form_validation->set_rules($validation_rules)

  • 考慮重新排序您的驗證規則。例如,讓我們來看看用戶名字段的規則。如果check_valid_username()正在調用數據庫(通過用戶模型),那麼以前驗證長度要求可能會更好。如果我們可以確定用戶名是否無效,那麼對數據庫進行昂貴的調用是沒有用的。

  • 使您的回調方法保密。目前check_valid_username()是一種公共方法,可能通過URL訪問。用下劃線前綴(_check_valid_username()),然後在驗證規則中使用callback__check_valid_username。請注意兩個下劃線。

  • 如果您發現自己需要在多個控制器中使用check_valid_username(),則可以擴展本機表單驗證庫並將其放在那裏。

+0

感謝您的建議! – fxuser