2011-01-31 41 views
21

Tôi vừa "hoàn thành" mã hóa một dịch vụ web tương đối có liên quan trong PHP. Các cơ sở mã bây giờ là một chút lộn xộn do yêu cầu phút cuối, thay đổi, tiện ích, thông thường.Mẫu thiết kế để xây dựng một dịch vụ web PHP phức tạp hợp lý

Tôi đã cố gắng mã hóa nó càng nhẹ càng tốt và theo cách có thể tối đa hóa hiệu suất.

Do đó, tôi không sử dụng bất kỳ khung công tác nào như Zend hoặc bất kỳ ORM nào như Doctrine.

Tôi đã tự hỏi liệu có bất kỳ khung công tác hoặc mẫu thiết kế nào tồn tại cho mục đích duy nhất là xây dựng API/dịch vụ web bằng PHP không?

Tôi đang nghĩ đến một nhà tái cấu trúc và tôi muốn đảm bảo rằng bây giờ tôi biết chính xác những gì có liên quan tôi có thể xây dựng điều này đúng cách.

+0

Câu hỏi hay, tôi nghĩ rằng dấu hiệu của một khung công tác nhẹ thực sự tốt sẽ là nó cũng phù hợp với các API/dịch vụ web vì nó sẽ phù hợp với web front-end. – Nicole

+0

Kiểm tra FRAPI - http://getfrapi.com/ Nó được xây dựng bởi công ty echolibre .. người sẽ xảy ra bao gồm một số lãnh đạo PEAR. – CaseySoftware

Trả lời

15

Tôi xin lỗi trước vì tự tham khảo ở đây với khung của riêng tôi - không có cách nào để tôi giúp bạn nếu không tôi không sử dụng bất cứ thứ gì khác. Tôi không quảng cáo vì nó không công khai.

Như tôi đã nói trong nhận xét của mình, tôi nghĩ rằng một khuôn khổ web front-end tốt không có nghĩa là nó là một khung dịch vụ web nghèo nàn.

Bởi vì tôi không hài lòng với cách thức hạn chế của bất kỳ khung công tác PHP phổ biến nào (như CodeIgniter, CakePHP, Kohana), cũng như kích thước của chúng, tôi đã viết một khung được thiết kế chỉ thực sự với hai mục đích, yêu cầu và xác định hành động để thực hiện và sau đó tách mã cho hành động đó khỏi chế độ xem (phản hồi).

Các mẫu thiết kế tôi sử dụng là:

  1. Tất cả các URL được viết lại (mod_rewrite) và truyền cho điểm vào thực hiện của bạn.
  2. Điểm vào của bạn thiết lập đường dẫn mà nó sẽ nhận ra và xử lý. I E. cho một dịch vụ web:
    • /users - Danh sách người dùng
    • /user/* - Người dùng xác định bởi giá trị mà * là.
    • /user/*/delete - Xóa người dùng
    • /posts - Danh sách bài viết
    • /post/* - Xem gửi *
  3. Cùng với đường dẫn mà bạn chỉ định một chức năng, I.E. UserActions::saveUser sẽ được thực hiện nếu phương thức HTTP là POST. Lý do nó chỉ được thực thi trên POST là cho phép đầu ra và đầu vào có cùng URL.
  4. Đường dẫn cũng chỉ định chế độ xem. Đây là nội dung phản hồi sẽ được gửi tới trình duyệt. Nó có thể được hiển thị dưới dạng PHP thẳng hoặc bạn có thể cắm vào một công cụ mẫu. Trong trường hợp các dịch vụ web, tất cả các đường dẫn có thể sẽ sử dụng một khung nhìn duy nhất để hiển thị dữ liệu của bạn ở định dạng đầu ra (JSON, XML, bất kỳ thứ gì). Chế độ xem có thể chỉ là một phương thức PHP và không bắt buộc phải chỉ định tệp mẫu.
  5. Trong trường hợp giao diện người dùng web, chế độ xem có thể có chế độ xem gốc kết thúc tốt đẹp (tạo trang từ trong ra ngoài).
  6. Điểm cuối cùng là bảo mật. Bạn có thể xác định một loại bảo mật được áp dụng cho bất kỳ đường dẫn nào. Loại bảo mật chỉ xác định chức năng nào (như SecurityManager::authorize) để kiểm tra ủy quyền và nếu trả lại false, nó chuyển hướng đến đường dẫn bạn chọn.

Những lý do tôi tin rằng mẫu thiết kế này hoạt động tốt cho Web Services:

  • Cho phép bạn sử dụng một điểm duy nhất nhập cảnh, nhưng có thể được sử dụng với nhiều điểm vào (để tối ưu hóa, nếu cần thiết) .
  • Không giả định rằng bạn muốn URL của mình khớp với Mô hình đối tượng, giống như hầu hết các khung chính làm (ngoại lệ đáng chú ý là Zend, như đã đề cập trong các nhận xét).
  • Dễ dàng thích nghi với REST (thay vì chỉ kiểm tra POST, hãy kiểm tra các phương pháp khác nữa).
  • Việc xóa bất kỳ HTML nào hoàn toàn tự nhiên, vì trong mẫu này, phản hồi hoàn toàn tách biệt với quá trình xử lý.
  • Điều này tất cả có thể được thực hiện trong một vài lớp.
+4

Tôi đã viết khung làm việc của riêng mình thực hiện chính xác điều này vì những lý do bạn đã liệt kê. –

+0

Như đã làm I. Nếu bạn tách riêng Mô hình và Chế độ xem khỏi Bộ điều khiển, một khung công tác không cần phí. Các khuôn khổ 'phổ biến' không làm điều đó. – Rudie

+0

* Không giả định rằng bạn muốn URL của bạn khớp với Mô hình đối tượng, giống như tất cả các khung chính. * - Zend Framework không thực hiện điều đó, bạn có thể định tuyến bất kỳ đường dẫn đến bộ điều khiển nào phù hợp. (ngay cả khi nó có thể là một chút cồng kềnh) PHP khuôn khổ ra khỏi đó. – wimvds

0

Imho, mọi "điều" dựa trên MVC có thể thực sự giúp bạn.

Nếu bạn thực sự không muốn sử dụng bất kỳ thứ gì (cố gắng CakePHP!) đã tồn tại, việc cấu trúc mã của bạn theo mvc thực sự có thể giúp bạn phân tách logic của ứng dụng trên nhiều lớp hơn và giữ cho nó dễ đọc hơn và có thể gỡ lỗi .

Tất nhiên, với mô hình tốt hơn, bạn có thể viết mã khủng khiếp, tùy thuộc vào bạn!

+1

Vì tôi đang viết một API, mẫu thiết kế MVC không thực sự áp dụng được vì không thực sự có bất kỳ 'hành động' nào cho bộ điều khiển và không có 'chế độ xem'. – Evernoob

+0

Tôi đã suy nghĩ trong khi viết câu trả lời, nhưng nó phụ thuộc hoàn toàn vào cách bạn đang viết api ... Nếu api bằng cách nào đó RESTFul, một patter mvc được áp dụng ... Đó là lý do câu trả lời của tôi, nhưng tôi thấy mà không phù hợp với tất cả các tình huống! –

+6

@Evernoob: 'view' trong trường hợp của bạn là bất cứ điều gì bạn gửi lại cho khách hàng. 'hành động' là bất cứ điều gì dịch vụ của bạn được yêu cầu làm theo yêu cầu. – Mchl

-1

Một Google nhanh chóng và tôi thấy

Tôi chưa bao giờ sử dụng bất kỳ các

+8

Mọi người đều có thể google. Quan điểm của bạn là gì? – sanmai

+3

@sanmai từ kinh nghiệm của tôi ở trường ... điều đó không đúng chút nào. –

0

Tôi nghĩ bạn có thể sử dụng cùng các mẫu bạn sử dụng bởi các ứng dụng web đơn giản. Một dịch vụ an toàn có giao diện khác với một ứng dụng web, nhưng mọi thứ trong giao diện đó đều giống nhau. Bạn có thể chuyển đổi dịch vụ an toàn thành ứng dụng web như vậy:

METHOD host/resource/data => host/resource/METHOD?data 

tài nguyên là bộ điều khiển, PHƯƠNG PHÁP là hành động. Ví dụ:

GET http://library.com/books/123 => http://library.com/books/get?123 

Vì vậy, bạn có thể sử dụng bộ điều khiển trước và MVC.

+0

Các hành động/phương pháp như "hủy kích hoạt" hoặc "trẻ em" như thế nào? – Rudie

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