Главное, что мой базовый маршрут уже является дополнительным. Который, как:
$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
*/
}
});
Других решений пока нет …