# Changelog ## 0.16.0 (2024-03-05) We are thrilled to announce the official release of `v0.16.0` to the public! πŸŽ‰πŸš€ Additionally, we are making all previous tagged versions available to simplify the upgrade process. In addition to the release of `v0.16.0`, this update includes all prior tagged releases. This release includes exciting new features such as improved performance, additional options for access logging, updates to our documentation and nginx + Apache configurations, as well as many more internal improvements to our test suite and integration tests. * Feature: Improve performance by skipping `AccessLogHandler` if it writes to `/dev/null`. (#248 by @clue) * Feature: Add optional `$path` argument for `AccessLogHandler`. (#247 by @clue) * Minor documentation improvements and update nginx + Apache configuration. (#245 and #251 by @clue) * Improve test suite with improved directory structure for integration tests. (#250 by @clue) ## 0.15.0 (2023-12-07) * Feature: Full PHP 8.3 compatibility. (#244 by @clue) * Feature: Add `App::__invoke()` method to enable custom integrations. (#236 by @clue) * Feature: Improve performance by only using `FiberHandler` for `ReactiveHandler`. (#237 by @clue) * Minor documentation improvements. (#242 by @yadaiio) ## 0.14.0 (2023-07-31) * Feature: Improve Promise v3 support and use Promise v3 template types. (#233 and #235 by @clue) * Feature: Improve handling `OPTIONS *` requests. (#226 by @clue) * Refactor logging into new `LogStreamHandler` and reactive server logic into new `ReactiveHandler`. (#222 and #224 by @clue) * Improve test suite and ensure 100% code coverage. (#217, #221, #225 and #228 by @clue) ## 0.13.0 (2023-02-22) * Feature: Forward compatibility with upcoming Promise v3. (#188 by @clue) * Feature: Full PHP 8.2 compatibility. (#194 and #207 by @clue) * Feature: Load environment variables from `$_ENV`, `$_SERVER` and `getenv()`. (#205 by @clue) * Feature: Update to support `Content-Length` response header on `HEAD` requests. (#186 by @clue) * Feature / Fix: Consistent handling for HTTP responses with multiple header values (PHP SAPI). (#214 by @pfk84) * Fix: Respect explicit response status code when Location response header is given (PHP SAPI). (#191 by @jkrzefski) * Minor documentation improvements. (#189 by @clue) * Add PHPStan to test environment on level `max` and improve type definitions. (#200, #201 and #204 by @clue) * Improve test suite and report failed assertions. (#199 by @clue and #208 by @SimonFrings) ## 0.12.0 (2022-08-03) * Feature: Support loading environment variables from DI container configuration. (#184 by @clue) * Feature: Support typed container variables for container factory functions. (#178, #179 and #180 by @clue) * Feature: Support nullable and `null` arguments and default values for DI container configuration. (#181 and #183 by @clue) * Feature: Support untyped and `mixed` arguments for container factory. (#182 by @clue) ## 0.11.0 (2022-07-26) * Feature: Make `AccessLogHandler` and `ErrorHandler` part of public API. (#173 and #174 by @clue) ```php run(); ``` * Feature: Support loading `AccessLogHandler` and `ErrorHandler` from `Container`. (#175 by @clue) * Feature: Read `$remote_addr` attribute for `AccessLogHandler` (trusted proxies). (#177 by @clue) * Internal refactoring to move all handlers to `Io` namespace. (#176 by @clue) * Update test suite to remove deprecated `utf8_decode()` (PHP 8.2 preparation). (#171 by SimonFrings) ## 0.10.0 (2022-07-14) * Feature: Built-in support for fibers on PHP 8.1+ with stable reactphp/async. (#168 by @clue) ```php $app->get('/book/{isbn}', function (Psr\Http\Message\ServerRequestInterface $request) use ($db) { $isbn = $request->getAttribute('isbn'); $result = await($db->query( 'SELECT title FROM book WHERE isbn = ?', [$isbn] )); assert($result instanceof React\MySQL\QueryResult); $data = $result->resultRows[0]['title']; return React\Http\Message\Response::plaintext( $data ); }); ``` * Feature: Support PSR-11 container interface by using DI container as adapter. (#163 by @clue) * Minor documentation improvements. (#158 by @clue and #160 by @SimonFrings) ## 0.9.0 (2022-05-13) * Feature: Add signal handling support for `SIGINT` and `SIGTERM`. (#150 by @clue) * Feature: Improve error output for exception messages with special characters. (#131 by @clue) * Add new documentation chapters for Docker containers and HTTP redirecting. (#138 by SimonFrings and #136, #151 and #156 by @clue) * Minor documentation improvements. (#143 by @zf2timo, #153 by @mattschlosser and #129 and #154 by @clue) * Improve test suite and add tests for `Dockerfile` instructions. (#148 and #149 by @clue) ## 0.8.0 (2022-03-07) * Feature: Automatically start new fiber for each request on PHP 8.1+. (#117 by @clue) * Feature: Add fiber compatibility mode for PHP < 8.1. (#128 by @clue) * Improve documentation and update installation instructions for react/async. (#116 and #126 by @clue and #124, #125 and #127 by @SimonFrings) * Improve fiber tests to avoid now unneeded `await()` calls. (#118 by @clue) ## 0.7.0 (2022-02-05) * Feature: Update to use HTTP status code constants and JSON/HTML response helpers. (#114 by @clue) ```php $app->get('/users/{name}', function (Psr\Http\Message\ServerRequestInterface $request) { return React\Http\Message\Response::plaintext( "Hello " . $request->getAttribute('name') . "!\n" ); }); ``` * Feature / Fix: Update to improve protocol handling for HTTP responses with no body. (#113 by @clue) * Minor documentation improvements. (#112 by @SimonFrings and #115 by @netcarver) ## 0.6.0 (2021-12-20) * Feature: Support automatic dependency injection by using class names (DI container). (#89, #92 and #94 by @clue) ```php get('/', Acme\Todo\HelloController::class); $app->get('/users/{name}', Acme\Todo\UserController::class); $app->run(); ``` * Feature: Add support for explicit DI container configuration. (#95, #96 and #97 by @clue) ```php fn() => new Acme\Todo\HelloController(); Acme\Todo\UserController::class => function (React\Http\Browser $browser) { // example UserController class requires two arguments: // - first argument will be autowired based on class reference // - second argument expects some manual value return new Acme\Todo\UserController($browser, 42); } ]); // … ``` * Feature: Refactor to use `$_SERVER` instead of `getenv()`. (#91 by @bpolaszek) * Minor documentation improvements. (#100 by @clue) * Update test suite to use stable PHP 8.1 Docker image. (#90 by @clue) ## 0.5.0 (2021-11-30) * Feature / BC break: Simplify `App` by always using default loop, drop optional loop instance. (#88 by @clue) ```php // old $loop = React\EventLoop\Loop::get(); $app = new FrameworkX\App($loop); // new (already supported before) $app = new FrameworkX\App(); ``` * Add documentation for manual restart of systemd service and chapter for Caddy deployment. (#87 by @SimonFrings and #82 by @francislavoie) * Improve documentation, remove leftover `$loop` references and fix typos. (#72 by @shuvroroy, #80 by @Ivanshamir, #81 by @clue and #83 by @rattuscz) ## 0.4.0 (2021-11-23) We are excited to announce the official release of Framework X to the public! πŸŽ‰πŸš€ This release includes exciting new features such as full compatibility with PHP 8.1, improvements to response handling, and enhanced documentation covering nginx, Apache, and async database usage. * Feature: Announce Framework X public beta. (#64 by @clue) * Feature: Full PHP 8.1 compatibility. (#58 by @clue) * Feature: Improve `AccessLogHandler` and fix response size for streaming response body. (#47, #48, #49 and #50 by @clue) * Feature / Fix: Skip sending body and `Content-Length` for responses with no body. (#51 by @clue) * Feature / Fix: Consistently reject proxy requests and handle `OPTIONS *` requests. (#46 by @clue) * Add new documentation chapters for nginx, Apache and async database. (#57, #59 and #60 by @clue) * Improve documentation, examples and describe HTTP caching and output buffering. (#52, #53, #55, #56, #61, #62 and #63 by @clue) ## 0.3.0 (2021-09-23) * Feature: Add support for global middleware. (#23 by @clue) * Feature: Improve error output and refactor internal error handler. (#37, #39 and #41 by @clue) * Feature: Support changing listening address via new `X_LISTEN` environment variable. (#38 by @clue) * Feature: Update to new ReactPHP HTTP and Socket API. (#26 and #29 by @HLeithner and #34 by @clue) * Feature: Refactor to use new `AccessLogHandler`, `RouteHandler`, `RedirectHandler` and `SapiHandler`. (#42, #43, #44 and #45 by @clue) * Fix: Fix path filter regex. (#27 by @HLeithner) * Add documentation for async middleware and systemd service unit configuration. (#24 by @Degra1991 and #32, #35, #36 and #40 by @clue) * Improve test suite and run tests on Windows with PHPUnit. (#31 by @SimonFrings and #28 and #33 by @clue) ## 0.2.0 (2021-06-18) * Feature: Simplify `App` usage by making `LoopInterface` argument optional. (#22 by @clue) ```php // old (still supported) $loop = React\EventLoop\Factory::create(); $app = new FrameworkX\App($loop); // new (using default loop) $app = new FrameworkX\App(); ``` * Feature: Add middleware support. (#18 by @clue) * Feature: Refactor and simplify route dispatcher. (#21 by @clue) * Feature: Add Generator-based coroutine implementation. (#17 by @clue) * Minor documentation improvements. (#15, #16 and #19 by @clue) ## 0.1.0 (2021-04-30) We're excited to announce the release of the first version of Framework X in private beta! This version marks the starting point of our project and is the first of many milestones for making async PHP easier than ever before. * Release Framework X, major documentation overhaul and improve examples. (#14, #13 and #2 by @clue) * Feature: Support running behind nginx and Apache (PHP-FPM and mod_php). (#3, #11 and #12 by @clue) * Feature / Fix: Consistently parse request URI and improve URL handling. (#4, #5, #6 and #7 by @clue) * Feature: Rewrite `FilesystemHandler`, improve file access and directory listing. (#8 and #9 by @clue) * Feature: Add `any()` router method to match any request method. (#10 by @clue)