使用静态方法时如何使用资源的特定实例(PHP)

时间:2015-09-07 17:54:33

标签: php static google-client

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

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

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

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

  4. 现在回答问题。

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

    $user->save()

    这将使用模型中可用的API SDK实例保存实例化对象的数据。应用程序无需关心数据存储的位置或如何使用API​​。一切都好。

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

    $user = User::get_by_id(1);

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

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

    Model::$api = new Api;

    现在这很棒,但如果出于任何原因我需要在某些型号上使用我的API SDK的特定实例,我将无法做到。

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

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

    提前致谢

1 个答案:

答案 0 :(得分:0)

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

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

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