Slim Framework:如何捕获多个完全可选的路由?
Slim Framework: How to catch multiple fully OPTIONAL routes?
我已经拥有的
主要是,我的基本路线已经是可选路线。也就是:
$app->get('/{id}', function(...){
if ( $args['id'] ) {
/**
* Show Item Details
*/
} else {
/**
* Redirects to Home
*/
}
});
效果很好。这转化为:
www.example.com/DRX1487
我想达到的目标
现在我想要的是:
www.example.com/DRX1487/reorder
www.example.com/DRX1487/cancel
我试过了:
$app->get('/{id}/{action}', function(...){...});
$app->get('/:id/:action', function(...){...});
两者都不行。
请问我该如何实现?我发现的所有示例(用于可选路由)都是首先基于静态基本路由。但是我的基本路线已经是可选路线了。
请多指教
使用单独的路由,每个处理操作的代码都可以简单且精简。例如。
$app->get('/', HomeController::class);
$app->get('/{id}', ItemDetailController::class);
$app->get('/{id}/reorder', ItemDetailReorderController::class);
$app->get('/{id}/cancel', ItemDetailCancelController::class);
主页控制器
class HomeController
{
public function __invoke($request, $response, $args)
{
//do something
return $response;
}
}
物品相关事物的基础控制器
abstract class BaseItemDetailController
{
protected function isValidId($id)
{
//do validation of id here
}
abstract public function __invoke($request, $response, $args);
}
显示项目详细信息的控制器
class ItemDetailController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to display item detail
}
return $response;
}
}
重新订购商品的控制器
class ItemDetailReorderController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to reorder item
}
return $response;
}
}
处理取消项目的控制器
class ItemDetailCancelController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to cancel item ordered
}
return $response;
}
}
可选参数使用括号定义。使用您最初的方法,事情很容易变得复杂,如果可以,请避免使用以下代码。
$app->get('/[{id}[/{action}]]', function(...) {
if (isset($args['id'])) {
if (isValid($args['id'])) {
if (isset($args['action'])) {
if ($args['action'] === 'reorder') {
//do item reorder
return $response;
}
if ($args['action'] === 'cancel') {
//do item cancel
return $response;
}
//do something (display item detail?)
return $response;
} else {
//show item detail
}
}
} else {
/**
* Redirects to Home
*/
}
});
我已经拥有的
主要是,我的基本路线已经是可选路线。也就是:
$app->get('/{id}', function(...){
if ( $args['id'] ) {
/**
* Show Item Details
*/
} else {
/**
* Redirects to Home
*/
}
});
效果很好。这转化为:
www.example.com/DRX1487
我想达到的目标
现在我想要的是:
www.example.com/DRX1487/reorder
www.example.com/DRX1487/cancel
我试过了:
$app->get('/{id}/{action}', function(...){...});
$app->get('/:id/:action', function(...){...});
两者都不行。
请问我该如何实现?我发现的所有示例(用于可选路由)都是首先基于静态基本路由。但是我的基本路线已经是可选路线了。
请多指教
使用单独的路由,每个处理操作的代码都可以简单且精简。例如。
$app->get('/', HomeController::class);
$app->get('/{id}', ItemDetailController::class);
$app->get('/{id}/reorder', ItemDetailReorderController::class);
$app->get('/{id}/cancel', ItemDetailCancelController::class);
主页控制器
class HomeController
{
public function __invoke($request, $response, $args)
{
//do something
return $response;
}
}
物品相关事物的基础控制器
abstract class BaseItemDetailController
{
protected function isValidId($id)
{
//do validation of id here
}
abstract public function __invoke($request, $response, $args);
}
显示项目详细信息的控制器
class ItemDetailController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to display item detail
}
return $response;
}
}
重新订购商品的控制器
class ItemDetailReorderController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to reorder item
}
return $response;
}
}
处理取消项目的控制器
class ItemDetailCancelController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to cancel item ordered
}
return $response;
}
}
可选参数使用括号定义。使用您最初的方法,事情很容易变得复杂,如果可以,请避免使用以下代码。
$app->get('/[{id}[/{action}]]', function(...) {
if (isset($args['id'])) {
if (isValid($args['id'])) {
if (isset($args['action'])) {
if ($args['action'] === 'reorder') {
//do item reorder
return $response;
}
if ($args['action'] === 'cancel') {
//do item cancel
return $response;
}
//do something (display item detail?)
return $response;
} else {
//show item detail
}
}
} else {
/**
* Redirects to Home
*/
}
});