3

我已经建立了一个基于 SlimPHP 团队的Slim Skeleton应用程序的新应用程序。在我的路由定义中,我希望能够访问Slim4 文档中描述的路由解析器。因此,例如,我希望能够编辑骨架的app/routes.php文件,如下所示:

    $app->get('/', function (Request $request, Response $response) {
        $routeParser = $app->getRouteCollector()->getRouteParser();  // this doesn't work
        $response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
        return $response;
    });

$app->getRouteCollector()->getRouteParser()不起作用是有道理的,因为$app这里没有定义。但我认为我们会改为调用$this->getRouteCollector()->getRouteParser();,但这会产生错误:"Call to undefined method DI\\Container::getRouteCollector()"

看来我的困惑肯定是关于依赖注入,这对我来说是新的,对我来说不是自然而然的。老实说,我很想在其他地方(在 index.php 中?)定义 $routeParser 变量,这样我就可以在任何路由定义中访问它,而不必每次都调用 $app->getRouteCollector()->getRouteParser()。但目前我愿意接受任何有效的方法。

4

1 回答 1

5

Slim 骨架实际上展示了您需要实现的目标的示例。在 index.php 中创建 App 实例后,有一个这样的赋值:

// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();

你也可以做到的:

$routeParser = $app->getRouteCollector()->getRouteParser();

如果你真的需要这个 RouteParser 实例在每个路由回调中可用,你可以把它放在依赖容器中,比如:

$container->set(Slim\Interfaces\RouteParserInterface::class, $routeParser);

然后您可以使用 PHP-DI 自动装配功能将此 RouteParser 注入到控制器构造函数中:

use Slim\Interfaces\RouteParserInterface;
class SampleController {
    public function __construct(RouteParserInterface $routeParser) {
        $this->routeParser = $routeParser;
        //...
    }
}

或者如果您需要$container->get()在任何路由回调中调用:

$app->get('/', function (Request $request, Response $response) {
    $routeParser = $this->get(Slim\Interfaces\RouteParserInterface::class);
    $response->getBody()->write('Hello world! ' . $routeParser->urlFor('something'));
    return $response;
});
于 2020-01-07T06:11:56.640 回答