2010-11-04 17 views
13

Tôi đã mã hóa với CodeIgniter một lúc và khi tôi lập trình hoặc đọc mã của lập trình viên khác, tôi thường gặp hai cách để lấy dữ liệu từ đầu vào. Người ta sẽ nhận được đầu vào từ bộ điều khiển, sau đó đi qua với mô hình như một tham số, như vậy:

class MyController extends Controller 
{ 
    . 
    . 
    . 
    public function login() 
    { 
     $username = $this->input->post('username'); 
     $password = $this->input->post('password'); 
     $this->load->model('User'); 
     $this->User->login($username, $password); 
    } 
} 

class User extends Model 
{ 
    . 
    . 
    . 
    public function login($username, password) 
    { 
     .... 
    } 
} 

khác sẽ được truy cập trực tiếp từ Model các thông số đầu vào, như vậy:

class MyController extends Controller 
{ 
    . 
    . 
    . 
    public function login() 
    { 
     $this->load->model('User'); 
     $this->User->login(); 
    } 
} 

class User extends Model 
{ 
    . 
    . 
    . 
    public function login() 
    { 
     $username = $this->input->post('username'); 
     $password = $this->input->post('password'); 
    } 
} 

Bạn nghĩ thực hành nào tốt hơn? Tôi nghiêng về phía trước, vì nó mang lại cho Mô hình độc lập hơn, nhưng tôi thấy phương pháp thứ hai trong sample codes và trong các nhà phát triển khác. Phải thừa nhận rằng, phương pháp thứ hai ngắn hơn, đặc biệt là khi bạn chấp nhận 5-10 trường nhập.

+0

Mặc dù CodeIgniter không phải là khung MVC thực, bạn không nên truy cập phần tử xem hoặc bộ điều khiển trong mô hình (giống như trong khung MVC thực). –

Trả lời

1

Tôi thích cái đầu tiên và thoát khỏi quá trình xác nhận và chuẩn hóa dữ liệu trong bộ điều khiển.

+1

Tôi không đồng ý về xác thực. IMO, bộ điều khiển nên càng mỏng càng tốt, và thông thường, trong mã của tôi, điều đó có nghĩa là chuyển các giá trị đầu vào trực tiếp đến mô hình, nơi nó có thể trả về một cái gì đó như 'mảng ('thành công' => bool, 'lỗi' => 'lỗi ',' result '=> array (...)) 'mà tôi có thể chuyển trực tiếp đến các khung nhìn hoặc quay lại javascript. – treeface

12

Bằng cách sử dụng mẫu đầu tiên, bạn cho phép các nhà phát triển khác thay đổi chế độ xem và sửa đổi bộ điều khiển, nhưng vẫn duy trì Mô hình 'như cũ'. Đó phải là một ví dụ về tái cấu trúc tốt.

Bằng cách chọn mẫu thứ hai, bạn khóa sự phát triển của mình trong chế độ xem, vì tên đầu vào bị khóa bởi mô hình và bạn nên thay đổi mô hình càng ít càng tốt.

Nói cách khác ...
mẫu đầu tiên: linh hoạt
mẫu thứ hai: 'd * mnit, không phải lần nữa!'

+0

Trong khi tôi đồng ý với bạn về tinh thần, phiên bản thứ hai vẫn khóa các trường nhập vào mô hình bằng cách thông số. Cách duy nhất để tránh điều này là chuyển một tham số duy nhất vào mô hình là một mảng dữ liệu có thể được sử dụng để tự động cấu trúc truy vấn. Tuy nhiên, tôi thích làm điều đó với nhiều tham số nếu không có gì khác ngoài khả năng đọc. – treeface

+0

Nhưng có thể một mảng dữ liệu dễ đọc hơn nhiều tham số không? Đặc biệt khi một mảng có khóa, ví dụ: my_function (mảng ("login" => $ input1, "username" => $ input2, "password" => $ input3)) hơn my_function ($ input1, $ input2, $ input3)? –

+1

Tôi không thể nói rằng tôi không thích ý tưởng truyền một mảng làm đối số, nhưng nếu nó chỉ có hai tham số mà các phương thức mô hình cần và chúng được yêu cầu, tôi không thấy lý do tại sao tôi không nên chuyển chúng thành hai tham số thay vì một mảng. Tuy nhiên, nếu một số cấu hình có thể, nhưng không cần phải thay đổi, một mảng sẽ là ý tưởng tuyệt vời. – Repox

0

Tôi đã luôn sử dụng cái đầu tiên. Tôi cũng làm tất cả các công việc trong bộ điều khiển của tôi và để mô hình cho tương tác DB. Tôi không nghĩ rằng có câu trả lời dứt khoát mặc dù. Sử dụng những gì phù hợp với công việc.

4

Tôi biết điều đó có thể gây tranh cãi, nhưng đây có thể là lời giải thích đơn giản về những gì CodeIgniter MVC thực sự là.

Models - cơ sở dữ liệu truy cập (CRUD)

Controller - thực hiện logic, gọi thư viện và những người giúp đỡ, và vượt qua để xem

Lần - những gì người dùng thấy

Libraries - các chức năng sử dụng mô hình

Helpers - chức năng mà không đòi hỏi sử dụng các mô hình

Bạn không muốn thêm đăng nhập() bên trong một mô hình HOẶC điều khiển, tôi sẽ tạo ra một thư viện để xử lý đăng nhập() chức năng gọi trực tiếp đến mô hình.

Bộ điều khiển sau đó sử dụng thư viện, chuyển các biến số $ this-> input-> post và sau đó hiển thị các chế độ xem tương ứng.

Thông tin thêm có thể được tìm thấy ở đây: CodeIgniter MVCCodeIgniter library

4

Một hơi muộn, nhưng để duy trì một mô hình sạch (càng nhiều càng tốt) biến thiết lập trong mô hình của bạn, và vượt qua các đối số cho nó theo yêu cầu. ví dụ:

class MyController extends Controller 
{ 
    public function login() 
    { 
     $this->load->model('User'); 

     //Set your model's variables, before executing the model function 
     $this->User->username = $this->input->post('username'); 
     $this->User->pass = $this->input->post('pass'); 

     $this->User->login(); 

    } 
} 


class User extends Model 
{ 

    var $username; 
    var $pass; 

    public function login() 
    { 
     $this->db->where('username', $this->username); 
     $this->db->where('pass', $this->pass); 
     etc... 
    } 

} 
Các vấn đề liên quan