CakePHP 3.0:如何组织这些模型函数
CakePHP 3.0: How Can I Organize These Model Functions
我正在开发一个 CakePHP3 应用程序,该应用程序将用于显示有关我们的供应商当前提供的产品的信息。
** 不同的供应商以不同的方式提供他们的产品列表,CSV、JSON 或通过网络抓取 **
我创建了 2 个模型:
- 供应商 - 这指的是我们使用的特定供应商。
- VendorProducts - 这引用了我们所有供应商提供的所有产品。
我希望能够像这样调用:
$vendor->getAvailableProducts()
并让它获取 CSV 并解析它,获取 JSON,或者抓取供应商网站并使用它来使用该供应商的产品填充数据库中的 VendorProducts table。
我理解 Fat Models 和 Skinny Controllers 背后的想法,但是我在实现这个功能时遇到了一些困难。
我想提供以下功能。
- 可以通过 Web 界面调用供应商的 getAvailableProducts() 函数 AND/OR 一个 cakephp shell 脚本,可以 运行 在 cron 作业中。
- 由于某些功能(如抓取网站)需要相当长的时间,我希望能够在视图中看到此功能的进度,
例如:X/Y 从 {Supplier} 更新的产品。
这可以分解为以下几个问题:
1.我的 "getAvailableProducts()" 函数应该放在哪个文件中?
2。由于每个 $vendor 都有一个独特的 updateProducts() 函数,如何从 $vendor->getAvailableProducts()
调用正确的函数
// something like this?
public function getAvailableProducts() {
if($vendor->name == "SupplierA") {
getProductsFromSupplierA();
}
if($vendor->name == "SupplierB") {
getProductsFromSupplierB();
}
..., etc.
}
3。这个功能的进度怎么返回给一个View?
不要使用 table classes 在模型层或应用程序本身中创建新的命名空间:
- src/Vendor
- src/Model/Vendor
有一家工厂可以建造并且return你是供应商classes:
$vendorA = VendorFactory::get('SupplierA');
$vendorB = VendorFactory::get('SupplierB');
每个供应商 class 必须实现一个方法 fetchProducts()
,为此使用接口或抽象基 class。
该方法应该return 一个可用于在实体中转换产品的规范化数组:
$this->newEntities(VendorFactory::get('SupplierA')->fetchProducts());
如果无法知道记录总数,您将很难确定进度。当您抓取网站时,这很可能。当 API 没有告诉您每个 JSON 数据集的记录总数时,同样的问题也适用。 如果你能够以某种方式获得总计数,你可以这样做:
$this->newEntities(VendorFactory::get('SupplierA')->fetchProducts([
'limit' => 50,
'offset' => 0
]);
并为供应商实施分页,然后您可以使用它 运行 在 while() 循环中以 X 记录块的形式遍历所有记录。如果您通过 shell 触发它,您可以为此创建一个 "job" 并在每个块之后更新进度。已经有多种针对此类任务的现有解决方案。最后使用 Comet 或 Websockets 来更新您网站上的状态。或旧方法:每 X 秒触发一个 AJAX 请求以检查状态。
还有很多可以说的,但这实际上已经是一个非常的广泛问题,很可能没有足够的细节来涵盖所有情况。也有可能(我很确定)有不同的方法可以解决这个问题。
我正在开发一个 CakePHP3 应用程序,该应用程序将用于显示有关我们的供应商当前提供的产品的信息。
** 不同的供应商以不同的方式提供他们的产品列表,CSV、JSON 或通过网络抓取 **
我创建了 2 个模型:
- 供应商 - 这指的是我们使用的特定供应商。
- VendorProducts - 这引用了我们所有供应商提供的所有产品。
我希望能够像这样调用:
$vendor->getAvailableProducts()
并让它获取 CSV 并解析它,获取 JSON,或者抓取供应商网站并使用它来使用该供应商的产品填充数据库中的 VendorProducts table。
我理解 Fat Models 和 Skinny Controllers 背后的想法,但是我在实现这个功能时遇到了一些困难。
我想提供以下功能。
- 可以通过 Web 界面调用供应商的 getAvailableProducts() 函数 AND/OR 一个 cakephp shell 脚本,可以 运行 在 cron 作业中。
- 由于某些功能(如抓取网站)需要相当长的时间,我希望能够在视图中看到此功能的进度, 例如:X/Y 从 {Supplier} 更新的产品。
这可以分解为以下几个问题:
1.我的 "getAvailableProducts()" 函数应该放在哪个文件中?
2。由于每个 $vendor 都有一个独特的 updateProducts() 函数,如何从 $vendor->getAvailableProducts()
调用正确的函数// something like this?
public function getAvailableProducts() {
if($vendor->name == "SupplierA") {
getProductsFromSupplierA();
}
if($vendor->name == "SupplierB") {
getProductsFromSupplierB();
}
..., etc.
}
3。这个功能的进度怎么返回给一个View?
不要使用 table classes 在模型层或应用程序本身中创建新的命名空间:
- src/Vendor
- src/Model/Vendor
有一家工厂可以建造并且return你是供应商classes:
$vendorA = VendorFactory::get('SupplierA');
$vendorB = VendorFactory::get('SupplierB');
每个供应商 class 必须实现一个方法 fetchProducts()
,为此使用接口或抽象基 class。
该方法应该return 一个可用于在实体中转换产品的规范化数组:
$this->newEntities(VendorFactory::get('SupplierA')->fetchProducts());
如果无法知道记录总数,您将很难确定进度。当您抓取网站时,这很可能。当 API 没有告诉您每个 JSON 数据集的记录总数时,同样的问题也适用。 如果你能够以某种方式获得总计数,你可以这样做:
$this->newEntities(VendorFactory::get('SupplierA')->fetchProducts([
'limit' => 50,
'offset' => 0
]);
并为供应商实施分页,然后您可以使用它 运行 在 while() 循环中以 X 记录块的形式遍历所有记录。如果您通过 shell 触发它,您可以为此创建一个 "job" 并在每个块之后更新进度。已经有多种针对此类任务的现有解决方案。最后使用 Comet 或 Websockets 来更新您网站上的状态。或旧方法:每 X 秒触发一个 AJAX 请求以检查状态。
还有很多可以说的,但这实际上已经是一个非常的广泛问题,很可能没有足够的细节来涵盖所有情况。也有可能(我很确定)有不同的方法可以解决这个问题。