在 b4 中很抱歉创建了这样一个奇怪的话题,但我会尽量简洁。我正在尝试改进我制作的 php 包的面向对象设计。我有一个代表 en Http 外部 API的Api类。该类具有get、post、delete等方法,并封装了一些响应检索或 json 解码。此类接收 GuzzleHttp 客户端,因为它是执行此操作的构造函数参数。
然后,我创建了一些类对于很多终端类别的API有一个像销售,用户,等...一个例子方法,你可以像一个类找到销售将是recent()它的代码会做这样的事情: $this->api->get('recent-sales-endpoint.json')。这将需要注入API到销售的依赖,这样我可以写它的单元测试,所以我总是这样。
现在,如果我尝试充当安装了我的库并希望获得最近销售量的用户,我必须执行以下操作:
$api = new Api($client);
$sale = new Sale($api);
$recentSales = $sale->recent();
$car = new Car($api);
$newCars = $car->getNew();
所以我想知道这是否是一种改进或反模式,使我的包更易于使用。
在我的API类构造函数中,我为每个类别类创建实例。
private $client;
private $car;
private $sale;
public function __construct(Client $client)
{
$this->client = $client;
$this->car = new Car($this);
$this->sale = new Sale($this);
}
然后我可以创建访问方法,例如:
public function sale()
{
return $this->sale
}
因此,对于包用户来说,现在检索数据将是:
$api = new Api($client);
$recentSales = $api->sale()->recent();
$newCars = $api->car()->getNew();
您认为这两种方式中哪种方式最正确?此外,我认为我可以在第一次查询时初始化这些实例,而不是在构造函数中进行初始化,但我不知道我是否使设计过于复杂。