Package Data | |
---|---|
Maintainer Username: | agungsugiarto |
Maintainer Contact: | taylor@laravel.com (Taylor Otwell) |
Package Create Date: | 2022-12-31 |
Package Last Update: | 2025-07-06 |
Home Page: | |
Language: | PHP |
License: | MIT |
Last Refreshed: | 2025-07-13 03:00:04 |
Package Statistics | |
---|---|
Total Downloads: | 16 |
Monthly Downloads: | 11 |
Daily Downloads: | 0 |
Total Stars: | 0 |
Total Watchers: | 0 |
Total Forks: | 0 |
Total Open Issues: | 0 |
PHP Mini Framework is a fast and lightweight micro-framework for building web applications with expressive and elegant syntax. This framework is a fork of Laravel Lumen that has been specifically modified and enhanced with modern PSR standards implementation, with a unique focus on seamless PSR-15 middleware integration using Laravel Pipeline as its dispatcher. This innovative approach delivers optimal performance while maintaining developer-friendly experience and universal middleware compatibility for modern PHP applications.
Modern PSR standards implementation for interoperability (PSR-3, 7, 11, 15):
Middleware with Auto Parameter Injection:
// Zero-config parameter injection for middleware
'middleware' => 'throttle:60,1|cache:3600,redis'
class ThrottleMiddleware implements MiddlewareInterface {
public function __construct(
private int $maxAttempts, // Auto: 60
private int $decayMinutes // Auto: 1
) {}
}
Smart Response Transformation:
return $user; // Model → JSON 201
return ['data' => $users]; // Array → JSON
return "Hello World"; // String → HTML
Mini Framework's MiddlewareTransformer
bridges PSR-15 middleware with Laravel Pipeline, enabling seamless integration of any PSR-15 middleware within Laravel's familiar ecosystem.
Core Transform Method:
public function transform(array $middlewares): array
{
return array_map(function ($middleware) {
return function (RequestInterface $request, Closure $next) use ($middleware) {
return $this->resolveMiddleware($middleware)->process(
$request,
new PipelineRequestHandler($next)
);
};
}, $middlewares);
}
How the Transform Process Works:
Input: Array of middleware definitions (strings, classes, instances)
['auth:api', 'throttle:60,5', CustomMiddleware::class]
Transform Output: Array of Laravel Pipeline-compatible closures
[
// Auth middleware closure with parameter
function($request, $next) {
return (new AuthMiddleware('api'))->process(
$request,
new PipelineRequestHandler($next)
);
},
// Throttle middleware closure with parameters
function($request, $next) {
return (new ThrottleMiddleware(60, 5))->process(
$request,
new PipelineRequestHandler($next)
);
},
// Custom middleware closure
function($request, $next) {
return (new CustomMiddleware())->process(
$request,
new PipelineRequestHandler($next)
);
}
]
Pipeline Execution: Laravel Pipeline processes each closure sequentially
$pipeline = new Pipeline($container);
$response = $pipeline
->send($request)
->through($transformedMiddlewares) // Our closures
->then(fn (ServerRequestInterface $request): ResponseInterface => $then($request));
The Bridge Mechanism:
($request, $next)
signaturePipelineRequestHandler
converts $next
closure to PSR-15 RequestHandlerInterface
process()
method is called with proper interfacesPipelineRequestHandler - The Bridge:
class PipelineRequestHandler implements RequestHandlerInterface
{
public function __construct(private Closure $next) {}
public function handle(ServerRequestInterface $request): ResponseInterface
{
return ($this->next)($request); // Calls Laravel Pipeline's $next
}
}
This simple adapter class enables PSR-15 middleware to call the next middleware in Laravel Pipeline by:
$next
closure in PSR-15 RequestHandlerInterface
$next($request)
call to PSR-15's $handler->handle($request)
Smart Parameter Injection:
// Definition: 'throttle:100,5'
// Resolves to: new ThrottleMiddleware(100, 5)
class ThrottleMiddleware implements MiddlewareInterface {
public function __construct(private int $maxAttempts, private int $decayMinutes) {}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// Your throttling logic here
return $handler->handle($request);
}
}
Key Benefits:
Basic Middleware:
class CustomMiddleware implements MiddlewareInterface {
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$request = $request->withAttribute('processed_at', time());
$response = $handler->handle($request);
return $response->withHeader('X-Processed-By', 'CustomMiddleware');
}
}
Parameterized Middleware:
class ThrottleMiddleware implements MiddlewareInterface {
public function __construct(private int $maxAttempts, private int $decayMinutes) {}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// Throttling logic with injected parameters
if ($this->exceedsLimit($request)) {
return new JsonResponse(['error' => 'Too many requests'], 429);
}
return $handler->handle($request);
}
}
// Usage: 'throttle:100,5' auto-injects maxAttempts=100, decayMinutes=5
Core libraries used:
laminas/diactoros
- PSR-7 HTTP message implementationnikic/fast-route
- High-performance routerilluminate/*
- Laravel components (Container, Pipeline, etc.)spatie/ignition
- Advanced error handling and debuggingPSR-15 Bridge with Laravel Pipeline - Seamlessly use any PSR-15 middleware within Laravel's pipeline ecosystem without compatibility issues.
Smart Parameter Injection - Auto-inject constructor parameters from middleware definitions using reflection with performance caching.
Universal Middleware Compatibility - Compatible with all existing PSR-15 middleware libraries, enabling code reuse across different frameworks.
# Create new application from starter template
composer create-project agungsugiarto/mini-application my-app
cd my-app
# Install framework as dependency
composer require agungsugiarto/mini-framework
# Create environment file
cp .env.example .env
# Configure database and other settings in .env
APP_ENV=local
APP_DEBUG=true
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=mini_framework
<?php
require_once 'vendor/autoload.php';
$app = new Mini\Framework\Application();
// Basic route
$app->router->get('/', function () {
return 'Hello Mini Framework!';
});
// Route with parameters
$app->router->get('/api/users/{id}', function ($id) {
return ['user_id' => $id, 'framework' => 'mini'];
});
// Route with middleware
$app->router->get('/protected', [
'middleware' => 'auth:api',
function () {
return 'Protected content';
}
]);
$app->run();
Global Middleware:
$app->middleware([
'cors',
'throttle:60,1',
CustomLoggerMiddleware::class
]);
Route-Specific Middleware:
$app->routeMiddleware([
'auth' => AuthMiddleware::class,
'throttle' => ThrottleMiddleware::class,
'cache' => CacheMiddleware::class,
]);
$app->router->get('/api/data', [
'middleware' => 'auth|throttle:100,5|cache:300',
function () {
return ['data' => 'sensitive information'];
}
]);
Pipeline Execution Flow:
// 1. Middleware string parsing
'auth|throttle:100,5|cache:300'
// Becomes: ['auth', 'throttle:100,5', 'cache:300']
// 2. MiddlewareTransformer.transform() output
[
// Each closure wraps PSR-15 middleware in Laravel Pipeline format
function($request, $next) {
$authMiddleware = new AuthMiddleware(); // No params
return $authMiddleware->process($request, new PipelineRequestHandler($next));
},
function($request, $next) {
$throttleMiddleware = new ThrottleMiddleware(100, 5); // Auto-injected params
return $throttleMiddleware->process($request, new PipelineRequestHandler($next));
},
function($request, $next) {
$cacheMiddleware = new CacheMiddleware(300); // Auto-injected param
return $cacheMiddleware->process($request, new PipelineRequestHandler($next));
}
]
// 3. Laravel Pipeline execution
$pipeline->send($request)
->through($transformedMiddlewares)
->then(fn (ServerRequestInterface $request): ResponseInterface => $then($request));
// Execution order: auth → throttle → cache → route handler → cache ← throttle ← auth
Custom PSR-15 Middleware:
class ApiKeyMiddleware implements MiddlewareInterface
{
public function __construct(private string $requiredKey) {}
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$apiKey = $request->getHeaderLine('X-API-Key');
if ($apiKey !== $this->requiredKey) {
return new JsonResponse(['error' => 'Invalid API key'], 401);
}
return $handler->handle($request);
}
}
// Register and use
$app->routeMiddleware(['apikey' => ApiKeyMiddleware::class]);
$app->router->get('/secure', ['middleware' => 'apikey:secret123', $handler]);
The framework includes comprehensive testing capabilities with PHPUnit and custom testing traits to ensure code reliability and maintainability.
# Run all tests
./vendor/bin/phpunit
# Run with coverage report
./vendor/bin/phpunit --coverage-html coverage
# Test specific files
./vendor/bin/phpunit tests/FullApplicationTest.php
./vendor/bin/phpunit tests/Cors/CorsServiceTest.php
# Copy phpunit configuration
cp phpunit.xml.dist phpunit.xml
# Customize test environment as needed
Get Help: GitHub Discussions • Issue Tracker • Documentation
Contribute: Contributors • GitHub Repository
MIT License - see LICENSE.md for complete details.
Mini Framework - Combining the power of PSR-15 with the ease of Laravel Pipeline for optimal development experience.