2010-02-02 29 views
28

Tôi nghĩ rằng thứ tự thực hiện là init(), preDispatch() và sau đó action() được gọi.Zend Framework: Sự khác nhau giữa các hàm init() và preDispatch() trong các đối tượng điều khiển là gì?

  1. Tôi có nên khởi tạo các biến của mình, mà phổ biến trong tất cả các hành động, trong init() hoặc preDispatch()? Tôi đã thấy mọi người sử dụng cả hai chức năng để khởi tạo. Có lẽ như tên cho thấy nó nên được thực hiện trong init() nhưng sau đó những loại công cụ sẽ đi trong preDispatch()?

  2. Điều gì xảy ra giữa hàm init() và preDispatch()?

+0

Bạn đang nói về các đối tượng bộ điều khiển? –

+0

@Emil: Tôi đã chỉnh sửa câu hỏi. Bây giờ phải rõ ràng. – understack

Trả lời

28

Gọi là Zend_Controller_Plugin_Abstract đầu tiên. Ở đây bạn có các đối tượng yêu cầu và phản hồi, vì vậy bạn có thể lọc yêu cầu hoặc chuẩn bị một số thông tin từ yêu cầu.

init() của số Zend_Controller_Action được gọi tiếp theo là một phần của hàm tạo. Nó có để giúp bạn khởi tạo bộ điều khiển của bạn, mà không cần phải ghi đè lên và lặp lại chữ ký của hàm tạo (Zend_Controller_Action::__contruct()).

Phương thức preDispatch() của bộ điều khiển được gọi tại đây. Bạn có thể gọi $request->setDispatched(false) để bỏ qua hành động hiện tại - không chắc chắn bạn có thể thực hiện điều đó trong init()

Sau đó, phương thức hành động của bạn được gọi là (viewAction() chẳng hạn). Ở đây bạn làm công việc bình thường của mình như tìm nạp nội dung từ mô hình và điền vào chế độ xem.

Vì vậy, sự khác biệt bây giờ sẽ được rõ ràng:

  • Nếu bạn muốn một cái gì đó được thực hiện trước mọi hành động - đặt nó trong một plugin và sử dụng một trong các móc (ngoài preDispatch()routeStartupothers),
  • nếu bạn muốn trước mọi hành động trong bộ điều khiển - init hoặc preDispatch(),
  • nếu chỉ cho một hành động đơn lẻ - chính hành động đó.

gì xảy ra giữa các cuộc gọi init()preDispatch() chức năng?

Hầu như không có gì - preDispatch() được thực thi và nếu bạn chưa gọi $request->setDispatched(false), hành động sẽ được thực thi.

+0

Ngoài ra, hãy xem http://framework.zend.com/manual/en/zend.controller.plugins.html – Gordon

+2

'nếu bạn muốn trước mọi hành động trong bộ điều khiển - init hoặc preDispatch()' Trên thực tế, bạn chưa trả lời chính câu hỏi đó. Từ quan điểm cấu trúc, ** trên các bộ điều khiển đơn **, khi init() nên được sử dụng thay vì preDispatch() (không bổ sung)? Ví dụ: Chúng ta không bao giờ thấy trình trợ giúp AjaxContext đang được sử dụng trong preDispatch, nhưng init(). Vậy sự khác biệt về khái niệm giữa hai là gì? Không kỹ thuật. Nếu bạn hiểu ý tôi. Nếu bạn chỉ đơn giản là có thể sử dụng một hoặc khác, không có sự khác biệt. Nhưng tôi nghĩ có điều gì đó. –

+0

Chỉ cần một mẹo về 'ajaxContext' tôi đang đề cập đến các tài liệu khi chúng ta thấy các ví dụ trên các bộ điều khiển đơn: http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller .actionhelpers.contextswitch.ajaxcontext –

0

init(): Đã tải trước các chức năng, Vì vậy, nếu bạn muốn tải nó trước tất cả các chức năng của dự án, hãy đặt nó ở lớp bootstrap. Nếu trước một hàm lớp cụ thể, hãy đặt nó ở init() hàm lớp này.

preDispatch(): Đã tải trước Bộ điều khiển phía trước.

9
  • Phương pháp init() chủ yếu dành cho việc mở rộng hàm tạo. Thông thường, hàm tạo của bạn chỉ cần đặt trạng thái đối tượng và không thực hiện nhiều logic. Điều này có thể bao gồm khởi tạo các tài nguyên được sử dụng trong bộ điều khiển (chẳng hạn như mô hình, đối tượng cấu hình, v.v.), hoặc gán giá trị được lấy từ bộ điều khiển trước, bootstrap hoặc đăng ký.

  • Phương pháp preDispatch() cũng có thể được sử dụng để đặt đối tượng hoặc môi trường (ví dụ: xem, trợ giúp hành động, v.v.), nhưng mục đích chính của nó là đưa ra quyết định về việc có nên gửi tác vụ được yêu cầu hay không. Nếu không, bạn nên sau đó _forward đến một hành động khác hoặc ném một ngoại lệ.


Lưu ý: _forward thực sự sẽ không hoạt động chính xác khi thực hiện từ init(), mà là một chính thức hóa những ý định của hai phương pháp.

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