/纹状体

此包已被废弃,不再维护。没有建议的替代包。

观察者模式包和WordPress钩子API。

0.1.0 2016-02-23 17:37 UTC

This package is auto-updated.

Last update: 2023-02-26 11:02:51 UTC


README

Striatum是一个处理WordPress钩子OOP方式的包(不是完整的插件)。

它使用composer嵌入到更大的项目中,并实现观察者模式以处理WordPress钩子。它从PHP SPL库中采用了两个模式接口,SubjectObserver

它是Brain项目的一个模块。

##目录##

##阅读更多##

##快速开始## Striatum非常易于使用,例如添加操作就像这样简单

Brain\Hooks::addAction( 'myplugin.init', 'init', [ new MyPlugin, 'init' ] );

或触发自定义操作或过滤器

// action
Brain\Hooks::trigger( 'foo_action', $optional_1, $optional_2, $and_so_on );

 // filter
$filtered = Brain\Hooks::filter( 'bar_filter', $unfiltered, $optional_1 );

通过Brain\Hooks API外观提供的所有功能都在API文档页面上有记录。(在探讨静态方法之前,请阅读这里)。

##特性##

  1. 以绝对核心兼容的方式向核心钩子添加操作和过滤器
  2. 移除(或编辑)任何添加的回调,即使是对象方法或闭包
  3. 自动移除钩子:添加在执行特定次数后自动移除自己的回调
  4. 钩子冻结解冻:暂时禁用添加到一个或多个钩子的回调,然后再重新启用它们
  5. 使用一个函数将相同的回调添加到多个钩子
  6. 高级调试钩子
  7. 流畅(链式)编码风格

##更多信息##

在WordPress中,有钩子回调。钩子由一个标签(例如'init''the_content')标识,并且对于每个标签都可以附加多个回调。每个回调有两个额外的属性:优先级和接受的参数。在Striatum中,每个标签都有自己的主题对象,而不是回调,Striatum使用观察者对象,并且每个观察者都有与WordPress中相同的属性:回调、优先级和接受的参数。此外,Striatum观察者还有一些额外的属性,最重要的是id,但还有'次数'和'debug'。另一个重要的属性是'is_filter',当为真时,使主题对象成为过滤器而不是操作。

###WordPress核心兼容###

Striatum与WordPress核心钩子完全兼容:在观察者模式接口的具体实现中,主题方法attachdetachnotify在内部使用WordPress插件API函数实现。

###“钩子ID”关键概念###

为了识别特定的回调函数,WordPress会构建一个唯一的ID。当回调函数是一个字符串(普通函数)或一个包含两个字符串的数组(对象静态方法)时,这个唯一的ID是可以预测的,但当使用动态对象方法或更糟糕的匿名函数(闭包)时,WordPress将使用spl_object_hash,识别特定的回调函数就会变得痛苦。有关更多信息,建议阅读这两个WordPress开发(Stack Exchange)的回答,@toscho(Thomas Scholz)的这篇,以及我自己的这篇。Sstriatum强制为每个添加的钩子(观察者)设置一个ID属性,这样就可以使用该ID来检索、删除、编辑或调试钩子对象。

###API###

Sstriatum包附带了一个API,它可以简化其使用,无需获取、实例化或深入包对象。API在类中定义,存储在“大脑”(Pimple)容器中,ID为"hooks.api"。因此,可以使用Brain实例获取它,例如:$api = Brain\Container::instance()->get("hooks.api"),然后调用以这种方式获取的实例上的所有API函数。然而,这样做并不容易使用,尤其是对于那些习惯于仅使用普通函数来添加和触发钩子的人来说。这就是为什么包还附带了一个facade类。这个术语并不是指门面模式,而是指Laravel门面,这种方法(不是实际代码)是从那里来的:在类中没有真正的静态方法,而是一个单一的__callstatic方法,它将API方法代理到适当的实例化对象。

门面类名为Hooks,在Brain命名空间内。使用它,添加钩子就像这样

Brain\Hooks::addAction( 'plugin.init', 'init', [ new MyPlugin, 'init' ] );

