2012-03-13 36 views
5

Tôi đang phát triển một CMS nhỏ cho công ty của mình bằng Symfony2. Tôi thực sự yêu thích khuôn khổ này. Tôi yêu các lớp mẫu và tái sử dụng chúng (tất cả là về các dạng sau khi tất cả).Symfony2 và tiếp cận DRY trong bộ điều khiển

Nhưng (có, có một "nhưng") Tôi cảm thấy như tôi đang làm công cụ tương tự, sao chép và dán trong tất cả các bộ điều khiển. Một bản sao mã mà chúng tôi ghét. Với tất cả các logic kinh doanh chuyển đến Services và các hình thức, các sự kiện, kiên trì hành động trong học thuyết, tất cả các bộ điều khiển của tôi làm điều tương tự:

  • Lấy respository $this->get('mycompany.repository.entity')
  • động tạo ra các hình thức (logic là bên trong các hình thức lớp chính nó)
  • Validate hình thức, trả lại xem hoặc kiên trì thực thể
  • và vân vân ...

những gì tôi có nghĩa là hành động điều khiển là tất cả cùng một, chỉ cần một vài ký tự thay đổi.

Làm cách nào để có thể DRY bằng Symfony2 trong bộ điều khiển của tôi? Có lẽ điều khiển như dịch vụ (một khái niệm mà tôi phát hiện ra chỉ một vài ngày trước) có thể giúp đỡ?

EDIT: Câu hỏi có liên quan (với ý tưởng đầu tiên được đề xuất bởi Boo): Symfony2 how to redirect to an action without hardcoding route name?

Trả lời

2

Có rất nhiều cách để có được một cơ sở mã DRY hơn:

  1. Bạn có thể tạo một BaseController trừu tượng . Nó có thể nhóm mã được lặp lại vào một số phương thức riêng, vì vậy mọi bộ điều khiển mở rộng nó có thể sử dụng nó. Sử dụng các thuộc tính riêng, bạn có thể đặt các công cụ cụ thể cho Bộ điều khiển trước khi gọi các phương thức.
  2. Bạn có thể thực hiện một số BaseService để bạn chỉ cần gọi dịch vụ này, thiết lập một số thông số (như kho lưu trữ nào để sử dụng) và sau đó yêu cầu dịch vụ thực hiện logic
  3. Bạn chỉ có một bộ điều khiển có một số tham số và xác định mỗi tuyến để sử dụng bộ điều khiển này, truyền các thông số cụ thể.

Tôi đoán có nhiều cách hơn nữa khi nghĩ về điều đó.

Tôi tìm ý tưởng 1 rất thanh lịch trong khi 3 cũng có một số lợi thế. Cách tiếp cận thứ hai là loại blury, đặc biệt là khi bạn lại cần mã được công bố (ngay cả khi nó sẽ ít hơn nhiều, nó không phải là tối ưu). Ý tưởng 1 là đồng bộ với ý tưởng OO và nó truyền đạt ý định của nó tốt. Tóm lại, tôi sẽ sử dụng một BaseController!

+0

Bạn có nghĩ rằng điểm 1 giống như một mẫu chiến lược? Tôi có nghĩa là lấy - xác nhận - tồn tại? – gremo

+0

Tôi đã làm theo ý tưởng đầu tiên của bạn. Nó không đơn giản như vậy, hãy nhìn vào câu hỏi liên quan của tôi: http://stackoverflow.com/questions/9719686/symfony2-how-to-redirect-to-an-action – gremo

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