- Tham gia
- 28/02/2015
- Bài viết
- 16,989
- Được Like
- 12,732
Hướng dẫn hiểu biết về Xenforo Class Proxy System
XenForo Class Proxy System là gì?
Hệ thống này cho phép một số add-on mở rộng các class giống nhau trong XenForo sử dụng hệ thống code event listener của nó, cho phép một chuỗi mở rộng được xây dựng (với các liên kết cuối cùng trong chuỗi là class mà được khởi tạo khi XenForo tạo các class cần thiết).
Listener
Đối với ví dụ này, chúng ta sẽ làm việc với listener sau đây, được bổ sung thêm một class ví dụ để mở rộng chuỗi XenForo_ControllerPublic_Thread's (điều này đang được thực hiện trên load_class_controller):
Vì vậy, nếu chúng ta nhìn vào chức năng này, chúng ta có thể thấy rằng $extend được truyền bằng tham chiếu, có nghĩa là bất kỳ thực hiện của một listener trên code event load_class_controller sẽ nhận và sửa đổi mảng $extend. Vì vậy, nếu listener này thực hiện trước, và hai extend khác XenForo_ControllerPublic_Thread, các mảng sẽ chứa các yếu tố sau (theo thứ tự):
Giải quyết vấn đề của Multiple Inheritance
PHP không có nhiều class kế thừa. Mỗi class cần chính xác một class mở rộng, và bất kỳ class mở rộng của một class sẽ không nhận được bất kỳ class khác (ngoài các class ancestor mở rộng của nó) chức năng. Điều này đặt ra một vấn đề khi 2 hoặc nhiều add-on muốn mở rộng các chức năng tương tự trong XenForo. Nó không phải là có thể có tất cả ba trường hợp các mở rộng XenForo_ControllerPublic_Thread chạy và có nó hoạt động đúng (ví dụ, nhận được cả 3 sự thay đổi để trở lại XenForo_Application hiển thị đúng trên kết thúc trước) mà không cần chạy cả ba class trong cây thực hiện tương tự .
Giải pháp
Giải pháp là hệ thống Proxy Class. Bất kỳ class đang được sử dụng như là một phần mở rộng trong hệ thống listener nên mở rộng một class không tồn tại của định dạng XFCP_ClassName. Đây là Class Proxy. Vì vậy, cho MyAddon_ControllerPublic_Thread, tôi muốn mở rộng XFCP_MyAddon_ControllerPublic_Thread. Vì vậy, code cho MyAddon_ControllerPublic_Thread sẽ trông như sau:
Sự kỳ diệu của giải pháp này xảy ra trong XenForo_Application::resolveDynamicClass(). Điều xảy ra là XenForo phát sinh code event cần thiết (trong ví dụ này, load_class_controller) và lấy những cây mở rộng cho nó (danh sách được cung cấp ở trên). Điều sau đó nó tạo ra các class proxy cần thiết và tải các phần mở rộng cần thiết vào các cây thực thi hiện hành. Cuối cùng, nó sẽ trả về các liên kết cuối cùng trong chuỗi để bất cứ điều gì gọi nó là nhanh chóng. Bởi kết thúc, cây mở rộng sẽ giống như thế này (kể cả các class XenForo), với mỗi item trong danh sách mở rộng các danh sách item trước đó:
Những điều cần lưu ý khi sử dụng Class System Proxy
XenForo Class Proxy System là gì?
Hệ thống này cho phép một số add-on mở rộng các class giống nhau trong XenForo sử dụng hệ thống code event listener của nó, cho phép một chuỗi mở rộng được xây dựng (với các liên kết cuối cùng trong chuỗi là class mà được khởi tạo khi XenForo tạo các class cần thiết).
Listener
Đối với ví dụ này, chúng ta sẽ làm việc với listener sau đây, được bổ sung thêm một class ví dụ để mở rộng chuỗi XenForo_ControllerPublic_Thread's (điều này đang được thực hiện trên load_class_controller):
Mã:
<?php
class MyAddon_Listener {
public static function loadClassController($class, array &$extend) {
if($class == "XenForo_ControllerPublic_Thread") {$extend[] = "MyAddon_ControllerPublic_Thread";
}
}
}
Vì vậy, nếu chúng ta nhìn vào chức năng này, chúng ta có thể thấy rằng $extend được truyền bằng tham chiếu, có nghĩa là bất kỳ thực hiện của một listener trên code event load_class_controller sẽ nhận và sửa đổi mảng $extend. Vì vậy, nếu listener này thực hiện trước, và hai extend khác XenForo_ControllerPublic_Thread, các mảng sẽ chứa các yếu tố sau (theo thứ tự):
- RandomAddon_ControllerPublic_Thread
- YourAddon_ControllerPublic_Thread
- MyAddon_ControllerPublic_Thread
Giải quyết vấn đề của Multiple Inheritance
PHP không có nhiều class kế thừa. Mỗi class cần chính xác một class mở rộng, và bất kỳ class mở rộng của một class sẽ không nhận được bất kỳ class khác (ngoài các class ancestor mở rộng của nó) chức năng. Điều này đặt ra một vấn đề khi 2 hoặc nhiều add-on muốn mở rộng các chức năng tương tự trong XenForo. Nó không phải là có thể có tất cả ba trường hợp các mở rộng XenForo_ControllerPublic_Thread chạy và có nó hoạt động đúng (ví dụ, nhận được cả 3 sự thay đổi để trở lại XenForo_Application hiển thị đúng trên kết thúc trước) mà không cần chạy cả ba class trong cây thực hiện tương tự .
Giải pháp
Giải pháp là hệ thống Proxy Class. Bất kỳ class đang được sử dụng như là một phần mở rộng trong hệ thống listener nên mở rộng một class không tồn tại của định dạng XFCP_ClassName. Đây là Class Proxy. Vì vậy, cho MyAddon_ControllerPublic_Thread, tôi muốn mở rộng XFCP_MyAddon_ControllerPublic_Thread. Vì vậy, code cho MyAddon_ControllerPublic_Thread sẽ trông như sau:
Mã:
<?php
class MyAddon_ControllerPublic_Thread extends XFCP_MyAddon_ControllerPublic_Thread {
public function actionMyAction() {// add-on code}
}
Sự kỳ diệu của giải pháp này xảy ra trong XenForo_Application::resolveDynamicClass(). Điều xảy ra là XenForo phát sinh code event cần thiết (trong ví dụ này, load_class_controller) và lấy những cây mở rộng cho nó (danh sách được cung cấp ở trên). Điều sau đó nó tạo ra các class proxy cần thiết và tải các phần mở rộng cần thiết vào các cây thực thi hiện hành. Cuối cùng, nó sẽ trả về các liên kết cuối cùng trong chuỗi để bất cứ điều gì gọi nó là nhanh chóng. Bởi kết thúc, cây mở rộng sẽ giống như thế này (kể cả các class XenForo), với mỗi item trong danh sách mở rộng các danh sách item trước đó:
- XenForo_Controller
- XenForo_ControllerPublic_Abstract
- XenForo_ControllerPublic_Thread
- XFCP_RandomAddon_ControllerPublic_Thread
- RandomAddon_ControllerPublic_Thread
- XFCP_YourAddon_ControllerPublic_Thread
- YouAddon_ControllerPublic_Thread
- XFCP_MyAddon_ControllerPublic_Thread
- MyAddon_ControllerPublic_Thread
Mã:
<?php
class XFCP_YourAddon_ControllerPublic_Thread extends RandomAddon_ControllerPublic_Thread {}
Những điều cần lưu ý khi sử dụng Class System Proxy
- parent::function() nên luôn luôn được gọi và được sử dụng (ví dụ, nhận được điểm trở lại và thêm vào các thông số) và có sự trở lại của chức năng mở rộng của bạn. Điều này sẽ cho phép bất kỳ add-on khác mà hoạt động trên cùng một chức năng để đúng cách làm việc với các add-on của bạn.
- Không có add-on cần mở rộng một class XenForo trực tiếp (trừ khi hệ thống class proxy không có chức năng).
- Nếu bạn cần class của bạn để thực hiện sớm trong chuỗi thực hiện, hãy chắc chắn để thiết lập trật tự thực hiện event listener của bạn đến một số lượng thấp. XenForo mặc định là 10 và sẽ thực hiện chúng với giá trị thấp nhất để thực hiện lệnh cao nhất.
Nguồn: xenforo.rocks
Bài viết liên quan
Được quan tâm
Bài viết mới