Other Understanding the XenForo Class Proxy System - Hiểu biết XenForo Class Proxy System

PVS

Super Moderator
Thành viên BQT
Tham gia
28/02/2015
Bài viết
16,832
Được Like
12,694
Understanding the XenForo Class Proxy System - Hiểu biết XenForo Class Proxy System

XenForo Class Proxy System là gì?

Tóm lại, hệ thống này cho phép một số add-on mở rộng các class cùng 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 đượ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 tôi 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):
PHP:
<?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 theo tham biến, 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 mở rộng 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 một cá thể của MyAddon_ControllerPublic_Thread.

Giải quyết gấn đề Multiple Inheritance

PHP không có nhiều class thừa kế. 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ỳ chức năng class khác (ngoài các class ancestors mở rộng của nó). Đ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 thành XFCP_MyAddon_ControllerPublic_Thread. Vì vậy, các mã cho MyAddon_ControllerPublic_Thread sẽ trông giố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 gì xảy ra XenForo phát sinh code events 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 gì 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. Vào cuối này, 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 mục trong danh sách mở rộng các mục danh sách 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 hệ thống Class 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ỳ tiện ích khác 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 add-on cần mở rộng một class XenForo trực tiếp (trừ khi hệ thống class proxy không chức năng).
  • Nếu bạn cần class của bạn để thực hiện sớm trong thực hiện chuỗi, 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 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.com​
 

Hướng dẫn sử dụng

XenForo 1 XenForo 2
Translate by PVS

Dịch vụ XenForo của VNXF

Mobile/Zalo: 0906081284

Telegram: anhanhxf

Chỉ nhận web nội dung lành mạnh

Nhà Tài Trợ

Mút Xốp Không Gian
Mút Sofa Không Gian
Top Bottom