Slim 4使所有路由进入没有$ app的控制器

问题描述 投票:1回答:1

我需要获取所有注册的路由才能与控制器一起使用。在slim 3中,可以通过

获得路由器
$router = $container->get('router');
$routes = $router->getRoutes();

有了$ app,很容易$routes = $app->getRouteCollector()->getRoutes();

有什么想法吗?

slim slim-4
1个回答
0
投票

如果使用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();

        // ...
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.