Sources Streaming Package
Installation
composer require serafim/stream
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 workFilter className
Works in the case when the class name corresponds to the specified.
$loader->when->className('User');
new App\User(); // OK
new Any\User(); // OKFilter namespace
Works in the case when the namespace corresponds to the specified.
$loader->when->className('App');
new App\User(); // OK
new App\Message(); // OKFilter 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();
Formed in 2009, the Archive Team (not to be confused with the archive.org Archive-It Team) is a rogue archivist collective dedicated to saving copies of rapidly dying or deleted websites for the sake of history and digital heritage. The group is 100% composed of volunteers and interested parties, and has expanded into a large amount of related projects for saving online and digital history.



