Tôi đã làm việc với CakePHP 1.3, nhưng đây là lần đột phá đầu tiên của tôi vào các trường hợp ngoại lệ CakePHP 2.0 và PHP, vì vậy hãy mang theo tôi nếu câu hỏi của tôi có vẻ dài dòng.CakePHP 2.0 - beforeFilter() không chạy trên bánhErrorController?
Trong AppController
's beforeFilter()
Tôi đặt một vài biến thông qua $this->set()
để sử dụng trong mẫu xem của tôi.
Trong UsersController
Tôi có mã của tôi trông gần như thế này:
public function beforeFilter() {
parent::beforeFilter();
if (userDeniedAccess()) {
throw new ForbiddenException();
}
}
nơi hàm giả userDeniedAccess()
đóng gói kiểm tra ủy quyền của tôi.
Tất cả đều hoạt động tốt và tôi nhận được lỗi 403 khi tôi mong đợi. Tuy nhiên, khi ngoại lệ được ném, các biến chế độ xem được đặt trong AppController::beforeFilter()
không còn được đặt nữa, dẫn đến lỗi từ mẫu chế độ xem của tôi. Khi ngoại lệ là không phải là được ném, các biến được đặt chính xác.
Tôi có thể mã xung quanh các biến bị thiếu nếu tôi phải, nhưng tôi thực sự muốn biết nguyên nhân gây ra hành vi này. Cả hai số UsersController
và CakeErrorController
của chúng tôi đều mở rộng AppController
. Đương nhiên, tôi hy vọng rằng khi ngoại lệ được ném và CakeErrorController
được khởi tạo, nó sẽ tạo ra các biến số tương tự cho tôi.
Tuy nhiên, có vẻ như phương thức Controller::startupProcess()
(bao gồm gọi đến beforeFilter()
) không bao giờ được gọi trên số CakeErrorController
. Theo tôi hiểu nó, điều này được thực hiện bởi các điều phối viên cho các yêu cầu thường xuyên, nhưng vòng đời của bộ điều khiển lỗi là khác nhau.
Tôi đã xem mô tả (like this one) về hành vi tương tự trong CakePHP 1.3, nhưng tất nhiên mã xử lý lỗi của CakePHP đã được sửa chữa hoàn toàn trong 2.0.
Vì vậy, một trong hai:
- Đây là một lỗi trong xử lý ngoại lệ mặc định CakePHP của,
- Hành vi này là như dự định và tôi chỉ không hiểu nó, hoặc
- tôi sẽ loại hạt.
Tôi biết bạn không thể giúp trường hợp 3, nhưng nếu một trong hai trường hợp đầu tiên áp dụng, tôi đánh giá cao ý kiến của một người biết nhiều hơn tôi.
Cảm ơn!
CHỈNH SỬA: Đặt biến chế độ xem trong beforeRender()
không giải quyết được sự cố của tôi. Tuy nhiên, tôi vẫn tự hỏi liệu nó có chủ ý là beforeFilter()
không bao giờ được gọi vào số CakeErrorController
.
+1 cho "tôi có thể bị điên" tự chẩn đoán. –