composer require serafim/stream
Stream package provides the ability to override the data contained within the files in real time.
<?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"
<?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();
Each filter starts with calling the $loader->when
method.
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();
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();
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(...);
});
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(...);
});
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
Works in the case when the class name corresponds to the specified.
$loader->when->className('User');
new App\User(); // OK
new Any\User(); // OK
Works in the case when the namespace corresponds to the specified.
$loader->when->className('App');
new App\User(); // OK
new App\Message(); // OK
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.
The stream is triggered if the path matches the regular expression.
$loader->when->pathNameMatches('Models/.*');
The stream is triggered if the file name matches the regular expression.
$loader->when->fileNameMatches('\w+Interface');
The stream is triggered if the class name matches the regular expression.
$loader->when->classNameMatches('\w+Interface');
The stream is triggered if the fqn (Fully qualified name) matches the regular expression.
$loader->when->fqnMatches('App\\.*?\\\w+Interface');
The stream is triggered if the file is loaded from the vendor directory (by default, all vendor files are ignored)
$loader->when->withVendors();