PHP.GT

Latest releases

Routing: Escape logic stream tokens

Published on by Greg Bowler

This minor release checks depply-nested tokens within logic stream wrappers, for usage of any type of class reference, so they can be correctly escaped. This resolves an obscure bug when using global classes from within WebEngine component logic files.

What’s Changed

Full Changelog: https://github.com/phpgt/Routing/compare/v1.1.8...v1.1.9

Json: Errors with status codes

Published on by Greg Bowler

This release includes various dependency bumps, but there is a purposeful backwards incompatible change within JSONDocument that means this is a minor version increase rather than simply a patch release.

JSONDocument::error now requires a statusCode parameter as the second parameter, defaulting to 400. Apart from that, no more changes in this release.

What’s Changed

Full Changelog: https://github.com/phpgt/Json/compare/v2.2.1...v2.3.0

Routing: Get effective accept header

Published on by Greg Bowler

  • RouterConfig::defaultContentType is now used when the request Accept header is empty or wildcard-only, such as */*.
  • This allows applications to control the default route preference for clients like curl, while preserving normal content negotiation for explicit browser Accept headers.
  • Added test coverage for wildcard and empty Accept headers defaulting to configured content types.

Cron: Custom expressions and running tasks now

Published on by Greg Bowler

This release makes the runner more useful during development, and opens up the schedule parser for project-specific behaviour. We can now use custom ExpressionFactory implementations to teach the parser extra schedule tokens, such as @start, while still falling back to ordinary cron expressions. The built-in parser also accepts nickname schedules including @hourly, @daily, @weekly, @monthly, @yearly, and @annually.

The crontab syntax now supports second-precision schedules with an s suffix in the first field:

  • */10s * * * * hello

That runs hello every 10 seconds, which is useful for local development, short-running workers, or jobs where minute precision is not enough.

The CLI has gained a more targeted –now mode. We can still run every task immediately:

  • vendor/bin/cron --now

Or run one named job by its displayed command name:

  • vendor/bin/cron --now hello

This works well with --watch, so a single job can be triggered once before the normal schedule continues.

Runner output is also clearer. It now prints the current time, shows the next job name, and includes the UTC time when the local timezone is not UTC. The runner detects the system timezone from TZ, /etc/localtime, or /etc/timezone.

Other improvements include better command display names for scripts, static methods, and query-string script calls; corrected alias loading for go() scripts; updated examples; and updated development tooling, including PHP_CodeSniffer 4 support.

GtCommand: INI / JSON defaults

Published on by Greg Bowler

This release brings a few helpful quality-of-life improvements for WebEngine projects.

The gt build command now looks for the default build configuration in INI format first, falling back to JSON when needed. This keeps newer projects working smoothly while continuing to support existing build.default.json setups.

There is also a new gt test command, which runs any configured PHP and JavaScript test suites it finds in composer.json and package.json. This gives teams a single, convenient command for checking their project from the CLI.

Project creation has been made a little easier too: gt create now supports an --empty option for starting with the empty blueprint, using the default App namespace automatically.

What’s changed

  • Added support for build.default.ini, with JSON still supported as a fallback.
  • Added gt test for Composer and npm test scripts.
  • Added gt create --empty for simpler empty project creation.
  • Updated the README to include the new test command.

These changes should make day-to-day project setup, building and testing a bit smoother for everyone using GtCommand.

Flux: First stable release

Published on by Greg Bowler

What’s Changed

New Contributors

Full Changelog: https://github.com/phpgt/Flux/commits/v1.0.0

WebEngine: June 2026 release

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/WebEngine/compare/v5.0.0...v5.0.1

Fetch: June 2026 release

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/Fetch/compare/v1.2.2...v1.2.3

Database: DevMigrator

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/Database/compare/v1.7.0...v1.7.1

Daemon: Callback on completion and asterisk output

Published on by Greg Bowler

In this release we see the GT refactoring complete and two new features. The first is a callback function for when a process completes. The second is to remove the word ERROR from STDERR output - this might not be an error - instead, we use an asterisk to mark that the output is going to STDERR.

What’s Changed

Full Changelog: https://github.com/phpgt/Daemon/compare/v1.1.5...v1.1.6

DomTemplate: List Binding Normalisation

Published on by Greg Bowler

  • Fixed bindListCallback() so callback data includes values from #[BindGetter] methods, not just direct bindable properties. This closes #524.
  • Updated object list binding so bindable objects are normalised before nested-list detection. This allows objects with bindable getters to be treated as key-value bind data inside list callbacks.
  • Fixed unnamed list resolution when a context contains deeper named list templates. Unnamed bindList() calls now ignore named list elements while searching for the correct unnamed template, avoiding cases where a nested named list is selected incorrectly.
  • Added ListElement::isNamed() to distinguish explicit named templates from unnamed data-list templates.
  • Made bind attribute detection namespace-case-insensitive, covering GT\... vs Gt\... attribute class name differences.
  • Updated namespace references from Gt\Dom to GT\Dom across source files.
  • Test coverage has been improved around bindList() and BindGetter usage.

PRs included in this release

Full Changelog: https://github.com/phpgt/DomTemplate/compare/v3.6.1...v3.6.2

SqlBuilder: May 2026 release

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/SqlBuilder/compare/v1.0.1...v1.0.2

Cipher: May 2026 release

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/Cipher/compare/v1.0.1...v1.0.2

WebEngine: v5

Published on by Greg Bowler

WebEngine v5 is a substantial refactor of the framework’s core. If you’ve used previous versions, the philosophy will feel familiar and unchanged: start static-first, keep logic close to the URL it serves, and let the framework step aside as quickly as possible. What has changed in v5 is how much cleaner, more testable and more explicit the internals have become.

This release focuses on making the request-response lifecycle easier to reason about, improving support for non-HTML responses, and giving applications more control over redirects, errors and runtime behaviour. A lot of the work in this version is under the bonnet, but it should still be felt directly in day-to-day development.

Read the whole discussion here: https://github.com/orgs/phpgt/discussions/664

DomTemplate: Bind attribute improvements

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/DomTemplate/compare/v3.5.1...v3.5.2

Csrf: v1.9.1

Published on by Greg Bowler

What’s Changed

Full Changelog: https://github.com/phpgt/Csrf/compare/v1.9.0...v1.9.1