addAction方法的设计几乎与核心add_action函数的签名相同,所以几乎有相同的参数。它只区别于第一个参数,即钩子ID:使用'plugin.init',可以检索、编辑、删除和调试添加的钩子。

所有通过Brain\Hooks门面类可用的函数都记录在API文档中。

###嵌入到OOP项目中###

静态门面类很容易使用,但是以这种方式在其他类中使用,会在那里创建对Sstriatum的硬编码依赖。此外,对其他类进行隔离测试实际上变得不可能。为了解决这些问题,最简单的方法是使用依赖注入的组合。事实上,Brain\Hooks门面类可以以动态的方式使用,如下所示

$hooks = new Brain\Hooks;
$hooks->addAction( 'plugin.init', 'init', [ new MyPlugin, 'init' ] );

查看Brain\Hooks类的代码,你会发现两种方法之间没有任何区别,但使用后者可以在其他类中注入类的实例。以下是一个示例

class A_Plugin_Class {
    
  function __construct( \Brain\Hooks $hooks ) {
    $this->hooks = $hooks;
  }
      
  function get_a_filtered_value( $a_value ) {
    return $this->hooks->filter( 'a_filter', $a_value, $this );
  }
      
}

get_a_filtered_value方法使用$this->hooks属性来调用Sstriatum API方法。对方法进行隔离测试也很简单,以下是一个使用PHPUnit和Mockery的示例

class A_Plugin_Class_Test () {
    
  test_get_a_filtered_value() {
    $hooks = \Mockery::mock('\Brain\Hooks');
    $hooks->shouldReceive( 'filter' )
      ->once()
      ->with( 'a_filter', 'foo' )
      ->andReturn( 'bar' );
    $class = new A_Plugin_Class( $hooks );
    $this->assertEquals( 'bar', $class->get_a_filtered_value( 'foo' ) );
  }
}

因此,该方法是在隔离状态下测试的,模拟了过滤器的行为:简单直接。

如果类使用了核心的apply_filters,那么这个简单的测试将非常困难,并且需要像10up的wp_mock或更简单但功能较弱的HooksMock这样的测试包。

###注意!###

纹状体是大脑模块。正如您可以在 Brain 读取me 中阅读到的,它在 after_setup_theme 上以优先级 0 自举自己和其模块,这意味着您 不能使用纹状体将回调附加到在 after_setup_theme 之前触发的钩子

after_setup_theme 之前触发的钩子并不多,而且所有钩子都仅适用于插件,不适用于主题,所以如果您在主题中使用纹状体,您不会错过任何东西。纹状体中 不可用 的主要钩子包括:muplugins_loaded(仅适用于mu插件)、plugins_loadedsanitize_comment_cookiessetup_themeload_textdomain

###要求###

  • PHP 5.4+
  • Composer(用于安装)
  • WordPress 3.9(它 可能 与早期版本兼容,但没有经过测试,版本 < 3.9 将永远不会得到支持)。

###安装###

您需要 Composer 来安装此包。它托管在 Packagist 上,因此您需要做的只是将 "brain/striatum": "dev-master" 插入您的 composer.json 中的 require 对象。

{
    "require": {
        "php": ">=5.4",
        "brain/striatum": "dev-master"
    }
}

有关如何安装 Composer 及其包的说明,请参阅 Composer 文档

###代号:纹状体###

纹状体,也称为 新纹状体条纹状核,是前脑的皮层下部分。似乎人类对时间的感觉就位于这部分大脑中。

纹状体之所以被称为纹状体,是因为它是 Brain 模块,并且它的功能涉及 WordPress 的 时间 方面:钩子

###开发人员及贡献者###

该包对贡献者和拉取请求开放。它附带了一组针对 PHPUnit 套件编写的单元测试。请在提交 PR 之前确保所有测试通过。要运行测试,请以独立模式安装包(即 'vendor' 文件夹位于包文件夹内)。在 dev 模式下安装时,纹状体还会安装 Mockery,这是一个功能强大的模拟测试工具,以及 HooksMock,这是一个专门为测试纹状体编写的包。

###许可证###

纹状体代码的许可证为 GPLv2+。通过 Composer,它从以下位置安装代码: