Giữ một mô hình MVC được ghép lỏng lẻo từ DB?


9

Tôi muốn giữ mã của mình có thể kiểm tra được và đã quyết định sử dụng chiến lược Dependency-Injection cho khung MVC hiện tại của tôi, điều này chắc chắn đã được chứng minh là một cách tuyệt vời để đảm bảo mã được ghép lỏng lẻo, khả năng kiểm tra và mô đun hóa.

Nhưng khi ở xa một bậc thầy về các mẫu Thiết kế, tôi có một thời gian khó khăn để tìm ra một cách tốt để giữ các Mô hình của mình được ghép lỏng lẻo từ các lớp trình kết nối Cơ sở dữ liệu, càng tốt.

Làm thế nào điều này có thể được thực hiện?
Vì tôi chưa cung cấp bất kỳ mã vật lý nào cùng với câu hỏi này, tôi thực sự sẽ đánh giá cao một số ví dụ hoặc thông tin logic / mã có thể chỉ cho tôi một hướng để hiểu vấn đề được mô tả ở trên.


Câu hỏi này thuộc về Kỹ thuật phần mềm , vì nó liên quan nhiều hơn đến cấu trúc và suy nghĩ xung quanh chủ đề này, hơn là về việc triển khai nó trong mã.
Lasse V. Karlsen

Câu trả lời:


6

Một cách là thiết kế mô hình của bạn trước khi bạn thiết kế cơ sở dữ liệu của bạn. Khi thiết kế mô hình của bạn, trọng tâm là nắm bắt logic kinh doanh và ý nghĩa trong miền vấn đề. Điều này cần được nắm bắt theo cách có ý nghĩa đối với doanh nghiệp, bao gồm không chỉ các thực thể và trường dữ liệu. Một số yếu tố dữ liệu được giải thích từ các yếu tố khác, một số yếu tố phụ thuộc vào các yếu tố khác, v.v. Ngoài ra, bạn thêm vào mô hình này bất kỳ logic cơ bản nào bạn cần, chẳng hạn như cách một đối tượng phản hồi bên trong khi một yếu tố nhất định được đặt thành một giá trị nhất định.

Hoàn toàn có khả năng bạn sẽ kết thúc với thứ gì đó giống hệt 90% so với cách bạn kết thúc dữ liệu. Tốt rồi. Nó có thể hoàn toàn giống hệt nhau mà không bị ghép nối.

Cũng lưu ý rằng mô hình hóa miền trong sương mù của sự thiếu hiểu biết thực sự bền bỉ là một chút chén thánh cho thiết kế phần mềm. Nếu bạn có thể làm điều đó, tuyệt vời. Nhưng nếu miền vấn đề hoàn toàn có ý nghĩa và có bất kỳ sự phức tạp nào với nó thì bạn vẫn nên rút lui khỏi mô hình miền theo thời gian để kiểm tra sự kiên trì của dữ liệu để đảm bảo rằng bạn đã vẽ cho mình vào một góc.

Chỉ cần nhớ vai trò thực tế của các thành phần khác nhau và giữ các vai trò đó tách biệt khi bạn thiết kế chúng. Đối với bất kỳ quyết định thiết kế nhất định, hãy tự hỏi nếu bất kỳ vai trò nào trong số đó bị vi phạm:

  1. Cơ sở dữ liệu - Lưu trữ dữ liệu, duy trì tính toàn vẹn của dữ liệu, duy trì dữ liệu ở trạng thái nghỉ.
  2. Mô hình - Chứa logic nghiệp vụ, mô hình hóa miền vấn đề, duy trì dữ liệu chuyển động, phản ứng với các sự kiện cấp doanh nghiệp, v.v.
  3. Lượt xem - Trình bày dữ liệu cho người dùng, thực hiện logic phía người dùng (xác thực cơ bản trước khi xác thực đúng được thực hiện trong các mô hình, v.v.).
  4. Bộ điều khiển - Phản hồi các sự kiện của người dùng, chuyển điều khiển cho các mô hình, yêu cầu định tuyến và phản hồi trả về.

Chào David. Cảm ơn bạn đã trả lời rộng rãi! Trong khi duy trì mức độ cao của các khớp nối lỏng lẻo, làm thế nào bạn sẽ kết nối các mô hình với một đầu nối cơ sở dữ liệu?
Công nghiệp

