我收到了关于我的代码的反馈,其中说我不正确地使用依赖注入:
您正在使用DI,但除了
Request和Response之外,您不在任何地方使用它。以下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;
}有人能解释我做错了什么吗?
发布于 2020-01-02 13:39:42
反馈很可能是指您实际上实例化了路由定义的类;并且您正在手动地将依赖项传递给它们。
$router->map('GET', '/tokens/{id}', [new APIController($server, $tokenRepository, $logger), 'get']);注意new关键字
使用这种方法,在解析文件时,系统将创建APIController的实例--是的,有几个。
你要么用
$router->map('GET', '/', [APIController::class, 'get']);或
$router->map('GET', '/', 'APIController::get');这样,路由器只会在需要时实例化它们。
似乎您的方法需要$server, $tokenRepository, $logger,将它们定义为Controller class上的文档描述
https://stackoverflow.com/questions/59491552
复制相似问题