2012-01-27 25 views
8

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ố UsersControllerCakeErrorController 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:

  1. Đây là một lỗi trong xử lý ngoại lệ mặc định CakePHP của,
  2. Hành vi này là như dự định và tôi chỉ không hiểu nó, hoặc
  3. 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

+1 cho "tôi có thể bị điên" tự chẩn đoán. –

Trả lời

4

Đặt các cuộc gọi đến $this->set() trong cuộc gọi lại beforeRender(). Bằng cách đó, chúng sẽ luôn được đặt ngay cả khi bạn ném một ngoại lệ.

Tôi đã gặp vấn đề tương tự với một số biến bố cục tùy chỉnh, như với trang DebugKit của tôi sẽ được lấp đầy với cảnh báo biến không khai báo bất cứ khi nào có bất kỳ lỗi nào. Sử dụng beforeRender() thay vì sửa nó.

+0

+1 cho một câu trả lời sâu sắc - nhưng tôi không chắc chắn điều này sẽ làm việc cho tôi, kể từ 'beforeRender()' chạy sau khi hành động logic. Vì tôi đang thực hiện kiểm tra ủy quyền, tôi không muốn logic hành động chạy nếu chúng không thành công. – eaj

+0

Suy nghĩ thứ hai, điều đó không có ý nghĩa. Tất nhiên tôi có thể ném ngoại lệ của tôi trong 'beforeFilter()' và thiết lập các biến view trong 'beforeRender()'. Tôi đã chấp nhận câu trả lời này vì nó giải quyết vấn đề trước mắt của tôi, nhưng tôi vẫn muốn biết liệu đó là một lỗi mà 'beforeFilter()' không được gọi trên bộ điều khiển lỗi. – eaj

3

bạn có thể ghi đè lên CakeErrorController.php bằng cách sao chép nó vào App/Controller/ và sau đó thêm parent :: beforeFilter() vào hàm tạo.

+0

Cảm ơn, đó chắc chắn là một lựa chọn hữu ích. Dù vậy, nó cảm thấy một chút tin tặc. Tại thời điểm này tôi đã có mã của tôi làm những gì nó cần phải làm. Tôi vẫn muốn hiểu tại sao quá trình xử lý ngoại lệ không bao giờ gọi 'startupProcess()' trên 'CakeErrorController' giống như cách mà trình điều phối gọi nó trên các bộ điều khiển khác. – eaj

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