1
@ Công nghiệp: Có một số cách để kết nối các mô hình với sự bền bỉ, nhưng cho đến nay phương pháp duy nhất tôi thấy thực sự thỏa mãn mong muốn của mình để tách các mối quan tâm là có các giao diện kho lưu trữ trong miền được DAL triển khai bên ngoài. Các phương thức kho lưu trữ chấp nhận và trả về các mô hình miền và chuyển đổi bên trong giữa các mô hình đó và bất kỳ thực thể cơ sở dữ liệu nào được tạo. (Thành thật mà nói, tôi đã không làm điều này nhiều trong PHP.) Vì vậy, bạn có thể sử dụng khung DAL để tự động tạo tất cả DB CRUD của mình, v.v. và sau đó viết các kho lưu trữ của bạn dưới dạng giao diện giữa các công cụ đó và các mô hình của bạn.
David

@ Công nghiệp: Ví dụ: nếu bạn sử dụng ORM, thì ORM đó sẽ được DAL của bạn tham chiếu (được cách ly với các mô hình miền) và sẽ chuyển đổi mô hình của bạn thành quyền truy cập dữ liệu tương ứng. Hoặc nếu bạn truy cập cơ sở dữ liệu trực tiếp bằng SQL thủ công, bạn sẽ thực hiện điều đó trong các phương thức kho lưu trữ của DAL và dịch kết quả của các truy vấn SQL thành các mô hình miền trước khi trả về chúng.
David

@ Công nghiệp: Hãy nhớ rằng các phương thức kho lưu trữ không nhất thiết phải là CRUD. Rất nhiều thông minh có thể được nướng vào mã đó. Rất nhiều trong số những cái phức tạp hơn có thể có rất nhiều mã nội bộ biến đổi dữ liệu từ cơ sở dữ liệu. Hoặc, nếu những việc phức tạp liên quan đến nhiều chuyến đi đến cơ sở dữ liệu, thì để tăng hiệu suất, bạn có thể đưa logic vào một thủ tục được lưu trữ và phương thức DAL chỉ cần chuyển qua thủ tục đó và chuyển kết quả thành các mô hình.
David

Chào David! Chỉ muốn cảm ơn bạn một lần nữa cho câu trả lời này. Chắc chắn là một trong những điều tốt nhất tôi đã nhận được trên StackExchange!
Công nghiệp

2

Bạn muốn có hai điều.

  1. Mô hình của bạn (người truy cập DBAL và thực hiện hầu hết logic ứng dụng).
  2. "Mô hình miền" hay còn gọi là Thực thể dữ liệu, chúng đại diện cho các thực thể trong hệ thống của bạn, chẳng hạn như người dùng, bài đăng, sản phẩm, v.v.

    class PPI_Model_User {
    
        protected $_conn = null;
    
        function __construct(array $options = array()) {
            if(isset($options['dsnData'])) {
                $this->_conn = new PPI_DataSource_PDO($options['dsnData']);
            }
        }
    
        function getAll() {
            $rows = $this->_connect->query("SELECT .....")->fetchAll();
            $users = array();
            foreach($rows as $row) {
                $users[] = new PPI_Entity_User($row);
            }
            return $users;
        }
    
    }

Mã sử ​​dụng

    $model = new PPI_Model_User(array('dsnData' => $dsnData));
    $users = $model->getAll();
    foreach($users as $user) {
        echo $user->getFirstName();
    }

Ở đó bạn có nó, đó là cách bạn tạo các mô hình miền (Thực thể) và có các mô hình MVC thực hiện thao tác kết nối và xử lý dữ liệu DB.

Nếu bạn đang tự hỏi PPI là gì, hãy google cho "Khung PPI".

Chúc may mắn với tìm kiếm của bạn.

Trân trọng, Paul Dragoonis.


1

Hãy nhớ rằng, MVC phát sinh trong smalltalk, có tính năng kiên trì tự động cho tất cả các đối tượng. Vì vậy, mô hình MVC không quy định bất kỳ giải pháp nào cho việc tách mô hình / kiên trì.

Sở thích của tôi là cung cấp một đối tượng "Kho lưu trữ" biết cách tạo các đối tượng Mô hình từ cơ sở dữ liệu và lưu trữ các đối tượng Mô hình vào cơ sở dữ liệu. Sau đó, Người mẫu không biết gì về sự kiên trì. Một số hành động của người dùng sẽ phải kích hoạt lưu, do đó, có khả năng Bộ điều khiển sẽ biết về Kho lưu trữ. Tôi thường sử dụng một số hình thức Dependency Injection để giữ cho Bộ điều khiển không bị ghép nối với Kho lưu trữ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.