slimslim-4

Slim 4 get all routes into a controller without $app


I need to get all registed routes to work with into a controller. In slim 3 it was possible to get the router with

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

With $app it is easy $routes = $app->getRouteCollector()->getRoutes();

Any ideas?


Solution

  • If you use PHP-DI you could add a container definition and inject the object via constructor injection.

    Example:

    <?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();
        },
    
        // ...
    ];
    
    

    The action class:

    <?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();
    
            // ...
        }
    }