serafim/stream

PHP streaming library

dev-master 2019-01-01 20:10 UTC

README

Stream

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

Sources Streaming Package

Installation

composer require serafim/stream

Package on packagist.org

Introduction

Stream package provides the ability to override the data contained within the files in real time.

Protocol Streaming

<?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 Filters

Each filter starts with calling the $loader->when method.

Filter where

It works when the result of an anonymous function passed to the method where returns the true.

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

$user = new User();

Filter not

It works when the result of an anonymous function passed to the method not returns the false.

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

$user = new User();

Filter every

Works when each rule applied inside an anonymous function returns a positive result.

use Serafim\Stream\Filter\Conjunction;

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

Filter any

Works when any (one of) rule applied inside an anonymous function returns a positive result.

use Serafim\Stream\Filter\Disjunction;

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

Filter fqn

Works in the case when the fqn (Fully qualified name) corresponds to the specified.

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

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

Filter className

Works in the case when the class name corresponds to the specified.

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

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

Filter namespace

Works in the case when the namespace corresponds to the specified.

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

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

Filter fileName

Works in the case when the file name corresponds to the specified.

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

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

Filter pathNameMatches

The stream is triggered if the path matches the regular expression.

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

Filter fileNameMatches

The stream is triggered if the file name matches the regular expression.

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

Filter classNameMatches

The stream is triggered if the class name matches the regular expression.

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

Filter fqnMatches

The stream is triggered if the fqn (Fully qualified name) matches the regular expression.

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

Filter withVendors

The stream is triggered if the file is loaded from the vendor directory (by default, all vendor files are ignored)

$loader->when->withVendors();