All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
RouterInterfaceextending PSR-15RequestHandlerInterfacefor Router/Cache\Router substitutability.MatchResultvalue object andMatchStatusenum for matching routes without dispatching (#328, #352).Router::match()method to inspect route matching without executing handlers.Router::getRoutes()method to introspect all registered routes (#330).Route::setPathVars()for dispatcher-set path parameters, separate from user-set defaults.- Index-based route caching with signature hash validation for cache integrity.
- Corrupt cache auto-recovery in cached router.
UrlGeneratorInterfacewithgenerateUrl()for reverse routing from named routes (#355).RouterandCache\Routerboth implementUrlGeneratorInterface.DispatcherInterface(marked@internal) formalising the Router-Dispatcher contract (#359).- Middleware groups:
defineMiddlewareGroup()andmiddlewareGroup()for named middleware collections onRouterandRouteGroup. MatchStatus::ConditionNotMetenum case distinguishing host/scheme/port condition failures from true not-found results.MatchResult::conditionNotMet()named constructor andisConditionNotMet()convenience method.MethodNotAllowedException::getAllowedMethods()for typed array access to allowed HTTP methods.- Matched
Routeobject added as a request attribute (keyed byRoute::class) during dispatch, enabling routing-aware middleware. - Route freezing: routes become immutable after
prepareRoutes(), preventing silent post-compilation misconfiguration. FreezeableInterface,FreezeableTrait, andFreezeGuardfor route immutability lifecycle.- Optional segment support in
generateUrl(): routes using FastRoute[/{param}]syntax resolve correctly with defaults fromsetVars()or omit the segment when unset.
- Minimum PHP version raised to 8.3.
- PHPStan analysis raised from level 4 to level 7 (#360).
- Switched from PHP_CodeSniffer (PSR-12) to PHP CS Fixer (PER-CS2.0).
- Switched from PHPUnit to Pest v4.
- Switched from PHPUnit mocks to Mockery.
- Test namespace changed from
League\Route\toLeague\Route\Test\. - Cached router completely redesigned: caches compiled FastRoute data (scalars only) instead of serialising the entire Router object (#353).
Route::setVars()now sets declaration-time defaults only; dispatcher usessetPathVars()internally (#350).Route::getVars()returns merged result of default vars and path vars, with path vars taking precedence.- Route compilation is now request-independent: all routes compiled unconditionally, condition matching at dispatch time only.
Cache\Routernow implementsRouterInterface.FileCache::getMultiple(),setMultiple(), anddeleteMultiple()now throwBadMethodCallExceptioninstead of returning incorrect values.Dispatchernow uses composition instead of inheriting fromFastRoute\Dispatcher\GroupCountBased(#359).Dispatcherconstructor accepts strategy and route map at construction time instead of via setters.Dispatcherno longer implementsRouteConditionHandlerInterface(condition matching extracted as internal concern).JsonStrategy::getOptionsCallable()returned closure now accepts(ServerRequestInterface $request, array $vars)parameters, enabling CORS-aware OPTIONS handling (#361).OptionsHandlerInterface::getOptionsCallable()docblock now specifies the expected callable signature.- Cache signature hash upgraded from md5 to xxh128 for improved collision resistance.
Dispatcherswitch statements replaced withmatchexpressions for exhaustiveness checking.MatchResultis now areadonlyclass.Route::setPathVars()marked@internal(dispatcher-only operation, exempted from route freezing).
laravel/serializable-closureremoved from hard dependencies (moved to suggest).- Closure wrapping removed from
Routeconstructor. - BETA status removed from cached router.
- Request-dependent route filtering removed from
prepareRoutes(). - Support for PHP 8.1 and 8.2 dropped.
- Scrutinizer CI integration removed.
Dispatcher::setRouteMap()removed (route map now set via constructor).- Duplicate
Router::processGroups()method removed (consolidated intocollectGroupRoutes()).
- Replaced opis/closure with laravel/serializable-closure and implemented throughout the handler process rather than a blanket serialisation of the router.
- Further fixes for type hinting bug related to array based callables with a string class name.
- Fixed a bug introduced in 6.0.0 where an array based callable with a string class name would not be considered valid.
- Added some doc comments for clarity on array types. (@marekskopal)
- Updated
psr/http-messageto^2.0.0.
Note: While this is a major release, there are no breaking changes to the public API. The major version bump is due to the removal of support for PHP 8.0 and below.
This being said, there are some internal changes that may affect you if you have extended the library in any way. Please test thoroughly before upgrading.
- Added full support for PHP 8.1 to 8.4.
- Ability to use a PSR-15 middleware as a controller.
- Ability to pass an array of HTTP methods to
Router::mapto create a route that matches multiple methods.- This method still accepts a string so is not a breaking change.
- Ability to add a custom key to a caching router.
- Fixes and improvements throughout for PHP 8.1 to 8.4.
- Removed support for PHP < 8.1.
- Support for named routes within groups (@Fredrik82)
- Support for
psr/container:2.0
- A cached router, a way to have a fully built router cached and resolved from cache on subsequent requests.
- Response decorators, a way to manipulate a response object returned from a matched route.
- Automatic generation of OPTIONS routes if they have not been defined.
- Minimum PHP requirement bumped to 7.2.
Routerno longer extends FastRouteRouteCollecter.Routerconstructor no longer accepts optional FastRouteRouteParserandDataGenerator.Routerconstructor now accepts an optional FastRouteRouteCollector.- Routes already registered with FastRoute
RouteCollectorare respected and matched.
- Routes already registered with FastRoute
- Separated route preparation from dispatch process so that the router can dispatch multiple times.
- General code improvements.
- Setting of default response headers on strategies. (Replaced by response decorators, see Added).
- Exception handlers from strategies. (Already deprecated in favour of throwable handlers).
- Official support for PHP 8.0.
- Ability to pass optional
$replacementsarray toRoute::getPathin order to build literal route path strings.
- Ability to pass JSON flags to JsonStrategy. (@pine3ree)
- Router is now a RequestHandlerInterface so can be used as a middleware itself. (@delboy1978uk)
- Route params now added as Request attributes. (@delboy1978uk)
- Exception moved to more appropriate place when shifting no middleware. (@delboy1978uk)
- Ensure group prefix is always added when adding a parent group. (@delboy1978uk)
- Fixed bug when attempting to get a container for custom strategy that is not container aware.
- Ability to add middleware to the stack as a class name so it is only instantiated when used.
- Switch to use
zendframework/zend-httphandlerrunneras removed fromdiactoros(@JohnstonCode)
- When adding a prefix to a group after adding routes, it is now applied to those routes. (@delboy1978uk)
- Fix to how shifting middleware is handled to prevent error triggering. (@delboy1978uk)
- Fix to ensure that when invoking FastRoute methods on League\Route all callables are converted to League\Route objects (@pgk)
- Various documentation fixes.
- Allow adding default response headers to strategies.
- Expand error handling to include Throwable.
- Fixed issue where group middleware was being dublicated on internal routes.
- JSON strategy now allows array and object returns and builds JSON response. (Thanks @willemwollebrants)
- Fixed issue where setting strategy on specific routes had no effect. (Thanks @aag)
- Fixed a bug where content-type header would not be added to response in Json Strategy.
- Increased minimum PHP version to 7.1.0
- Now implements PSR-15 middleware and request handlers.
- No longer enforces use of container, one can be used optionally.
- Strategies now return PSR-15 middleare as handlers.
- Increased types of proxy callables that can be used as controllers.
- General housekeeping and refactoring for continued improvement.
- Group level strategies now handle exceptions if a route is not matched but the request falls within the group.
- Ensure JsonStrategy handles all exceptions by default.
- Handle multiline exception messages.
- Add port condition to routes.
- Middleware execution order.
- Middleware functionality for PSR-7 compatible callables, globally to route collection or individually per route/group.
- Allow setting of strategy for a route group.
- Add UUID as default pattern matcher.
- Now depend directly on PSR-11 implementation.
- Simplified default strategies to just
ApplicationandJson. - Have strategies return a middleware to add to the stack.
- Have strategies handle decoration of exceptions.
- Have JsonStrategy handle all exceptions by default.
- All routing and dispatching now built around PSR-7.
- Can now group routes with prefix and match conditions.
- Routes now stored against a specific
Routeobject that describes the route. - New
dispatchmethod onRouteCollectionthat is a compliant PSR-7 middleware. - Additional route matching conditions for scheme and host.
- API rewrite to simplify.
- API naming improvements.
- Strategies now less opinionated about return from controller.
- Can now use any callable as a controller.
- Request object is now built by the strategy when one is not available from the container.
- General tidying and removal of unused code.
- URI variables now correctly passed to controller in
MethodArgumentStrategy.
- Added
addPatternMatchermethod to allow custom regex shortcuts within wildcard routes. - Refactored logic around matching routes.
- Added import statements for all used objects.
- Fixed dockblock annotations.
- PSR-2 standards improvements within tests.
- Migrated from Orno\Route.