路由
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');
}
}