Skip to content

路由

dux 支持在应用入口文件中注册和定义路由,为了保持代码清晰的阅读性, duxlite 2 推荐使用注解路由作为主要使用方式。

路由注册

在使用路由前需要先设置路由,如果使用了资源则无需二次注册,在应用入口文件 App.php 中的 init 方法进行路由注册,如下:

php
/**
 * @param string $pattern 路由前缀
 * @param object ...$middleware 中间件
 */
$app->getRoute()->set("web", new DuxRoute(""));
/**
 * @param string $pattern 路由前缀
 * @param object ...$middleware 中间件
 */
$app->getRoute()->set("web", new DuxRoute(""));

基础路由

在应用入口文件 App.php 中的 register 方法进行路由使用,如下:

php
use App\Test\Config\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

// 获取 Web 路由
$route = $app->getRoute()->get('web');

/**
 * 注册 GET 路由
 * @param string $pattern 路由路径
 * @param callable|object|string $callable 路由回调
 * @param string $name 路由名称,该名称与权限配置对应时将自动应用权限配置
 * @param string $title 路由标题,用于清晰地展示
 * @return void
 */
$route->get('/', function (ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface {
    return send($response, 'Hello world!');
}, 'test.home');

// 将 Web 路由注册到独立配置类中
Route::Api($route);
use App\Test\Config\Route;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

// 获取 Web 路由
$route = $app->getRoute()->get('web');

/**
 * 注册 GET 路由
 * @param string $pattern 路由路径
 * @param callable|object|string $callable 路由回调
 * @param string $name 路由名称,该名称与权限配置对应时将自动应用权限配置
 * @param string $title 路由标题,用于清晰地展示
 * @return void
 */
$route->get('/', function (ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface {
    return send($response, 'Hello world!');
}, 'test.home');

// 将 Web 路由注册到独立配置类中
Route::Api($route);

具体的路由路径规则请参考 slim,DuxLite 只是在此之上封装了一层方法,以方便模块化调用。

注解基础路由

注解路由只需要在控制器类上进行路由组和路由定义即可访问使用,注解路由最终使用与基础路由一致,只是调用方式不同。

php
<?php

namespace App\Content\Api;

use Dux\App;
use Dux\Handlers\ExceptionNotFound;
use Dux\Route\Attribute\Route;
use Dux\Route\Attribute\RouteGroup;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
 * @param object $app 路由注册名
 * @param string $pattern 路由前缀
 * @param object ...$middleware 中间件
 */
#[RouteGroup(app: 'web', pattern: '/content/article')]
class Article
{

    #[Route(methods: 'GET', pattern: '')]
    public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        return send($response, 'ok');
    }

}
<?php

namespace App\Content\Api;

use Dux\App;
use Dux\Handlers\ExceptionNotFound;
use Dux\Route\Attribute\Route;
use Dux\Route\Attribute\RouteGroup;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

/**
 * @param object $app 路由注册名
 * @param string $pattern 路由前缀
 * @param object ...$middleware 中间件
 */
#[RouteGroup(app: 'web', pattern: '/content/article')]
class Article
{

    #[Route(methods: 'GET', pattern: '')]
    public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        return send($response, 'ok');
    }

}

资源路由

为了简化后台路由(例如 Admin 控制器)的注册方式,我们封装了一个 resources 方法,该方法会自动注册 list info add edit del store trash restore 等常用的增删查改路由到对应的类方法内。

php
// 获取已注册路由
$route = $app->getRoute()->get('admin');

/**
 * @param string $pattern 路由前缀,该方法会自动在前缀后加入 /list 等路径名,并符合 RESTful 规范
 * @param string $class 控制器类名
 * @param string $name 路由名称前缀,该方法会自动在前缀后加入 list 等名称
 * @param array|false $actions ["list", "info", "add", "edit", "store", "del"] 自定义可用的路由与方法,设置为 false 则完全自定义
 * @param array $middleware 中间件
 * @param bool $softDelete 软删除支持
  * @return Route
 */
$route->resources(
    pattern: "/system/user",
    class: User::class,
    name: "system.user",
    actions: ["list", "info", "add", "edit", "store", "del"]
);
// 获取已注册路由
$route = $app->getRoute()->get('admin');

/**
 * @param string $pattern 路由前缀,该方法会自动在前缀后加入 /list 等路径名,并符合 RESTful 规范
 * @param string $class 控制器类名
 * @param string $name 路由名称前缀,该方法会自动在前缀后加入 list 等名称
 * @param array|false $actions ["list", "info", "add", "edit", "store", "del"] 自定义可用的路由与方法,设置为 false 则完全自定义
 * @param array $middleware 中间件
 * @param bool $softDelete 软删除支持
  * @return Route
 */
$route->resources(
    pattern: "/system/user",
    class: User::class,
    name: "system.user",
    actions: ["list", "info", "add", "edit", "store", "del"]
);

该方法会返回路由组方法,您可以继续在之后使用 get post 等自定义路由方法。

注解资源路由

注解资源路由使用如下,注解路由的参数与基础路由参数一致。

php
<?php

declare(strict_types=1);

namespace App\Content\Admin;

use Dux\Resources\Action\Resources;

#[Resource(app: 'admin',  route: '/content/page', name: 'content.page')]
class Page extends Resources
{
	protected string $model = \App\Content\Models\Page::class;

    public function transform(object $item): array
    {
        return [
            "id" => $item->id,
        ];
    }

    // 自定义动作路由
    #[Action(methods: 'POST', route: '/custom')]
    public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        return send($response, 'ok');
    }

}
<?php

declare(strict_types=1);

namespace App\Content\Admin;

use Dux\Resources\Action\Resources;

#[Resource(app: 'admin',  route: '/content/page', name: 'content.page')]
class Page extends Resources
{
	protected string $model = \App\Content\Models\Page::class;

    public function transform(object $item): array
    {
        return [
            "id" => $item->id,
        ];
    }

    // 自定义动作路由
    #[Action(methods: 'POST', route: '/custom')]
    public function list(ServerRequestInterface $request, ResponseInterface $response, array $args): ResponseInterface
    {
        return send($response, 'ok');
    }

}

Released under the MIT License.