滑雪板插件开发

Introduction

Snowboard 框架被设计成可扩展和可定制的,以满足您的项目需求。为此,以下文档详细介绍了框架的概念,以及如何开发自己的功能来扩展或替换 Snowboard 中的功能。

框架概念

Snowboard 致力于包含应用程序的概念,它充当功能的基础,然后通过插件进行扩展。通信和功能的主要方法是通过使用JavaScript 类 它提供实例和可扩展性,以及全局事件 - Snowboard 内置的功能。

以下类和摘要包含在 Snowboard 框架中。

滑雪板类

Snowboard 类是应用程序的表示。它是框架内添加、管理和访问功能的要点,与使用同义jQuery 或者Vue 在你的脚本中。它被注入到全局 JavaScript 作用域中,可以通过Snowboard 变量在应用程序中的任何位置之后{% snowboard %} 使用标签。

此外,Snowboard 被注入到所有用作插件入口点的插件类中,可以通过this.snowboard 在入口插件类中。

// All these should work to use Snowboard globally
Snowboard.getPlugins();
snowboard.getPlugins();
window.Snowboard.getPlugins();

// In your plugin, Snowboard can also be accessed as a property.
class MyPlugin extends PluginBase {
  myMethod() {
    this.snowboard.getPlugins();
  }
}

Snowboard 类提供以下公共 API,用于管理插件和调用全局事件:

Method Parameters Description
addPlugin name(String)
instance(PluginBase)
向 Snowboard 框架添加一个插件。该名称应该是唯一的名称,除非您打算替换预定义的插件。该实例应该是PluginBase 或 Singleton 代表插件“入口”点的实例。
removePlugin name(String) 删除插件(如果存在)。删除插件时,插件的所有活动实例都将被销毁。
hasPlugin name(String) 退货true 如果已添加具有给定名称的插件。
getPlugin name(String) 返回PluginLoader 给定插件的实例(如果存在)。如果不存在,将抛出错误。
getPlugins 返回添加插件的对象作为PluginLoader 实例,以插件名称为键。
getPluginNames 按名称将所有添加的插件作为字符串数组返回。
listensToEvent eventName(String) 为侦听给定事件名称的所有插件返回一个插件名称数组作为字符串。这适用于 Promise 和非 Promise全球事件.
globalEvent eventName(String)
...parameters
调用非 Promise全球事件.这将触发所有侦听给定事件的插件的事件回调。可以为该方法提供额外的参数,这些参数将被转发到事件回调。这个方法返回false 如果事件被插件取消。
globalPromiseEvent eventName(String)
...parameters
呼唤承诺全球事件.这将触发所有侦听给定事件的插件的事件回调。可以为该方法提供额外的参数,这些参数将被转发到事件回调。此方法返回一个 Promise,根据插件事件回调的响应,该 Promise 将被解决或拒绝。
debug ...parameters 当应用程序处于调试模式时,此方法将调试消息记录到控制台。每条日志消息都可以同时显示一个或多个参数,并且包括直到进行调试调用为止的整个调用堆栈的跟踪。

在滑雪板中调试

Snowboard 类提供了一个debug 允许开发人员轻松调试其 Snowboard 应用程序和插件的方法。此方法仅在 Winter 应用程序处于调试模式时有效('debug' => true 在里面config/app.php 文件)。

可以在任何可以访问 Snowboard 类的地方调用调试。

// Globally
Snowboard.debug('This is a debug message');

// Within a plugin
class MyPlugin extends PluginBase {
  myMethod() {
    this.snowboard.debug('Debugging my plugin', this);
  }
}

通常,您会使用的第一个参数debug 方法来声明调试消息。从那里,可以添加额外的参数以提供额外的上下文。该方法会将折叠的调试消息打印到浏览器上的开发人员控制台。您可以在控制台中扩展调试消息以查看堆栈跟踪,显示直到触发调试消息时的整个调用堆栈。

插件加载器类

PluginLoader 类是您的应用程序(即单板滑雪课) 和插件。它的行为类似于“工厂”,提供和管理插件的实例,并允许 Snowboard 应用程序与这些实例进行通信。它还提供了基本级别的模拟,以允许动态测试或覆盖插件的各个方法。

每个 PluginLoader 实例将代表一个插件。

通常,您不需要直接与此类交互 - 大多数面向开发人员的功能应该在 Snowboard 类或插件本身上完成。因此,我们只会记录那些方法may 供开发人员访问。

Method Parameters Description
hasMethod methodName(String) 退货true 如果插件通过给定的名称定义了一个方法。
getInstance ...parameters 返回插件的实例。请参阅插件实例化 下面的部分了解更多信息。
getInstances 返回插件的所有当前实例。
getDependencies 以字符串形式返回当前插件所依赖的所有插件名称的数组。
dependenciesFulfilled 退货true 如果当前插件的依赖项已经完成。
mock methodName(String)
callback(Function)
为当前插件定义一个模拟,用提供的回调替换给定的方法。见Mocking 部分了解更多信息。
unmock methodName(String) 恢复以前模拟的方法的原始功能。见Mocking 部分了解更多信息。

