Hướng dẫn Hướng dẫn hiểu biết về Xenforo Class Proxy System

PVS

Super Moderator
Thành viên BQT
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):
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
Điều này có nghĩa là khi XenForo cố gắng để khởi tạo XenForo_ControllerPublic_Thread nó thực sự sẽ khởi tạo thể hiện của 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
Các class mà XenForo tạo cho các proxy là các class trống mà mở rộng liên kết trước đó trong chuỗi. Một ví dụ cho XFCP_YourAddon_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.
Chúc các bạn thành công.


Nguồn: xenforo.rocks​
 

Top Bottom