DLight\Application\Router

Mô tả: router HTTP đơn giản, hỗ trợ đăng ký route tĩnh (sign()/signApi()), nhóm route (group()), middleware, đặt tên route (name()), và quét Attribute để auto-register route từ Controller.

Namespace / đăng ký

  • Namespace: DLight\Application
  • File: src/Application/Router.php
  • Autoload: PSR-4 (DLight\src/)

Public API (dùng bên ngoài)

  • Router::sign(string $spec, mixed $handler, array $middleware = []): self
  • Router::signApi(string $spec, mixed $handler, array $middleware = []): self
  • Router::all(string $path, mixed $handler, array $middleware = []): self
  • Router::group(string $prefix): self
  • Router::middleware(string|array $mw): self
  • Router::namePrefix(string $prefix): self
  • Router::name(string $name): self
  • Router::action(callable $cb): self
  • Router::default(callable $handler, ?int $code = 404): self
  • Router::scanControllerAttributes(array $controllers): void
  • Router::route(string $name, array $params = [], ?string $base = null): ?string
  • Router::getRegisteredRoutes(): array
  • Router::run(): void

Khai báo route cơ bản

sign() nhận $spec theo dạng "METHOD /path" hoặc "GET|POST /path".

use DLight\Application\Router;
use DLight\Application\View;

Router::sign('GET /', function () {
    return View::render('client.home', ['title' => '<title>Home</title>']);
});

Router::sign('GET /users/{id}', function ($id) {
    return "User id = " . $id;
});

API route (tự thêm prefix /api/)

use DLight\Application\Router;

Router::signApi('GET /products', function () {
    return ['code' => 200, 'data' => ['a', 'b']];
});

// /api/products/{id}
Router::signApi('GET /products/{id}', function ($id) {
    return ['code' => 200, 'id' => $id];
});

Khi là API, Router sẽ tự set Content-Type: application/json và encode JSON.

Group + middleware + đặt tên route

use DLight\Application\Router;

Router::group('/admin')
  ->middleware(['auth', 'admin'])
  ->namePrefix('admin.')
  ->action(function () {
      Router::sign('GET /dashboard', 'App\\Controller\\AdminController@dashboard')
        ->name('dashboard');
  });

// Generate URL theo tên
$url = Router::route('admin.dashboard');

Middleware dạng string sẽ chạy qua DLight\Application\Middleware::run(). Middleware dạng callable nhận $context = ['params' => ..., 'request' => ...].

Default handler (fallback)

use DLight\Application\Router;

Router::default(function () {
    return "Not Found";
}, 404);

Quét Attribute trên Controller

Router hỗ trợ đọc Attribute DLight\Application\Router hoặc DLight\Attribute\Route trên method public của controller. Khi quét, Router sẽ gọi sign()/signApi() tương ứng.

use DLight\Application\Router;

Router::scanControllerAttributes([
    App\\Controller\\UserController::class,
]);