PluginBaseSingleton 文摘

这些类是 Snowboard 中所有插件的基础,代表每个插件包含的基本功能。创建插件类时,您几乎总是会扩展这些抽象类之一。

基于插件的可重用性以及它在项目的 JavaScript 功能过程中实例化的方式,这些抽象之间有两个主要区别:

Detail PluginBase Singleton
Reusability 每次使用插件都会创建一个新的插件实例 插件的每次使用都使用相同的实例。
Instantiation 需要使用的时候必须手动实例化 加载页面时自动实例化

分离的原因是为了更好地定义插件的使用方式。为了PluginBase,当您希望每个实例都有自己的范围和数据时,您可以使用它。相反,你会使用Singleton 如果您希望无论使用多少次插件都共享相同的数据和范围。

以下是您何时会使用其中一个或另一个的一些示例:

全球事件

全局事件是 Snowboard 框架的固有特性,允许 Snowboard 插件在某些功能过程中响应特定事件,在概念上类似于 DOM 事件或 Winter CMS 的事件功能。

任何全局事件都涉及两个实体:

还有两种类型的全局事件可以触发,它们是:

在实践中,对于不需要等待响应的事件(异步事件),您通常会使用标准事件。在所有其他情况下,您将使用 Promise 事件,它允许所有监听类在适当的时候响应该事件,并且只有在所有监听类都解决了他们的响应(同步事件)后才继续进行。

通过调用globalEvent 或者globalPromiseEvent 方法直接在主 Snowboard 类上。

// Standard event
snowboard.globalEvent('myEvent');

// Promise event
snowboard.globalPromiseEvent('myPromiseEvent').then(
  () => {
    // functionality when the promise is resolved
  },
  () => {
    // functionality when the promise is rejected
  }
);

对于注册为监听类的插件,它必须指定一个listens 返回对象的插件类中的方法。每个键都应该是正在侦听的全局事件,值应该是类中将在触发时处理事件的方法的名称。无论事件是标准事件还是 Promise 事件,这都是一样的。

class MyPlugin extends PluginBase {
  listens() {
    return {
      ready: 'ready',
      eventName: 'myHandler',
    };
  }

  ready() {
    // This method is run when the `ready` global event is fired.
  }

  myHandler(context) {
    // This method is run when the `eventName` global event is fired.
  }
}

全局事件可以在事件名称后指定一个或多个参数,这些参数将作为侦听器方法的参数传递给侦听器。

// Adding more parameters to the global event...
snowboard.globalEvent('myEvent', 'parameterOne', 'parameterTwo');

// Makes them available to the listeners as arguments inside a plugin listener!
myHandler(param1, param2) {
  console.log(param1); // "parameterOne"
  console.log(param2); // "parameterTwo"
}

Snowboard 只有一个被触发的内置全局事件 -ready 事件 - 当加载 DOM 并且页面准备就绪时触发。此事件与 jQuery 的同义ready 事件,主要用于实例化已经注册到Snowboard的Singletons。

Dependencies

Snowboard 包括一个简单的依赖系统,允许插件指定它需要其他 Snowboard 插件在给定插件工作之前处于活动状态。如果插件源文件被延迟或被乱序加载,这个系统将允许一些处理措施。

它被称为“简单”依赖系统,因为 JavaScript 不像 PHP 语言那样具有接口或类定义的概念,因此无法强制执行严格的结构。相反,我们只是检查插件是否已使用特定名称注册。

定义依赖关系就像提供一个dependencies 提供插件打算使用的插件名称数组的方法:

class MyPlugin extends PluginBase {
  dependencies() {
    return ['anotherPlugin'];
  }
}

Snowboard.addPlugin('myPlugin', MyPlugin);

如果我们现在使用这个插件,它会抛出一个错误,指出anotherPlugin 依赖性没有得到满足。因此,我们需要另一个插件来满足这种依赖:

class AnotherPlugin extends PluginBase {
}

Snowboard.addPlugin('anotherPlugin', AnotherPlugin);

现在,使用myPlugin 上面的插件可以正常工作。

对于单例,依赖性检查稍微更受控制。由于单身人士有他们的ready 事件自动触发,将检查依赖关系以确保满足单例的依赖关系。如果不是,则ready 事件将被推迟,直到相关性得到满足。这样,单例仍然保持其自动就绪状态,但允许将插件加载推迟或延迟到必要时。

class MySingleton extends Singleton {
  dependencies() {
    return ['myDependency'];
  }

  ready() {
    // This method won't fire until a plugin registers with the "myDependency" name
  }
}
豫ICP备18041297号-2