我正在使用联盟/路线,我想将我的容器注入控制器。这就是我已经拥有的东西:
提供RouteCollection:
$this->getContainer()->share('route', function () {
$route = require $this->getContainer()->get('baseDir').'/config/routes.php';
return $route;
});
BASEDIR /配置/ routes.php文件:
<?php
use League\Route\Strategy\ParamStrategy;
use League\Container\ReflectionContainer;
$routes = (new \League\Route\RouteCollection)
->setStrategy((new ParamStrategy)->setContainer(new ReflectionContainer));
// The line above is here because ParamStrategy otherwise throws
// Uncaught exception 'RuntimeException' with message 'To use the parameter strategy,
// the container must implement the (::call) method.
$routes->get('/', 'Controller\PostController::index');
return $routes;
我的前端控制器:
/** @var RouteCollection $route */
$route = $this->getContainer()->get('route');
/** @var ServerRequest $request */
$request = $this->getContainer()->get('request');
/** @var Response $response */
$response = $this->getContainer()->get('response');
/** @var SapiEmitter $emitter */
$emitter = $this->getContainer()->get('emitter');
$response = $route->dispatch($request, $response);
$emitter->emit($response);
我不知道我应该在哪里调用控制器对象上的setContainer
方法,因为它只存在于$route->dispatch($request, $response);
内。将该容器注入我的控制器的正确方法是什么?
答案 0 :(得分:1)
首先,这里有几点意见。
如果您坚持在控制器中使用容器,则可以在容器上使用导向器在每个控制器中实现此目的。 http://container.thephpleague.com/inflectors/ - 通过使用此链接中的方法,您可以让控制器实现ContainerAwareInterface,每当路由器解析其中一个控制器时,您就可以让容器调用传入主容器的setContainer方法。
希望这有帮助,我目前正在度假,所以不能给出代码示例,但是一旦我回来,我会编辑这个答案。