dav*_*nst 3 php slim php-di slim-4
我已经基于 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;
});
Run Code Online (Sandbox Code Playgroud)
这是有道理的,但$app->getRouteCollector()->getRouteParser()不起作用,因为$app这里没有定义。但我认为我们应该调用$this->getRouteCollector()->getRouteParser();,但这会给出错误:"Call to undefined method DI\\Container::getRouteCollector()"。
看来我的困惑显然是关于依赖注入,这对我来说是新的,而且对我来说并不自然。老实说,我很想在其他地方定义 $routeParser 变量(在 index.php 内?),这样我就可以在任何路由定义中访问它,而不必每次都调用 $app->getRouteCollector()->getRouteParser() 。但目前我会满足于任何有效的方法。
细长的骨架实际上展示了您需要实现的目标的示例。在index.php中创建App实例后,有一个如下所示的分配:
// Instantiate the app
AppFactory::setContainer($container);
$app = AppFactory::create();
$callableResolver = $app->getCallableResolver();
Run Code Online (Sandbox Code Playgroud)
你也可以做到的:
$routeParser = $app->getRouteCollector()->getRouteParser();
Run Code Online (Sandbox Code Playgroud)
如果您确实需要 RouteParser 的此实例在每个路由回调中可用,您可以将其放入依赖项容器中,例如:
$container->set(Slim\Interfaces\RouteParserInterface::class, $routeParser);
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用 PHP-DI 自动装配功能将此 RouteParser 注入到控制器构造函数中:
use Slim\Interfaces\RouteParserInterface;
class SampleController {
public function __construct(RouteParserInterface $routeParser) {
$this->routeParser = $routeParser;
//...
}
}
Run Code Online (Sandbox Code Playgroud)
$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;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1766 次 |
| 最近记录: |