2012-07-17 24 views
0

我已經使用codeIgniter 5個月了,我想改進我寫代碼的方式。下面是從控制器,用於用戶的方法:如何在codeigniter中執行mvc

function create_user(){ 

     $user_data = array(
      'username' => 'Username', 'firstname' => 'Firstname', 
      'middlename' => 'Middlename', 'lastname' => 'Lastname', 
      'password' => 'Password', 'department' => 'Department', 
      'role' => 'Role' 
     ); 

     foreach ($user_data as $key => $value) { 
      $this->form_validation->set_rules($key, $value, 'required|trim'); 
     } 

     if ($this->form_validation->run() == FALSE) { 
      $departments = $this->user_model->list_departments(); 
      $it_roles = $this->user_model->list_roles(1); 
      $tc_roles = $this->user_model->list_roles(2); 
      $assessor_roles = $this->user_model->list_roles(3); 

      $data['data'] = array('departments' => $departments, 'it_roles' => $it_roles, 'tc_roles' => $tc_roles, 'assessor_roles' => $assessor_roles); 

      $data['content'] = 'admin/create_user'; 

      parent::error_alert(); 
      $this->load->view($this->_at, $data); 

     } else { 
      $username = $this->input->post('username'); 
      $salt = $this->bcrypt->getSalt(); 
      $hashed_password = $this->bcrypt->hash($this->input->post('password'), $salt); 
      $fname = $this->input->post('firstname'); 
      $mname = $this->input->post('middlename'); 
      $lname = $this->input->post('lastname'); 
      $department = $this->input->post('department'); 
      $role = $this->input->post('role'); 

      $user_login  = array($username, $hashed_password, $salt); 
      $user_profile = array($fname, $mname, $lname); 
      $this->user_model->register_user($user_login, $user_profile, $department, $role); 

      $data['content'] = 'admin/view_user'; 

      parent::success_alert(4, 'User Sucessfully Registered!', 'You may now login using your account'); 


      $data['data'] = array('username' => $username, 'fname' => $fname, 'mname' => $mname, 'lname' => $lname, 'department' => $department, 'role' => $role); 
      $this->load->view($this->_at, $data); 
     } 

    } 

我基本上補習班在獲取輸入,輸入驗證,渲染視圖中的錯誤或成功,和其他的東西在一個單一的控制器。這樣做有什麼更好的方式,你如何建議我分解這個功能。有人說我應該在視圖和控制器之間添加一個路由器/調度器來處理POST,GET,COOKIESESSION但我不知道該怎麼做。

任何代碼示例,建議,這將有助於我掌握正確的做事方式將被接受爲答案。

+1

問題的根源在於CodeIgniter並未真正實現MVC。 CI中的* view *只是一個愚蠢的模板,它強制顯示邏輯進入「控制器」。他們稱之爲* model *的主要是一個ORM,它將部分域業務邏輯強制爲「控制器」。而最重要的是,他們將授權作爲控制器的另一個責任。一團糟。 – 2012-07-17 15:56:33

回答

1

我做了一些細微的變化: 不設置不必要的變量,分組的用戶數據在陣列等。這只是我會做到這一點。除此之外,你會很好,我會說。

<?php 
function create_user() 
{ 
    $user_data = array ('username' => 'Username', 'firstname' => 'Firstname', 'middlename' => 'Middlename', 'lastname' => 'Lastname', 'password' => 'Password', 'department' => 'Department', 'role' => 'Role'); 

    foreach ($user_data as $key => $value) { 
     $this->form_validation->set_rules($key, $value, 'required|trim'); 
    } 

    if ($this->form_validation->run() == FALSE) 
    { 

     $data['data'] = array( 'departments' => $this->user_model->list_departments(), 
           'it_roles'  => $this->user_model->list_roles(1), 
           'tc_roles'  => $this->user_model->list_roles(2), 
           'assessor_roles'=> this->user_model->list_roles(3) 
         ); 

     $data['content'] = 'admin/create_user'; 

     parent::error_alert(); 
     $this->load->view($this->_at, $data); 

    } 
    else 
    { 
     $salt = $this->bcrypt->getSalt(); 

     $user['username']  = $this->input->post('username'); 
     $user['hashed_password']= $this->bcrypt->hash($this->input->post('password'), $salt); 
     $user['fname']   = $this->input->post('firstname'); 
     $user['mname']   = $this->input->post('middlename'); 
     $user['lname']   = $this->input->post('lastname'); 
     $user['department']  = $this->input->post('department'); 
     $user['role']   = $this->input->post('role'); 

     $user_login  = array($user['username'], $user['hashed_password'], $salt); 
     $user_profile = array($user['fname'], $user['mname'], $user['lname']); 
     $this->user_model->register_user($user_login, $user_profile, $department, $role); 

     $data['content'] = 'admin/view_user'; 

     parent::success_alert(4, 'User Sucessfully Registered!', 'You may now login using your account'); 

     unset($user['hashed_password']); // Just to be sure 
     $this->load->view($this->_at, $user); 
    } 

} 
+0

這是一種完全正常的做事方式嗎?我想我可能會用一種方法來彌補一大堆。 – 2012-07-17 14:17:11

+0

是的,是的。我知道它可能看起來很多,但想象一下,如果你的表單中只有2個字段。這似乎不是那麼大,是嗎?現在想象100(是的,有100多個字段的字段)。您實際上通過自動化表單驗證規則「保存」了一些行,否則可以將它們存儲在配置文件中(http://codeigniter.com/user_guide/libraries/form_validation.html#savingtoconfig) – Robert 2012-07-17 14:22:02

2

您還希望在POST請求後使用重定向,這樣您就不會得到duplicate submits

function create_user() { 

    $params = $this->input->post(); 

    if(!$this->user_model->valid_user_params($params, $errors)) 
    { 
     //Place errors in flash data 
     //redirect and exit 
    } 

    if(!$this->user_model->register_user($params, $errors)) 
    { 
     //Place errors in flash data 
     //redirect and exit 
    } 

    //redirect and exit 

} 

function created_user() { 
    //read flash data 
    //show some views with the errors or success message 
}