2

我需要将所有已注册的路由放入控制器中。在 slim 3 中,可以通过

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

使用 $app 很容易$routes = $app->getRouteCollector()->getRoutes();

有任何想法吗?

4

2 回答 2

1

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

        // ...
    }
}

于 2020-01-10T12:06:14.817 回答
0

这将在 SlimPHP 4 中显示应用中所有路由的基本信息:

$app->get('/tests/get-routes/', function ($request, $response, $args) use ($app) {
    $routes = $app->getRouteCollector()->getRoutes();
    foreach ($routes as $route) {
        echo $route->getIdentifier() . " → ";
        echo ($route->getName() ?? "(unnamed)") . " → ";
        echo $route->getPattern();
        echo "<br><br>";
    }

    return $response;
});

从那里,可以使用这样的东西来获取给定路由的 URL:

$routeParser = \Slim\Routing\RouteContext::fromRequest($request)->getRouteParser();
$path = $routeParser->urlFor($nameofroute, $data, $queryParams);

有以下注意事项:

  • 这仅适用于命名路线;
  • 这仅在提供了所需的路由参数时才有效——并且没有方法可以检查路由是否采用强制或可选的路由参数。
  • 没有方法可以获取未命名路由的 URL。
于 2022-01-05T10:19:18.723 回答