6 KiB
6 KiB
Atlas Routing: Technical Specifications
1. Project Overview
Atlas is a high-performance, modular PHP routing engine designed for professional-grade applications. It prioritizes developer experience, architectural purity, and interoperability through PSR-7 support.
2. Technical Requirements
- PHP Version:
^8.2 - Interoperability: Strict compliance with PSR-7 (
Psr\Http\Message\ServerRequestInterface) for request matching. - Dependencies:
psr/http-message: For HTTP message interfaces.phpunit/phpunit(Dev): For testing.
3. Architectural Principles
- SOLID: Strict adherence to object-oriented design principles.
- KISS: Favoring simple, maintainable solutions over complexity.
- DRY: Minimizing duplication through abstraction.
- YAGNI: Implementing only requested and necessary functionality.
- Single Responsibility Principle (SRP): Applied at both class and method levels.
- Inversion of Control (IoC): No environment guessing; all configurations must be explicitly injected.
- Verbose & Expressive Style: Self-documenting code with clear, descriptive naming.
- Type Safety: Mandatory use of PHP 8.2+ type hinting (scalar, union, intersection, DNF).
4. Core Routing Features
4.1 Route Definition
- Support for standard HTTP methods:
GET,POST,PUT,PATCH,DELETE. - Fluent, chainable API for route configuration.
- Example Usage:
$router->get('/path', 'Handler');$router->post('/path', 'Handler');
- Support for named routes:
->name('route_name').- Example:
$router->get(...)->name('user_list');
- Example:
- Reverse routing (URL Generation):
$router->url(string $name, array $parameters = []): string.- Automatically replaces
{{var}}placeholders. - Throws exception if required parameters are missing.
- Example:
$router->url('single_user', ['user_id' => 5]);
- Automatically replaces
4.2 URI Matching & Parameters
- Syntax: Double curly braces
{{variable_name}}for parameter encapsulation.- Example:
/users/{{user_id}}
- Example:
- Optional Parameters:
- Indicated by a trailing question mark inside the braces:
{{variable_name?}}. - Example:
/blog/{{slug?}}
- Indicated by a trailing question mark inside the braces:
- Validation:
- Chaining:
->valid('param', ['rule1', 'rule2']) - Array:
->valid(['param1' => ['rule'], 'param2' => ['rule']]) - Example:
$router->get(...)->valid('user_id', ['numeric', 'int', 'required']);
- Chaining:
- Default Values:
- Set via
->default(string $param, mixed $value). - Providing a default value automatically marks a parameter as optional.
- Example:
$router->get('/blog/{{page}}')->default('page', 1);
- Set via
- Regex Support: Dynamic matching for complex URI patterns.
4.3 Route Groups
- Route groups are first-class objects.
- Routes can be added directly to a group instance:
$group->get(...). - Nested grouping with
->group()method. - Indefinite nesting support.
- Recursive merging of prefixes and middleware.
- Support for parameter validation at the group level.
- Example:
$group = $router->group(['prefix' => '/users/{{user_id}}'])->valid('user_id', ['int']); $group->get('/posts', 'PostController@index');
4.4 Redirection
- Native support for redirects:
$router->redirect(string $path, string $destination, int $status = 302).
4.5 Route Attributes (Metadata)
- "Tag-along" data for routes using
->attr(string $key, mixed $value)or->meta(array $data). - Used for non-routing logic (e.g., Breadcrumbs, ACL, UI hints).
- Accessible via the matched
Routeobject.
5. Modular Routing
5.1 Discovery & Structure
- Explicit Injection:
modules_path(string or array) androutes_file(defaultroutes.php) must be provided. - Optional
modules_glob: Custom pattern for module discovery (e.g.,modules/*/Http/routes.php). - Convention: Standard location is
src/Modules/{ModuleName}/routes.php. - Automatic Registration: The
module('ModuleName', 'prefix')method triggers discovery. - Example Configuration:
$router = new Router([ 'modules_path' => '/abs/path/to/modules', 'routes_file' => 'routes.php' ]); - Exception: Throws
MissingConfigurationExceptionifmodule()is called withoutmodules_path.
5.2 Inheritance
- Modules inherit base URL prefixes and module-level middleware.
- Conflict resolution mechanisms for overlapping route names or paths.
6. Advanced Functionality
6.1 Subdomain Routing
- Ability to constrain routes or groups to specific subdomains.
6.2 Internationalization (i18n)
- Localized route support for translated URI segments.
6.3 Performance & Caching
- Implementation of route caching to optimize matching in large-scale applications.
- Optimized, serializable structure for production environments.
6.4 Error Handling
- Localized and global fallback handlers:
fallback(callable|string $handler). - Support for custom 404 responses at the module or group level.
7. CLI & Tooling
7.1 Programmatic Inspector API
getRoutes(): Returnsiterable<RouteDefinition>containing method, path, name, handler, middleware, module, and group data.match(string $method, string $url, array $server = []): Returns aMatchResultfor debugging.toArray()/jsonSerialize(): For structured output.
7.2 CLI Commands (Optional)
route:list:- Filters:
--method,--name,--path,--module,--domain,--json. - Output: method(s), path template, name, handler, middleware, module, group prefix.
- Filters:
route:test <METHOD> <URL>:- Options:
--host,--accept-language. - Diagnostics: name, template, handler, params, middleware chain, module/group context, timing.
- Exit codes:
0(match found),2(no match),1(error).
- Options:
8. Quality Assurance
- Testing: Mandatory Unit and Integration tests using PHPUnit.
- Documentation: PHPDoc for all public members; updated README and examples.
- Regression: Every bug fix requires a corresponding regression test.