serafim/stream

PHP流式库

dev-master / 1.0.x-dev 2021-05-27 02:43 UTC

This package is auto-updated.

Last update: 2024-08-27 09:55:55 UTC


README

Stream

Travis CI Coverage Scrutinizer CI Latest Stable Version Latest Unstable Version License MIT Total Downloads

流式包源代码

安装

composer require serafim/stream

packagist.org上的包

简介

Stream包提供实时覆盖文件内数据的能力。

协议流

<?php

use Serafim\Stream\Stream;

Stream::create('some')
    ->tryRead(function (string $pathname): string {
        return $pathname;
    });

echo \file_get_contents('some://example'); // string(7) "example"
<?php

use Serafim\Stream\Stream;

Stream::create('four')
    ->onRead(function (string $sources): string {
        return $sources . "\n" . 'return 4;';
    });

echo require 'four://example.php'; // int(1) "4"

Composer

<?php
use Serafim\Stream\ClassLoader;

$composer = require __DIR__ . '/vendor/autoload.php';

$loader = new ClassLoader($composer);
$loader->when
    // The stream will be triggered only on those files
    // whose namespace starts with "App"
    ->namespace('App')
    ->then(function (string $sources): string {
        \var_dump(42);
        
        return $sources;
    });

// When loading this class, var_dump(42) will be displayed.
new App\Example();

Composer过滤器

每个过滤器从调用$loader->when方法开始。

过滤器where

当传递给where方法的无名函数的结果返回true时,它才会工作。

$loader->when->where(function (string $class, string $pathname): bool {
    return $class === 'User';
});

$user = new User();

过滤器not

当传递给not方法的无名函数的结果返回false时,它才会工作。

$loader->when->not(function (string $class, string $pathname): bool {
    return $class !== 'User';
});

$user = new User();

过滤器every

当在匿名函数内部应用每个规则时,如果每个规则都返回正值,则工作。

use Serafim\Stream\Filter\Conjunction;

$loader->when->every(function (Conjunction $fn) {
    $fn->where(...);
    // AND
    $fn->where(...);
});

过滤器any

当在匿名函数内部应用任何规则(一个或多个)时,如果任何规则返回正值,则工作。

use Serafim\Stream\Filter\Disjunction;

$loader->when->any(function (Disjunction $fn) {
    $fn->where(...); 
    // OR
    $fn->where(...);
});

过滤器fqn

当fqn(完全限定名)与指定的相匹配时,它才会工作。

$loader->when->fqn('App\\User');

new App\User(); // Stream works
new Some\App\User(); // Stream does not work

过滤器className

当类名与指定的相匹配时,它才会工作。

$loader->when->className('User');

new App\User(); // OK
new Any\User(); // OK

过滤器namespace

当命名空间与指定的相匹配时,它才会工作。

$loader->when->className('App');

new App\User(); // OK
new App\Message(); // OK

过滤器fileName

当文件名与指定的相匹配时,它才会工作。

$loader->when->fileName('App');

new App(); // The stream is triggered if the file name matches the class name.

过滤器pathNameMatches

如果路径匹配正则表达式,则触发流。

$loader->when->pathNameMatches('Models/.*');

过滤器fileNameMatches

如果文件名匹配正则表达式,则触发流。

$loader->when->fileNameMatches('\w+Interface');

过滤器classNameMatches

如果类名匹配正则表达式,则触发流。

$loader->when->classNameMatches('\w+Interface');

过滤器fqnMatches

如果fqn(完全限定名)匹配正则表达式,则触发流。

$loader->when->fqnMatches('App\\.*?\\\w+Interface');

过滤器withVendors

如果文件是从供应商目录加载的(默认情况下,忽略所有供应商文件),则触发流。

$loader->when->withVendors();