Dependency injection 有关route.theppLeague.com的DI的正确方法

Dependency injection 有关route.theppLeague.com的DI的正确方法,dependency-injection,slim,thephpleague,Dependency Injection,Slim,Thephpleague,我收到了关于我的代码的反馈,该代码说我错误地使用了依赖注入: 您正在使用DI,但除了 请求和响应。以下10行将始终显示 实例化对象,即使您从未使用过它们 在这些方面,我有 $router->map('GET', '/tokens/{id}', [new APIController($server, $tokenRepository, $logger), 'get']); $router->map('GET', '/tokens', [new APIController($server

我收到了关于我的代码的反馈,该代码说我错误地使用了依赖注入:

您正在使用DI,但除了
请求
响应
。以下10行将始终显示 实例化对象,即使您从未使用过它们

在这些方面,我有

$router->map('GET', '/tokens/{id}', [new APIController($server, $tokenRepository, $logger), 'get']);
$router->map('GET', '/tokens', [new APIController($server, $tokenRepository, $logger), 'list']);
....
$response = $router->dispatch($container->get('request'));
根据研究,这似乎是正确的方法。Bootstrap.php:

$container  = new Container;
$logger = new Logger('book');

$tokenRepository = new RedisTokenRepository($predis, $logger);

$container->add(Logger::class);
$container->add(Server::class);
$container->add(TokenController::class)->addArguments([Server::class, $logger]);
$container->add(APIController::class)->addArguments([Server::class, $tokenRepository, $logger]);

$strategy = (new ApplicationStrategy)->setContainer($container);
$router   = (new Router)->setStrategy($strategy);

$router->map('GET', '/', [new Acme\APIController, 'someMethod']);
控制器

class APIController
{
    private $server;
    private $tokenRepository;
    private $logger;

    public function __construct(
        Server $server,
        TokenRepositoryInterface $tokenRepository,
        LoggerInterface $logger
    )
    {
        $this->server = $server;
        $this->tokenRepository = $tokenRepository;
        $this->logger = $logger;
    }

有人能解释我做错了什么吗?

反馈很可能是指您实际实例化了路由定义的类;您正在手动将依赖项传递给它们

$router->map('GET', '/tokens/{id}', [new APIController($server, $tokenRepository, $logger), 'get']);
注意
new
关键字

使用这种方法,在解析文件时,系统将创建
APIController
s-yes的实例

你应该使用

$router->map('GET', '/', [APIController::class, 'get']);

这样,路由器只会在需要它们时实例化它们

您的方法似乎需要
$server、$tokenRepository、$logger

将它们定义为
控制器类上的它们

当我执行上述任一方法或在我链接的文档中执行时,我得到1。函数Tokens\Controllers\APIController::u construct(),在第122行的/server/http/vendor/league/route/src/route.php中传递了0个参数,预期正好是3个“或2”APIController'未找到我认为您缺少控制器甚至容器的DI定义;我已经做了,请看上面的编辑。同样的错误也会发生。
$router->map('GET', '/', 'APIController::get');