Skip to main content

AddonLoader

Struct AddonLoader 

Source
pub struct AddonLoader { /* private fields */ }
Expand description

插件加载器 — 对齐 think\addons\Service 插件加载器(主入口)

对齐 PHP think\addons\Service,统一管理插件发现/清单/注册/路由解析。

§设计

  • 持有插件根目录(对齐 PHP $this->addons_path
  • 持有 AddonRegistry(插件清单注册中心)
  • 持有 AddonAutoload(类名→文件路径解析)
  • 提供 register() 入口:扫描目录 + 解析清单 + 注册到 registry
  • 提供 parse_route(url) 入口:URL → 控制器类名 + 文件路径

§用法

use sz_rust_addons_loader::loader::AddonLoader;

let loader = AddonLoader::new("/path/to/addons");
let errors = loader.register().unwrap();
// errors 中包含解析失败的插件错误(不中断整体扫描)

let route = loader.parse_route("/addons/operate/Order/index").unwrap();
assert_eq!(route.addon, "operate");
assert_eq!(route.controller, "Order");
assert_eq!(route.action, "index");

Implementations§

Source§

impl AddonLoader

Source

pub fn new(addons_path: impl Into<PathBuf>) -> AddonLoader

创建加载器

  • addons_path:插件根目录,对齐 PHP {rootPath}/addons/
Source

pub fn addons_path(&self) -> &Path

获取插件根目录

Source

pub fn registry(&self) -> &AddonRegistry

获取注册中心引用(共享只读)

Source

pub fn autoload(&self) -> &AddonAutoload

获取自动加载器引用

Source

pub fn register(&self) -> Result<Vec<AddonLoaderError>, AddonLoaderError>

注册所有插件(对齐 PHP Service::register() 完整流程)

§流程
  1. 扫描 addons_path 下所有子目录(对齐 PHP scandir
  2. 对每个子目录解析 Plugin.php 清单(对齐 PHP autoload()
  3. 注册到 registry(对齐 PHP get_addons_instance 缓存)
  4. 不加载钩子和服务绑定(Rust 侧无 PHP 反射能力,钩子由调用方显式注册)
§错误处理
  • 单个插件解析失败不会中断整体扫描
  • 返回的 Vec<AddonLoaderError> 包含所有失败的插件错误
  • 目录读取失败返回 ScanDir 错误
Source

pub fn parse_route(&self, url: &str) -> Result<AddonRoute, AddonLoaderError>

解析路由(对齐 PHP Route::execute($addon, $controller, $action)

§错误
  • RouteParse:URL 格式错误
  • AddonNotFound:插件不存在
  • AddonDisabled:插件已禁用
  • ControllerNotFound:控制器不存在
Source

pub fn names(&self) -> Vec<String>

获取所有已注册插件名(按字母序)

Source

pub fn all_addons(&self) -> Vec<AddonManifest>

获取所有已注册插件清单(按字母序)

Source

pub fn enabled_addons(&self) -> Vec<AddonManifest>

获取所有启用的插件清单(按字母序)

Source

pub fn disabled_addons(&self) -> Vec<AddonManifest>

获取所有禁用的插件清单(按字母序)

Source

pub fn exists(&self, name: &str) -> bool

判断插件是否存在

Source

pub fn is_enabled(&self, name: &str) -> Result<bool, AddonLoaderError>

判断插件是否启用

Source

pub fn get_manifest( &self, name: &str, ) -> Result<AddonManifest, AddonLoaderError>

获取插件清单

Source

pub fn count(&self) -> usize

获取已注册插件数量

Source

pub fn resolve_class( &self, class: &str, ) -> Result<Option<PathBuf>, AddonLoaderError>

解析类名到文件路径(对齐 PHP spl_autoload_register 回调)

Source

pub fn resolve_controller( &self, addon: &str, controller: &str, ) -> Result<Option<PathBuf>, AddonLoaderError>

解析控制器类名到文件路径(对齐 PHP get_addons_class + class_exists

Source

pub fn resolve_plugin( &self, addon: &str, ) -> Result<Option<PathBuf>, AddonLoaderError>

解析插件入口类到文件路径

Trait Implementations§

Source§

impl Debug for AddonLoader

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more