2011-08-30 29 views
6

Tôi hiểu rằng hành vi được cho là sẽ mở rộng mô hình và thêm chức năng vào nó, nhưng trong hầu hết các trường hợp, ý tưởng mô hình chất béo làm cho hành vi vô dụng, phải không?cakephp - sự khác biệt giữa mô hình và hành vi là gì?

Và, thậm chí ưa thích, bỏ qua đoạn đầu tiên của tôi và chỉ cần trả lời - xin - câu hỏi trong tiêu đề, và thêm một ví dụ để làm rõ

nhờ

Trả lời

22

Một hành vi là nơi bạn trích xuất mã mà không thực sự thuộc về một mô hình miền cụ thể. Các loại như, các hàm trợ giúp, hoặc một mixin/module (nếu bạn quen thuộc với mẫu đó từ các ngôn ngữ lập trình khác).

Nếu bạn đã quen với người trợ giúp và thành phần CakePHP, bạn có thể xem nó như thế này. Một hành vi là để mô hình như người trợ giúp là để xem như thành phần là để điều khiển. Về cơ bản, một tập hợp các chức năng sẽ được sử dụng trên nhiều mô hình.

Giả sử bạn muốn triển khai xóa mềm trên tất cả các kiểu máy trong ứng dụng của mình. (Soft xóa ý nghĩa, bạn không thực sự xóa bản ghi, bạn chỉ cần đánh dấu nó là đã xóa). Bạn sẽ không muốn đặt cùng một mã xóa mềm vào mọi mô hình. Đó không phải là rất khô! Thay vào đó bạn sử dụng một hành vi để trừu tượng hóa các chức năng như vậy.

Điều chúng tôi đang cố gắng làm thay vì xóa bản ghi, cập nhật cột đã xóa với ngày hiện tại (nó sẽ hoạt động theo cách tương tự như được tạo, sửa đổi). Sau đó, chúng tôi sẽ thay đổi phương thức tìm kiếm để chỉ truy xuất các bản ghi không bị xóa.

// models/behaviors/soft_deletable.php 
class SoftDeletableBehavior extends ModelBehavior { 
    function setup(&$Model, $settings = array()) { 
     // do any setup here 
    } 

    // override the delete function (behavior methods that override model methods take precedence) 
    function delete(&$Model, $id = null) { 
     $Model->id = $id; 

     // save the deleted field with current date-time 
     if ($Model->saveField('deleted', date('Y-m-d H:i:s'))) { 
      return true; 
     } 

     return false; 
    } 

    function beforeFind(&$Model, $query) { 
     // only include records that have null deleted columns 
     $query['conditions']["{$Model->alias}.deleted <>"] = ''; 
     return $query; 
    } 
} 

Sau đó, trong mô hình của bạn

Class User extends AppModel { 
    public $actsAs = array('SoftDeletable'); 
} 

Và từ điều khiển của bạn, bạn có thể gọi tất cả các phương pháp hành vi của chúng tôi trên mô hình của bạn

Class UsersControllers extends AppController { 
    function someFunction() { 
     $this->User->delete(1); // soft deletes user with id of 1 

     $this->User->find('all'); // this will not exclude user with an id of 1 
    } 
} 

Tôi hy vọng điều này sẽ giúp bạn.

+0

Câu trả lời hay! ví dụ mã rất dễ đọc và dễ hiểu! cảm ơn bạn. – yossi

+0

Bạn đang chào mừng Yossi. Tôi đã hy vọng nó không quá dài! –

+0

nope, nó đã được hoàn hảo .. đó là lý do tại sao .. bạn có thể vui lòng kiểm tra này? http://stackoverflow.com/questions/7278357/cakephp-creating-new-user-account-several-problems/7278402#7278402 – yossi

3

Hành vi có thể được chia sẻ giữa các mô hình. Thông thường, Hành vi chứa mã trừu tượng có thể được áp dụng cho bất kỳ mô hình nào.

Mặc dù bạn có thể viết điều này cho một Mô hình cụ thể, bạn sẽ phải viết lại mô hình này cho một Mô hình khác. Bằng cách abstract nó được chia sẻ, bạn đã tạo một hành vi .

Trong CakePHP một Behavior đến một Mẫu là mối quan hệ tương tự như một phần đến một điều khiển hoặc một Helper đến một Xem.

Ví dụ về hành vi cốt lõi trong CakePHP là Containable. Điều này cho phép bạn kiểm soát tốt hơn các mối quan hệ được sử dụng bởi find().

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