【问题标题】:Injecting container to controller with league/route使用联盟/路线将容器注入控制器
【发布时间】:2016-05-09 14:35:17
【问题描述】:

我正在使用联赛/路线,我想将我的容器注入控制器。这是我已经拥有的:

提供RouteCollection:

$this->getContainer()->share('route', function () {
    $route = require $this->getContainer()->get('baseDir').'/config/routes.php';

    return $route;
});

baseDir/config/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-&gt;dispatch($request, $response); 中。将该容器注入我的控制器的正确方法是什么?

【问题讨论】:

    标签: php routing containers


    【解决方案1】:

    首先这里有几点。

    1. 将容器注入您的控制器是服务位置。这被认为是一种反模式(http://ralphschindler.com/2012/10/10/di-dic-service-locator-redux 很好地解释了 DI 和 SL 之间的区别)。
    2. 在您的示例中,您在路由集合上显式设置反射容器,这意味着它将仅尝试通过反射解决依赖关系,而不是从您可能设置的任何定义中解析,因为原始容器正在被覆盖。

    如果您坚持在控制器中使用容器,则可以在容器上使用变形器来在每个控制器中实现此目的。 http://container.thephpleague.com/inflectors/ - 通过使用此链接中的方法,您可以让您的控制器实现 ContainerAwareInterface,并且每当路由器解析其中一个控制器时,您都可以让容器调用在您的主容器中传递的 setContainer 方法。

    希望这会有所帮助,我目前正在度假,因此无法提供代码示例,但我会在返回后编辑此答案。

    【讨论】:

    • 感谢关于服务定位器的帖子。当我写这篇文章时,我很累(晚上),我并不是想将整个容器注入控制器,我只是想注入 Twig 对象。你的回答部分帮助了我,但我不得不使用withMethodCall,因为使用变形器它只是没有注入那个对象或者我做错了什么。你什么时候回家(我不想让你在假期关心我的问题:)你可以在这里查看我的代码:git.io/vrfvi#L21Happy holiday!
    • 星期二回来,到时会帮助你
    • 碰一下以防你忘记了
    • 我想你忘记了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多