Создать групповой маршрут с помощью Closure в PHP

1

Как создать групповую маршрутизацию на PHP с помощью Closure? Я создаю свой собственный REST API с нуля в PHP для практики и обучения.

В загрузочном файле я вызываю класс App:

$app = new App/App();
$app->import('routes.php');

У меня есть файл route.php с:

$app->group('/api/v1', function() use ($app)
{
    $app->group('/users', function() use ($app)
    {
        $app->get('/', 'User', 'index');
        $app->post('/', 'User', 'post');
        $app->get('/{id}', 'User', 'get');
        $app->put('/{id}', 'User', 'put');
        $app->delete('/{id}', 'User', 'delete');
    });
});

Ему необходимо создать такие маршруты:

  • /API/v1/пользователей/
  • /API/v1/пользователей/
  • /API/v1/пользователей/{ID}
  • /API/v1/пользователей/{ID}
  • /API/v1/пользователей/{ID}

Класс приложения:

class App
{
    public function group($link, Closure $closure)
    {
        $closure();
    }
}

И он устанавливает маршруты следующим образом:

  • /
  • /
  • /{Я бы}
  • /{Я бы}
  • /{Я бы}

Что делать с префиксом URL? Как я могу "запросить" эти другие вызовы $app-> get(), $app-> post()?

Теги:
routes
closures

1 ответ

1
Лучший ответ

Догадаться! Добавлен контейнер DI в класс App, который обрабатывает классы Router, Route и RouteGroup. Рамка PHP SLIM была моим вдохновением - https://github.com/slimphp/Slim/tree/3.x/Slim

Сначала я вызываю метод group() из класса App с вызовом метода pushGroup() из класса Router. Затем я вызываю класс RouteGroup с помощью $ group() ;. После этого я подействую popGroup(), чтобы вернуть только последнюю группу маршрутов.

При добавлении групп url в Route просто запустите метод processGroups() в классе Router, чтобы добавить префиксные ссылки.

Класс приложения

/**
 * Route groups
 * 
 * @param string $link
 * @param Closure $closure
 * @return void
 */
public function group($link, Closure $closure)
{
    $group = $this->container->get('Router')->pushGroup($link, $closure);
    $group();
    $this->container->get('Router')->popGroup();
}

Класс маршрутизатора

/**
 * Process route groups
 * 
 * @return string
 */
private function processGroups()
{
    $link = '';
    foreach ($this->route_groups as $group) {
        $link .= $group->getUrl();
    }
    return $link;
}


/**
 * Add a route group to the array
 * @param string $link
 * @param Closure $closure
 * @return RouteGroup
 */
public function pushGroup($link, Closure $closure)
{
    $group = new RouteGroup($link, $closure);
    array_push($this->route_groups, $group);
    return $group;
}


/**
 * Removes the last route group from the array
 *
 * @return RouteGroup|bool The RouteGroup if successful, else False
 */
public function popGroup()
{
    $group = array_pop($this->route_groups);
    return ($group instanceof RouteGroup ? $group : false);
}

Класс маршрута - это базовый класс с параметрами маршрутизации - метод, url, контроллер, действие и дополнительные параметры, поэтому я не буду копировать его здесь.

Класс RouteGroup

/**
 * Create a new RouteGroup
 *
 * @param string $url
 * @param Closure $closure
 */
public function __construct($url, $closure)
{
    $this->url = $url;
    $this->closure = $closure;
}

/**
 * Invoke the group to register any Routable objects within it.
 *
 * @param Slinky $app The App to bind the callable to.
 */
public function __invoke()
{
    $closure = $this->closure;
    $closure();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню