2009-07-19 32 views
14

Tôi đang sử dụng đoạn mã sau để khởi tạo một mô hình từ bên trong bộ điều khiển của tôi:PHP & Codeigniter - cách chuyển tham số cho mô hình?

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

Có thể sửa đổi dòng trên bằng cách nào đó để các nhà xây dựng mô hình recieves một tham số? Tôi muốn sử dụng mã sau trong hàm tạo mô hình:

function __construct($param_var) { 
    parent::Model(); 

    $this->$param_var = $param_var; //I'm not even sure this works in PHP..but different issue 
} 

Điều này sẽ rất hữu ích để tôi có thể sử dụng lại các lớp mô hình của mình. Cảm ơn.

UPDATE: (từ một trong những câu trả lời, câu hỏi ban đầu của tôi được giải quyết..thanks!) Chỉ cần giải thích tại sao tôi muốn làm điều này: ý tưởng là để có thể tái sử dụng một lớp mô hình. Vì vậy, về cơ bản để đưa ra một ví dụ đơn giản, tôi muốn có thể chuyển biến "order_by" cho lớp mô hình để tôi có thể sử dụng lại logic trong lớp mô hình (và tự động thay đổi giá trị theo thứ tự trong sql) mà không cần để tạo một lớp riêng biệt hoặc một hàm riêng biệt.

Thiết kế này có kém không? Nếu vậy, bạn có thể giải thích tại sao bạn sẽ không làm điều gì đó như thế này và thay vào đó bạn sẽ làm như thế nào?

+0

Tôi tò mò tại sao bạn lại muốn vượt qua một tham số để constructor của mẫu của bạn. Tôi đoán là bạn cần một thư viện thay vì một mô hình. – Randell

+1

tôi vừa cập nhật câu hỏi của tôi với một lời giải thích là tại sao tôi sẽ làm điều này – oym

Trả lời

3

Tôi thấy lý do của bạn cho việc này, nhưng tôi có thể đề xuất xem xét Object-Relational Mapping cho nhu cầu cơ sở dữ liệu của bạn. Có một thư viện ORM do người dùng tạo cho CodeIgniter được gọi là DataMapper mà tôi đã sử dụng gần đây. Bạn có thể sử dụng các bảng trong bộ điều khiển của mình làm đối tượng và có thể phù hợp hơn với vấn đề của bạn.

+0

nhờ tham khảo, nhưng tôi nghĩ rằng điều này có thể là quá mức cần thiết ... Tôi biết tôi đã không đưa ra nhiều mô tả ứng dụng của tôi, nhưng khi nào bạn nên sử dụng thư viện ORM này? Ứng dụng sẽ không phải là rất nhiều dữ liệu (về truy cập db) để cảnh báo điều này? – oym

+0

Trong một cách có, tôi thích sử dụng nó vì nó dẫn đến ít mã hơn nếu ứng dụng của bạn có phần dữ liệu chuyên sâu, nhưng trừ khi db của bạn thực sự nhỏ, nó có thể hơi quá mức. – Domenic

20

Bạn không thể chuyển tham số thông qua hàm load. Bạn sẽ phải làm một cái gì đó như:

$this->load->model('model_name'); 
$this->model_name->my_constructor('stuff'); 

Trong mô hình:

function my_constructor($param_var) { 
... 
} 

Response to cập nhật:

Bạn chỉ có thể vượt qua giá trị order_by khi bạn đang gọi điện thoại chức năng mô hình của bạn . Tôi giả định trong hành động điều khiển của bạn, bạn có một cái gì đó như $this->model_name->get($my_id); Chỉ cần thêm tham số order_by của bạn vào chức năng này. IMO điều này làm cho logic mô hình của bạn linh hoạt hơn/có thể tái sử dụng được bởi vì cách bạn đang thực hiện nó, tôi giả sử thiết lập order_by trong hàm tạo sẽ thiết lập giá trị order_by cho mọi hàm.

+1

Cảm ơn và đừng quên bạn có thể đặt giá trị mặc định $ param_var = true trong chức năng mô hình quá. – svandragt

+0

Bây giờ bạn có thể, kiểm tra [answer] này (http://stackoverflow.com/a/10655252/1027550) – MRodrigues

1

Thay vì sử dụng DataMapper tôi đề nghị sử dụng IgnitedRecord vì rằng DataMapper không còn được duy trì nhiều hơn nó đã được thay thế vào Ruby

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