【问题标题】:How to use specific instances of a resource when using static methods (PHP)使用静态方法 (PHP) 时如何使用资源的特定实例
【发布时间】:2015-09-07 17:54:32
【问题描述】:

我的任务是开发一个网站 (PHP),其中大部分内容来自私有 Web API (JSON)。就应用程序设计而言,这对我来说是一条陡峭的学习曲线,但到目前为止我已经:

  1. 创建了一个 PHP SDK/包装器库,为我提供了从 API 获取和保存数据的方法。我从 Google Client SDK 等示例中寻找灵感。在内部,它使用 GuzzleHttp 来完成繁重的工作。

  2. 为我期望从 API 获得的每个数据响应创建了一个模型类。现在我可以使用具有可预测和预定义变量的实际类模型。

  3. 使用出色的 JSONMapper 包将我的 API JSON 响应递归映射到模型实例中。

现在问题来了。

我认为在每个模型上提供方法是个好主意,例如:

$user->save()

这将使用模型中可用的 API SDK 实例保存实例化对象的数据。应用程序不需要关心数据存储在哪里,或者如何使用 API。都很好。

因此我也认为对象应该能够获取自己是一个好主意(就像 Laravel 的做法一样,它的 Foo::find() 模式),所以我创建了静态方法,例如:

$user = User::get_by_id(1);

问题是,由于这是一个静态方法,我无法从用户模型中访问我的 API SDK 的特定实例。我无法轻松注入该依赖项,而无需在每个函数调用中传递它。

在本例中,由于“用户”扩展了“模型”,因此我使用了:

Model::$api = new Api;

目前这很好,但如果出于某种原因我需要在某些模型上使用我的 API SDK 的特定实例,我将无法使用。

我怎样才能最好地使用我的 API SDK 的特定实例,同时仍然在我的对象上提供这些静态方法,或者我在吠叫错误的树,这是一种反模式,我应该改用其他一些机制来创建和获取对象?

我目前正在研究“PHP、对象模式和实践”,因为我正在努力解决这些问题。

提前致谢

【问题讨论】:

  • 您所描述的问题是 Active Record 模式的主要问题之一。 Model 类与其数据访问对象紧密耦合,在您的案例中是 API 客户端。

标签: php static google-client


【解决方案1】:

您应该将对象的存储库与对象分开。对于用户,您可以创建:

class UserRepository {
    public __construct($api)
    public findById($id);
    public find(Criteria $criteria);
    public save (User $user);
}

您还可以阅读有关命令查询分离的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多