Slim Framework: как поймать несколько полностью необязательных маршрутов?

Что у меня уже есть

Главное, что мой базовый маршрут уже является дополнительным. Который, как:

$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(...){...});

Оба не работают.

Как мне добиться этого, пожалуйста? Все примеры, которые я нашел (для дополнительной маршрутизации), все сначала основаны на статическом базовом маршруте. Но мой базовый маршрут уже является Факультативным.

Пожалуйста, советуйте.

0

Решение

С отдельными маршрутами каждый код, который обрабатывает действие, может быть простым и компактным по размеру. Например.

 $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
*/
}
});
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]