首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于route.thephpleague.com的DI的正确方法

关于route.thephpleague.com的DI的正确方法
EN

Stack Overflow用户
提问于 2019-12-26 17:29:46
回答 1查看 64关注 0票数 1

我收到了关于我的代码的反馈,其中说我不正确地使用依赖注入:

您正在使用DI,但除了RequestResponse之外,您不在任何地方使用它。以下10行将始终实例化对象,即使您从未使用它们。

在这些线上,我有这样的东西

代码语言:javascript
复制
$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:

代码语言:javascript
复制
$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']);

控制器

代码语言:javascript
复制
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;
    }

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-02 13:39:42

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

代码语言:javascript
复制
$router->map('GET', '/tokens/{id}', [new APIController($server, $tokenRepository, $logger), 'get']);

注意new关键字

使用这种方法,在解析文件时,系统将创建APIController的实例--是的,有几个。

你要么用

代码语言:javascript
复制
$router->map('GET', '/', [APIController::class, 'get']);

代码语言:javascript
复制
$router->map('GET', '/', 'APIController::get');

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

似乎您的方法需要$server, $tokenRepository, $logger,将它们定义为Controller class上的文档描述

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59491552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档