6

Mọi người thiết kế giao diện lớp dịch vụ của họ như thế nào?Lớp dịch vụ ứng dụng - cách viết giao diện phương thức API

Tôi đang lập trình một ứng dụng web lớn (bằng PHP) và chúng tôi đang sử dụng MVC và lập trình các bộ điều khiển mỏng, ví dụ: (pseudo code following)

public savePersonAction() { 
    $input = filter($_GET); 
    ... input validation ... 

    $result = $this->_service->savePerson(?); 

    ... etc 
} 

Nên savePerson trong dịch vụ lấy một đối số của toàn bộ cấu trúc hoặc ngữ cảnh đầu vào $ (trong PHP, một mảng kết hợp)?

Ví dụ: này -

public function savePerson(array $input) { 

hoặc nên tách riêng tất cả các trường nhập và cung cấp giao diện "cứng", ví dụ:

public function savePerson($title, $firstName, $lastName, $dateOfBirth, ... etc.. for many more) { 

Cảm ơn.

Paul

+0

Câu hỏi hay, Paul! – mkoistinen

Trả lời

5

Nếu bạn định tuân theo tinh thần MVC, phương thức savePerson của bạn sẽ không chấp nhận đầu vào thô. Nó không nên được kết hợp trực tiếp với định dạng dữ liệu đến từ ui. Thay vào đó, nó phải chấp nhận đầu vào được xác định trong các điều khoản của miền dịch vụ của bạn, giống như một đối tượng "người". (Điều này có thể chỉ là một mảng kết hợp như Cobby gợi ý). Nó sẽ là công việc của phương thức hành động của bộ điều khiển để ánh xạ đầu vào thô theo định dạng mà dịch vụ yêu cầu.

Lợi ích của bước dịch bổ sung này là nó tách dịch vụ (mô hình) của bạn khỏi giao diện người dùng. Nếu bạn triển khai một giao diện người dùng khác, bạn không cần phải thay đổi giao diện dịch vụ. Bạn chỉ cần viết bộ điều khiển mới (và xem, tất nhiên).

Trong khi ví dụ của bạn như savePerson($title, $firstName, $lastName...) là ý tưởng đúng, thường là dấu hiệu xấu khi bạn có các phương thức có nhiều hơn 2 hoặc 3 đối số. Bạn sẽ có thể nhóm các đối số liên quan vào một số loại đối tượng cấp cao hơn.

+0

Cảm ơn dellsala (và Cobby), sau khi đọc và suy nghĩ về nó, xác định tất cả các thông số "nguyên tử" có vẻ như là cách tốt nhất để đi (tôi đã sử dụng dự án Apache OFBiz làm tài liệu nghiên cứu ở đây). –

1

ứng dụng MVC của tôi được cấu trúc như thế này: Controller - Dịch vụ> -> ORM/khác thư viện

Để trả lời câu hỏi của bạn, thông thường trong điều khiển của bạn, bạn sẽ nhận được dữ liệu mẫu như là một mảng , tức là $ form-> getValues ​​() hoặc một cái gì đó tương tự. Về mặt bảo trì, tốt nhất là nếu Dịch vụ của bạn ngoại trừ mảng làm đối số, theo cách đó nếu bạn thêm trường khác vào biểu mẫu, bạn chỉ phải cập nhật biểu mẫu và dịch vụ, trình điều khiển của bạn có thể vẫn bị ảnh hưởng và vẫn hoạt động.

Vì vậy, tôi nghĩ đi với ví dụ đầu tiên của bạn:

public function savePerson($personArray); 

Hơn nữa, bạn không cần một giao diện "cứng" vì thư viện mẫu của bạn sẽ chăm sóc xác nhận/filteration/sanitization vì vậy chúng tôi có thể giả định rằng mảng kết hợp sẽ hợp lệ, cộng với định nghĩa phương thức sẽ nhận được ridiculously dài với các tham số được đặt tên.

+0

sẽ là một cách khả thi để truyền đối tượng mẫu? – JCM

+0

Bạn có nghĩa là dữ liệu từ biểu mẫu? Tôi không theo câu hỏi của bạn Jonathan. – Cobby

+0

'$ myForm = new My \ Form; if ($ myForm-> isValid ($ request-> getPost())) {$ myService-> doThings ($ myForm);} ' – JCM

0

Tôi sẽ tách riêng tất cả các trường nhập và cung cấp giao diện "cứng" trong Dịch vụ, ví dụ:

public function savePerson($title, $firstName, $lastName, $dateOfBirth) {...} 

Sạch hơn và không cần giả định.