Slim 4 получает все маршруты в контроллер без $ app - PullRequest
1 голос
/ 10 января 2020

Мне нужно получить все зарегистрированные маршруты для работы в контроллере. В Slim 3 можно было получить роутер с

$router = $container->get('router');
$routes = $router->getRoutes();

С $ app это просто $routes = $app->getRouteCollector()->getRoutes();

Есть идеи?

1 Ответ

0 голосов
/ 10 января 2020

Если вы используете PHP -DI, ​​вы можете добавить определение контейнера и внедрить объект с помощью инжектора конструктора.

Пример :

<?php

// config/container.php

use Slim\App;
use Slim\Factory\AppFactory;
use Slim\Interfaces\RouteCollectorInterface;

// ...

return [
    App::class => function (ContainerInterface $container) {
        AppFactory::setContainer($container);

        return AppFactory::create();
    },

    RouteCollectorInterface::class => function (ContainerInterface $container) {
        return $container->get(App::class)->getRouteCollector();
    },

    // ...
];

Действие класс:

<?php

namespace App\Action\Home;

use Psr\Http\Message\ResponseInterface;
use Slim\Http\Response;
use Slim\Http\ServerRequest;
use Slim\Interfaces\RouteCollectorInterface;

final class HomeAction
{
    /**
     * @var RouteCollectorInterface
     */
    private $routeCollector;

    public function __construct(RouteCollectorInterface $routeCollector)
    {
        $this->routeCollector = $routeCollector;
    }

    public function __invoke(ServerRequest $request, Response $response): ResponseInterface
    {
        $routes = $this->routeCollector->getRoutes();

        // ...
    }
}

...