6

Tôi đến từ một nền Java/Grails và dường như không thể tìm thấy câu trả lời xác định trực tuyến là nơi lưu trữ logic dịch vụ cho ứng dụng CakePHP. Bởi "Dịch vụ", tôi đang nói về các lớp học thường được khởi tạo thông qua tiêm phụ thuộc để tiến hành logic nghiệp vụ trên các đối tượng miền. Họ sẽ có thể truy vấn bất kỳ đối tượng miền nào và thực hiện các thay đổi để phản hồi lại hành động của bộ điều khiển.CakePHP: Nơi đặt logic 'Dịch vụ'

Hiện tại, lớp "Thành phần" của CakePHP có vẻ là đối sánh gần nhất với hành vi này. Tôi có thể tải một thành phần vào bất kỳ bộ điều khiển nào và thực thi các phương thức của nó khi cần thiết. Tuy nhiên, tôi đã đọc ở một số nơi mà các thành phần không bao giờ nên truy cập cơ sở dữ liệu và làm như vậy sẽ dẫn đến một số lần truy cập hiệu suất dốc.

Tôi cũng đã xem xét lớp "Hành vi" của CakePHP và dường như nó không phù hợp với vé. Nó có vẻ được trang bị tốt để tổ chức các đối tượng miền vào một thiết lập cấu trúc dữ liệu, nhưng đó không phải là loại logic mà một dịch vụ sẽ thực thi. Ngoài ra, để nhập bất kỳ định nghĩa mô hình nào vào Hành vi, tôi sẽ phải chỉnh sửa định nghĩa mô hình chính nó để cho phép truy cập, điều này rất khó xử.

Vì vậy, tôi đặt câu hỏi này: Trường hợp logic dịch vụ nên được lưu trữ ở đâu? Chắc chắn không phải là bộ điều khiển vì nó chỉ chứa logic tối thiểu để xử lý yêu cầu và gửi phản hồi.

+1

Đây là một gợi ý miễn phí cho bạn: tránh xa CakePHP. Đó là một trong những khung công tác tồi tệ nhất trong PHP và nó chắc chắn không thực hiện bất cứ điều gì từ xa như MVC. Nếu muốn sử dụng một cái gì đó mà ít nhất là nhận ra khái niệm về "dịch vụ", bạn có thể thử Symfony2. –

+0

Đối số 1: trạng thái toàn cầu. CakePHP về cơ bản là xung quanh việc sử dụng các thông số đơn lẻ và các thông số khác. –

+0

Đối số 2: các lớp tĩnh: phần lớn lõi CakePHP bao gồm các phương thức tĩnh. Điều đó làm cho tất cả các mã được kết hợp chặt chẽ với các tên cụ thể của các lớp, mà cuối cùng được sử dụng như không gian tên. –

Trả lời

6

Thành phần là lớp dịch vụ trong CakePHP. Chúng được xây dựng bởi một thùng chứa phụ thuộc (bộ sưu tập thành phần) và vượt qua bộ điều khiển, yêu cầu và đáp ứng được xử lý.

Không có hạn chế nào trong những thành phần có thể làm khác ngoài việc duy trì sự tách biệt giữa các lớp. Bạn có thể sử dụng các kết nối cơ sở dữ liệu hoặc sử dụng các mô hình trực tiếp từ một thành phần và sửa đổi yêu cầu.

Thành phần thực sự rất nhẹ nếu bạn chỉ làm cho chúng hoạt động trong các trường hợp cụ thể. Kiểm tra tên hành động, là một cách phổ biến để hạn chế phạm vi tiếp cận của một thành phần. Bạn cũng có thể tiêm thiết lập để nó có thể biết khi nào là OK để thực thi logic dịch vụ tùy chỉnh.

-2

Vì vậy, tôi đặt câu hỏi này: Trường hợp logic dịch vụ nên được lưu trữ ở đâu? Chắc chắn không phải bộ điều khiển vì nó chỉ chứa logic tối thiểu để xử lý yêu cầu và gửi phản hồi.

Âm thanh như trường hợp sử dụng lý tưởng cho Dispatcher Filter. Nó được gọi ngay cả trước khi một bộ điều khiển được khởi tạo. Nếu bạn cần truy vấn cơ sở dữ liệu, chỉ cần tải một mô hình thông qua ClassRegistry :: init ('YourModelName') và chuyển các tham số yêu cầu đến phương thức mô hình và trả về bất cứ thứ gì bạn cần trong yêu cầu của bạn. Không cần điều khiển gì cả. Chúng tôi đã triển khai oauth + xhttp bằng cách sử dụng Bộ lọc điều phối mà không gọi bao giờ là bộ điều khiển.

Cách sử dụng mô hình bên trong một thành phần sẽ ảnh hưởng đến hiệu suất ... Tôi không biết ai có ý tưởng kỳ lạ đó, có vẻ như không phải là bài viết hay nhất bạn tìm thấy. Đúng là bạn không nên đặt logic liên quan đến mô hình lớp trong chúng nhưng bạn có thể gọi một mô hình ví dụ thông qua cá thể bộ điều khiển và các mô hình bộ điều khiển.

+0

"Logic dịch vụ" chủ yếu đại diện cho sự tương tác giữa các trừu tượng lưu trữ và các thực thể miền. Câu trả lời của bạn không liên quan gì đến nó cả. Địa ngục .. bánh thậm chí không tách rời cả hai khía cạnh của lớp mô hình, vì nó sử dụng activerecord cho các lớp 'AppModel' của nó. –

+0

@burzum Sau một số lần đọc, có vẻ như với tôi rằng DispatcherFilter sẽ tuyệt vời cho các chức năng như các cuộc gọi API. Tuy nhiên, phần lớn logic của tôi là rộng hơn trong tự nhiên. Ví dụ, khi tôi nhận được một yêu cầu POST có xác thực không thành công, tôi cần phải đăng nhập nỗ lực đăng nhập không thành công vào cơ sở dữ liệu. Mặc dù một khái niệm đơn giản, có tồn tại khá nhiều mã để tạo ra một bản ghi mới, xác nhận và duy trì nó. Loại tính toán này không thuộc về bộ điều khiển vì nó không liên quan trực tiếp đến yêu cầu hoặc phản hồi. Bạn vẫn muốn giới thiệu DispatcherFilter cho một nhiệm vụ như vậy? – emagdne

+1

Bộ lọc điều phối phù hợp cho logic trung gian, nhưng các thành phần phù hợp hơn với những gì anh ta mô tả –