yii2-extensions / psr-bridge
PSR-7 bridge for Yii2 with worker mode support
Requires
- php: >=8.1
- ext-filter: *
- ext-mbstring: *
- psr/http-factory: ^1.1
- psr/http-message: ^2.0
- psr/http-server-handler: ^1.0
- yiisoft/yii2: ^2.0.54|^22
Requires (Dev)
- httpsoft/http-message: ^1.1
- infection/infection: ^0.27|^0.32
- maglnet/composer-require-checker: ^4.1
- php-forge/coding-standard: ^0.1
- php-forge/support: ^0.3
- phpstan/extension-installer: ^1.4
- phpstan/phpstan-strict-rules: ^2.0.3
- phpunit/phpunit: ^10.5
- xepozz/internal-mocker: ^1.4
- yii2-extensions/phpstan: ^0.4
Suggests
- yii2-extensions/worker-debug: Provides Yii debug integration for PSR requests
- dev-main / 0.4.x-dev
- 0.3.0
- 0.2.1
- 0.2.0
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1.0
- dev-fix_mini_220
- dev-codex/propose-fix-for-linter-workflow-vulnerability
- dev-fix_mini_219
- dev-fix-yii-live-cycle
- dev-codex/fix-missing-aftersend-lifecycle-for-psr-responses
- dev-codex/fix-uploaded-file-handling-for-errors
- dev-codex/propose-fix-for-method-override-vulnerability
- dev-codex/fix-clearoutput-exception-handling-bug
- dev-codex/propose-fix-for-strict-yii_debug-vulnerability
- dev-codex/propose-fix-for-raw-format-error-exposure
- dev-codex/fix-psr-query-parameters-leakage
- dev-codex/fix-crash-for-missing-content-type-header
- dev-codex/propose-fix-for-yii-debug-mode-vulnerability
- dev-codex/propose-fix-for-documentation-vulnerability
- dev-codex/fix-unsafe-upload-and-debug-examples
- dev-codex/fix-scalar-body-parsing-issue
This package is auto-updated.
Last update: 2026-06-01 15:46:28 UTC
README
PSR bridge
Transform your Yii2 applications into high-performance, PSR-compliant powerhouses
Supporting traditional SAPI, RoadRunner, FrankenPHP, and worker-based architectures
Available deployment options
High-Performance Worker Mode
Long-running PHP workers for higher throughput and lower latency.
Features
Installation
composer require yii2-extensions/psr-bridge:^0.3
Quick start
Worker mode (FrankenPHP)
<?php declare(strict_types=1); // disable PHP automatic session cookie handling ini_set('session.use_cookies', '0'); require_once dirname(__DIR__) . '/vendor/autoload.php'; use yii2\extensions\frankenphp\FrankenPHP; use yii2\extensions\psrbridge\http\Application; // Load environment variables from .env file $dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__)); $dotenv->safeLoad(); // production default (change to 'true' for development) define('YII_DEBUG', filter_var($_ENV['YII_DEBUG'] ?? false, FILTER_VALIDATE_BOOLEAN)); // production default (change to 'dev' for development) define('YII_ENV', $_ENV['YII_ENV'] ?? 'prod'); require_once dirname(__DIR__) . '/vendor/yiisoft/yii2/Yii.php'; $config = require_once dirname(__DIR__) . '/config/web/app.php'; $app = new Application($config); $runner = new FrankenPHP($app); $runner->run();
Worker mode (RoadRunner)
<?php declare(strict_types=1); require __DIR__ . '/../vendor/autoload.php'; use yii2\extensions\psrbridge\http\Application; use yii2\extensions\roadrunner\RoadRunner; define('YII_DEBUG', filter_var(getenv('YII_DEBUG'), FILTER_VALIDATE_BOOLEAN)); define('YII_ENV', getenv('YII_ENV') ?? 'prod'); require __DIR__ . '/../vendor/yiisoft/yii2/Yii.php'; $config = require dirname(__DIR__) . '/config/web/app.php'; $app = new Application($config); $runner = new RoadRunner($app); $runner->run();
PSR-7 Conversion
// Convert Yii2 request to PSR-7 $request = Yii::$app->request; $psr7Request = $request->getPsr7Request(); // Convert Yii2 response to PSR-7 $response = Yii::$app->response; $psr7Response = $response->getPsr7Response(); // Emit PSR-7 response $emitter = new yii2\extensions\psrbridge\emitter\SapiEmitter(); $emitter->emit($psr7Response);
Note
This shows the low-level conversion API. Serving a full request in a long-running worker goes through the
handle() โ emit โ finalize() cycle (or a runner). See
Response lifecycle finalization.
Worker lifecycle defaults
In long-running workers, keep Application lifecycle defaults unless you have a specific requirement:
useSession=truesyncCookieValidation=trueresetUploadedFiles=true
Warning
Keep request-scoped components (request, response, errorHandler, session, user) out of
Application::$persistentComponents.
Components listed in Application::$persistentComponents (defaults to db and cache) keep loaded instances across
requests.
Define lifecycle flags before run() (via config or property setters).
$config = [ 'class' => Application::class, // disable session and cookie validation sync for stateless REST APIs. // keep resetUploadedFiles=true (default) for request isolation. 'useSession' => false, 'syncCookieValidation' => false, 'resetUploadedFiles' => true, ];
Smart Body Parsing
The bridge automatically parses incoming PSR-7 request bodies based on the Content-Type header and your configured
parsers (for example, application/json), ensuring Yii::$app->request->post() works seamlessly in worker mode without
extra boilerplate.
Documentation
For detailed configuration options and advanced usage.
- ๐ Installation Guide
- โ๏ธ Configuration Reference
- ๐ก Usage Examples
- ๐งช Testing Guide