Router
class Router implements BindingRegistrar, Registrar mixin RouteRegistrar
Traits
Constants
| private CURRENT_ROUTE_CONTEXT_KEY |
|
| private CURRENT_REQUEST_CONTEXT_KEY |
|
Properties
| static protected array | $macros | The registered string macros. |
from Macroable |
| protected Dispatcher | $events | The event dispatcher instance. |
|
| protected Container | $container | The IoC container instance. |
|
| protected RouteCollectionInterface | $routes | The route collection instance. |
|
| protected array<string, string> | $middleware | All of the short-hand keys for middlewares. |
|
| protected array<string, array<int, string>> | $middlewareGroups | All of the middleware groups. |
|
| array<int, string> | $middlewarePriority | The priority-sorted list of middleware. |
|
| protected Closure> | $binders | The registered route value binders. |
|
| protected array<string, string> | $patterns | The globally available parameter patterns. |
|
| protected array | $groupStack | The route group attribute stack. |
|
| protected Closure|null | $implicitBindingCallback | The registered custom implicit binding callback. |
|
| static array<int, string> | $verbs | All of the verbs supported by the router. |
Methods
Mix another object into the class.
Dynamically handle calls to the class.
Dynamically handle calls into the router instance.
Call the given Closure with this instance then return the instance.
Register a new GET route with the router.
Register a new POST route with the router.
Register a new PUT route with the router.
Register a new PATCH route with the router.
Register a new DELETE route with the router.
Register a new OPTIONS route with the router.
Register a new QUERY route with the router.
Register a new route responding to all verbs.
Create a redirect from one URI to another.
Create a permanent redirect from one URI to another.
Register a new route that returns a view.
Register a new route with the given verbs.
Register an array of resource controllers.
Register an array of resource controllers that can be soft deleted.
Route a resource to a controller.
Register an array of API resource controllers.
Route an API resource to a controller.
Register an array of singleton resource controllers.
Route a singleton resource to a controller.
Register an array of API singleton resource controllers.
Route an API singleton resource to a controller.
Update the group stack with the given attributes.
Merge the given array with the last group stack.
Get the prefix from the last group on the stack.
Add a route to the underlying route collection.
Create a new route instance.
Determine if the action is routing to a controller.
Add a controller based route action to the action array.
Prepend the last group namespace onto the use clause.
Prepend the last group controller onto the use clause.
Prefix the given URI with the last prefix.
Add the necessary where clauses to the route based on its initial registration.
Return the response returned by the given route.
Match a route, run middleware, and call the given callback instead of the controller.
Run the given route within a Stack "onion" instance.
Create the middleware pipeline used to dispatch a route.
Convert gathered middleware into descriptors, caching only the route's canonical list.
Convert class-string middleware into immutable pipe descriptors.
Gather the middleware for the given route with resolved class names.
Resolve a flat array of middleware classes from the provided array.
Resolve middleware aliases without expanding middleware groups.
Resolve middleware using the given middleware groups.
Substitute the implicit route bindings for the given route.
Register a callback to run after implicit bindings are substituted.
Call the binding callback for the given key.
Register a route matched event listener.
Get all of the defined middleware short-hand names.
Check if a middlewareGroup with the given name exists.
Get all of the defined middleware groups.
Register a group of middleware.
Add a middleware to the beginning of a middleware group.
Add a middleware to the end of a middleware group.
Remove the given middleware from the specified group.
Flush the router's middleware groups.
Add a new route parameter binder.
Get the binding callback for a given binding.
Get the global "where" patterns.
Set a global where pattern on all routes.
Set a group of global where patterns on all routes.
Determine if the router currently has a group stack.
Get the current group stack for the router.
Get a route parameter for the current route.
Get the request currently being dispatched.
Get the currently dispatched route instance.
Check if a route with the given name exists.
Get the current route name.
Alias for the "currentRouteNamed" method.
Determine if the current route matches a pattern.
Get the current route action.
Alias for the "currentRouteUses" method.
Determine if the current route action matches a given action.
Set the unmapped global resource parameters to singular.
Set the global resource parameter mapping.
Get or set the verbs used in the resource URIs.
Get the underlying route collection.
Set the compiled route collection instance.
Determine whether this router owns the application's global route state.
Flush all static routing caches.
Compile routes and pre-warm collection and static caches.
Pre-warm all caches for the registered routes.
Remove any duplicate middleware from the given array.
Flush all static state.
Details
in
Macroable at line 28
static void
macro(string $name, callable|object $macro)
Register a custom macro.
Boot-only. Macros persist in a static property for the worker lifetime and apply to every subsequent call on the macroable class.
in
Macroable at line 41
static void
mixin(object $mixin, bool $replace = true)
Mix another object into the class.
Boot-only. Delegates to macro() for each method; registered macros persist in a static property for the worker lifetime.
in
Macroable at line 57
static bool
hasMacro(string $name)
Check if macro is registered.
in
Macroable at line 68
static void
flushMacros()
Flush the existing macros.
Boot or tests only. Clears worker-wide macros; concurrent coroutines may resolve different methods depending on timing.
in
Macroable at line 78
static mixed
__callStatic(string $method, array $parameters)
Dynamically handle calls to the class.
at line 1559
mixed
__call(string $method, array $parameters)
Dynamically handle calls into the router instance.
in
Tappable at line 17
mixed
tap(callable|null $callback = null)
Call the given Closure with this instance then return the instance.
at line 128
__construct(Dispatcher $events, Container|null $container = null)
Create a new Router instance.
at line 138
Route
get(string $uri, array|string|callable $action = null)
Register a new GET route with the router.
at line 146
Route
post(string $uri, array|string|callable $action = null)
Register a new POST route with the router.
at line 154
Route
put(string $uri, array|string|callable $action = null)
Register a new PUT route with the router.
at line 162
Route
patch(string $uri, array|string|callable $action = null)
Register a new PATCH route with the router.
at line 170
Route
delete(string $uri, array|string|callable $action = null)
Register a new DELETE route with the router.
at line 178
Route
options(string $uri, array|string|callable $action = null)
Register a new OPTIONS route with the router.
at line 186
Route
query(string $uri, array|string|callable $action = null)
Register a new QUERY route with the router.
at line 194
Route
any(string $uri, array|string|callable|null $action = null)
Register a new route responding to all verbs.
at line 202
Route
fallback(array|string|callable|null $action)
Register a new fallback route with the router.
at line 216
Route
redirect(string $uri, string $destination, int $status = 302)
Create a redirect from one URI to another.
at line 226
Route
permanentRedirect(string $uri, string $destination)
Create a permanent redirect from one URI to another.
at line 234
Route
view(string $uri, string $view, array $data = [], int|array $status = 200, array $headers = [])
Register a new route that returns a view.
at line 248
Route
match(array|string $methods, string $uri, array|string|callable $action = null)
Register a new route with the given verbs.
at line 256
void
resources(array $resources, array $options = [])
Register an array of resource controllers.
at line 266
void
softDeletableResources(array $resources, array $options = [])
Register an array of resource controllers that can be soft deleted.
at line 276
PendingResourceRegistration
resource(string $name, string $controller, array $options = [])
Route a resource to a controller.
at line 295
void
apiResources(array $resources, array $options = [])
Register an array of API resource controllers.
at line 305
PendingResourceRegistration
apiResource(string $name, string $controller, array $options = [])
Route an API resource to a controller.
at line 321
void
singletons(array $singletons, array $options = [])
Register an array of singleton resource controllers.
at line 331
PendingSingletonResourceRegistration
singleton(string $name, string $controller, array $options = [])
Route a singleton resource to a controller.
at line 350
void
apiSingletons(array $singletons, array $options = [])
Register an array of API singleton resource controllers.
at line 360
PendingSingletonResourceRegistration
apiSingleton(string $name, string $controller, array $options = [])
Route an API singleton resource to a controller.
at line 378
Registrar
group(array $attributes, Closure|array|string $routes)
Create a route group with shared attributes.
at line 399
protected void
updateGroupStack(array $attributes)
Update the group stack with the given attributes.
at line 411
array
mergeWithLastGroup(array $new, bool $prependExistingPrefix = true)
Merge the given array with the last group stack.
at line 419
protected void
loadRoutes(Closure|string $routes)
Load the provided routes.
at line 431
string
getLastGroupPrefix()
Get the prefix from the last group on the stack.
at line 445
Route
addRoute(array|string $methods, string $uri, array|string|callable|null $action)
Add a route to the underlying route collection.
at line 453
protected Route
createRoute(array|string $methods, string $uri, mixed $action)
Create a new route instance.
at line 483
protected bool
actionReferencesController(mixed $action)
Determine if the action is routing to a controller.
at line 496
protected array
convertToControllerAction(array|string $action)
Add a controller based route action to the action array.
at line 521
protected string
prependGroupNamespace(string $class)
Prepend the last group namespace onto the use clause.
at line 533
protected string
prependGroupController(string $class)
Prepend the last group controller onto the use clause.
at line 555
Route
newRoute(array|string $methods, string $uri, mixed $action)
Create a new Route object.
at line 565
protected string
prefix(string $uri)
Prefix the given URI with the last prefix.
at line 573
protected Route
addWhereClausesToRoute(Route $route)
Add the necessary where clauses to the route based on its initial registration.
at line 586
protected void
mergeGroupAttributesIntoRoute(Route $route)
Merge the group stack with the controller action.
at line 597
Response
respondWithRoute(string $name)
Return the response returned by the given route.
at line 609
Response
dispatch(Request $request)
Dispatch the request to the application.
at line 619
Response
dispatchToRoute(Request $request)
Dispatch the request to a route and return the response.
at line 634
Response
dispatchToCallback(Request $request, Closure $callback)
Match a route, run middleware, and call the given callback instead of the controller.
Performs the full route context lifecycle (route matching, context setup, route resolver, RouteMatched event, middleware pipeline) but calls the provided callback as the terminal handler instead of the route's action.
Used by the WebSocket server for handshake requests where route matching and middleware must run but the controller must not be invoked.
at line 676
protected Response
runRoute(Request $request, Route $route)
Return the response for the given route.
at line 693
protected mixed
runRouteWithinStack(Route $route, Request $request)
Run the given route within a Stack "onion" instance.
at line 720
protected Pipeline
newPipeline()
Create the middleware pipeline used to dispatch a route.
at line 730
protected array
middlewareFor(Route $route)
Resolve middleware for one route dispatch.
at line 749
protected array
middlewareDescriptorsFor(Route $route, array $middleware)
Convert gathered middleware into descriptors, caching only the route's canonical list.
at line 769
protected array
describeMiddleware(array $middleware)
Convert class-string middleware into immutable pipe descriptors.
at line 784
array
gatherRouteMiddleware(Route $route)
Gather the middleware for the given route with resolved class names.
at line 797
array
resolveMiddleware(array $middleware, array $excluded = [])
Resolve a flat array of middleware classes from the provided array.
at line 807
array
resolveMiddlewareWithoutGroups(array $middleware, array $excluded = [])
Resolve middleware aliases without expanding middleware groups.
at line 817
protected array
resolveMiddlewareUsingGroups(array $middleware, array $excluded, array $middlewareGroups)
Resolve middleware using the given middleware groups.
at line 862
protected array
sortMiddleware(Collection $middlewares)
Sort the given middleware by priority.
at line 870
Response
prepareResponse(Request $request, mixed $response)
Create a response instance from the given value.
at line 888
static Response
toResponse(Request $request, mixed $response)
Static version of prepareResponse.
at line 942
mixed
substituteImplicitBindings(Route $route)
Substitute the implicit route bindings for the given route.
at line 962
Router
substituteImplicitBindingsUsing(callable $callback)
Register a callback to run after implicit bindings are substituted.
Boot-only. The callback persists on the singleton Router and affects every subsequent route binding.
at line 974
protected mixed
performBinding(string $key, string $value, Route $route)
Call the binding callback for the given key.
at line 985
void
matched(string|callable $callback)
Register a route matched event listener.
Boot-only. The listener persists on the worker-lifetime event dispatcher and runs for every subsequent route match.
at line 995
array
getMiddleware()
Get all of the defined middleware short-hand names.
at line 1008
Router
aliasMiddleware(string $name, string|Closure $class)
Register a short-hand name for a middleware.
Boot-only. The alias persists in the singleton Router for the worker lifetime and applies to every subsequent route resolution.
at line 1018
bool
hasMiddlewareGroup(string $name)
Check if a middlewareGroup with the given name exists.
at line 1028
array
getMiddlewareGroups()
Get all of the defined middleware groups.
at line 1041
Router
middlewareGroup(string $name, array $middleware)
Register a group of middleware.
Boot-only. The middleware group persists in the singleton Router for the worker lifetime and applies to every subsequent route resolution.
at line 1058
Router
prependMiddlewareToGroup(string $group, string $middleware)
Add a middleware to the beginning of a middleware group.
If the middleware is already in the group, it will not be added again.
Boot-only. The middleware group persists in the singleton Router for the worker lifetime and applies to every subsequent route resolution.
at line 1077
Router
pushMiddlewareToGroup(string $group, string $middleware)
Add a middleware to the end of a middleware group.
If the middleware is already in the group, it will not be added again.
Boot-only. The middleware group persists in the singleton Router for the worker lifetime and applies to every subsequent route resolution.
at line 1098
Router
removeMiddlewareFromGroup(string $group, string|array $middleware)
Remove the given middleware from the specified group.
Boot-only. The group mutation persists on the singleton Router and does not invalidate middleware already resolved on routes.
at line 1128
Router
flushMiddlewareGroups()
Flush the router's middleware groups.
Boot or tests only. Clears the singleton Router's middleware-group registry shared by every coroutine; concurrent requests lose middleware mid-dispatch.
at line 1141
void
bind(string $key, string|callable $binder)
Add a new route parameter binder.
Boot-only. The binder persists in the singleton Router for the worker lifetime and runs on every subsequent route parameter resolution.
at line 1155
void
model(string $key, string $class, Closure|null $callback = null)
Register a model binder for a wildcard.
Boot-only. The model binder persists in the singleton Router for the worker lifetime and runs on every subsequent route parameter resolution.
at line 1163
Closure|null
getBindingCallback(string $key)
Get the binding callback for a given binding.
at line 1177
array
getPatterns()
Get the global "where" patterns.
at line 1188
void
pattern(string $key, string $pattern)
Set a global where pattern on all routes.
Boot-only. The pattern persists in the singleton Router for the worker lifetime and applies to every subsequent route definition.
at line 1199
void
patterns(array $patterns)
Set a group of global where patterns on all routes.
Boot-only. The patterns persist in the singleton Router for the worker lifetime and apply to every subsequent route definition.
at line 1209
bool
hasGroupStack()
Determine if the router currently has a group stack.
at line 1217
array
getGroupStack()
Get the current group stack for the router.
at line 1225
mixed
input(string $key, string|null $default = null)
Get a route parameter for the current route.
at line 1233
Request|null
getCurrentRequest()
Get the request currently being dispatched.
at line 1241
Route|null
getCurrentRoute()
Get the currently dispatched route instance.
at line 1249
Route|null
current()
Get the currently dispatched route instance.
at line 1257
bool
has(string|array $name)
Check if a route with the given name exists.
at line 1274
string|null
currentRouteName()
Get the current route name.
at line 1282
bool
is(mixed ...$patterns)
Alias for the "currentRouteNamed" method.
at line 1290
bool
currentRouteNamed(mixed ...$patterns)
Determine if the current route matches a pattern.
at line 1298
string|null
currentRouteAction()
Get the current route action.
at line 1310
bool
uses(array|string ...$patterns)
Alias for the "currentRouteUses" method.
at line 1325
bool
currentRouteUses(string $action)
Determine if the current route action matches a given action.
at line 1336
void
singularResourceParameters(bool $singular = true)
Set the unmapped global resource parameters to singular.
Boot-only. Delegates to ResourceRegistrar::singularParameters() which persists in a static property for the worker lifetime.
at line 1346
void
resourceParameters(array $parameters = [])
Set the global resource parameter mapping.
Boot-only. The mapping persists in static state for the worker lifetime.
at line 1357
array|null
resourceVerbs(array $verbs = [])
Get or set the verbs used in the resource URIs.
Boot-only when setting. Custom verbs persist in static state for the worker lifetime.
at line 1365
RouteCollectionInterface
getRoutes()
Get the underlying route collection.
at line 1376
void
setRoutes(RouteCollection $routes)
Set the route collection instance.
Boot or tests only. Replacing the collection mutates the singleton Router and its shared route binding for every subsequent request.
at line 1400
void
setCompiledRoutes(array $routes)
Set the compiled route collection instance.
Boot-only. Replaces the singleton Router's route collection and rebinds the container's 'routes' instance; runtime use breaks every concurrent request mid-dispatch.
at line 1418
protected bool
ownsGlobalRouteState()
Determine whether this router owns the application's global route state.
at line 1429
protected void
flushRoutingCaches()
Flush all static routing caches.
Called when the route collection is replaced to clear stale data. In Swoole workers live forever, so stale statics would persist.
at line 1453
void
compileAndWarm()
Compile routes and pre-warm collection and static caches.
In dev mode, compiles RouteCollection → CompiledRouteCollection for CompiledUrlMatcher performance (O(1) hash + single regex). In production with route:cache, routes are already CompiledRouteCollection — compile is skipped and only warmUp() runs.
Called from HttpServer\Server and WebSocketServer\Server after Kernel::bootstrap() returns, before $server->start(). Idempotent — safe to call from both servers in combined setups.
Boot-only. Replaces the route collection and populates process-wide caches before fork.
at line 1471
void
warmUp()
Pre-warm all caches for the registered routes.
Eagerly populates route compilation, middleware resolution, and reflection caches so they're available before fork. Workers inherit via copy-on-write in both SWOOLE_PROCESS and SWOOLE_BASE modes.
at line 1516
static array
uniqueMiddleware(array $middleware)
Remove any duplicate middleware from the given array.
at line 1541
Router
setContainer(Container $container)
Set the container instance used by the router.
Tests only. Swaps the singleton Router's container reference; per-request use races across coroutines and breaks every concurrent route dispatch.
at line 1551
static void
flushState()
Flush all static state.