【问题标题】:PHP - DI container in a REST clientPHP - REST 客户端中的 DI 容器
【发布时间】:2012-04-16 15:16:17
【问题描述】:

我正在尝试用 PHP 构建一个基本的 REST 客户端,以此来让自己熟悉依赖注入容器的概念。最终,我想做这样的事情:

$client = new RestClient();
$client->getService('user', array('id, optional fields...'));

但我也希望能够指定应该处理请求的对象(例如,如果我想使用 fopen 而不是 curl)。

根据我目前阅读的内容,实现此目的的正确方法是:

$request = new ServiceDefinition( 
    'Curl', 
    array('...') 
); 
$user = new ServiceDefinition('User',  
    array(new ServiceReference('request')) 
); 
$container = new ServiceContainer(array( 
    'request' => $request, 
    'user'    => $user, 
));

我的问题是:有没有更简单的方法来建立用户对象和请求对象之间的依赖关系? (可能是 RestClient() 上的基本 setter 注入?)

提前致谢。

【问题讨论】:

    标签: php rest dependencies containers


    【解决方案1】:

    根据您对依赖注入的现有熟悉程度,使用 DI 容器可能会陷入困境。简而言之,当然可以用简单的 setter 注入替代容器:

    interface HttpAdapterInterface {}
    class CurlAdapter implements HttpAdapterInterface {}
    class SocketAdapter implements HttpAdapterInterface {}
    
    class RestClient {
        public function setHttpAdapter(HttpAdapterInterface $adapter) {
            // ...
        }
    }
    

    Fabien Potencier 有 a good series on DI,第二部分介绍 DI 容器(以及何时使用它们)。

    【讨论】:

    • 如果您不介意,我还有一个问题。如果我的 RestClient 类函数中有一个getUser($id),它返回一个 User 对象,如果我不使用 DI 容器,如何避免 RestClient 和 User 类之间的强耦合?
    • 这就是 DI 容器可能运行良好的地方。我会让 User 模型采用一个名为 Resolver 之类的容器,它本质上用作 User 类如何通过 ID 获取的适配器。然后你有一个具体的RestClientResolver,其中包含你的 REST 客户端,并且知道如何使用它通过 ID 获取用户。
    • 考虑到您的上述帖子,您介意向我展示您如何想象用户实例化吗?对不起,如果这听起来像一个愚蠢的请求,但我对 oop 中的这些良好做法很陌生。
    • Here's a quick example。根据填充用户模型的方式,最好让User 中的所有这些方法都是静态的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2021-12-09
    • 2020-02-15
    • 2017-03-31
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多