【发布时间】:2020-04-24 10:43:10
【问题描述】:
我已经基于 SlimPHP 团队的 Slim Skeleton 应用程序设置了一个新应用程序。在我的路由定义中,我希望能够以described in the Slim4 documentation 访问路由解析器。因此,例如,我希望能够像这样编辑骨架的 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()。但目前我会接受任何有效的方法。
【问题讨论】:
-
@Jeto 如果是这样,它会以我无法理解的方式适用于我的情况。另请注意,@odan 和 @Nima 的出色答案不使用
use或通过引用传递任何内容,所以我认为这不是最好的方法。 -
公平地说,我不熟悉 Slim 框架,所以我将撤回我的近距离投票,因为我认为它类似于 Silex 等微框架,其中
useing @ 987654332@ 很常见(在您的情况下为$app->get('/', function (Request $request, Response $response) use ($app) { ... })。这可能不是 Slim 中推荐的方式,不能肯定地说。