CakePHP 3.0:如何组织这些模型函数

时间:2015-09-22 19:44:00

标签: cakephp cakephp-3.0 solid-principles

我正在开发一个CakePHP3应用程序,用于显示供应商目前提供的产品信息。

**不同的供应商以不同的方式提供产品清单,CSV,JSON或通过网络搜索**

我创建了两个模型:

  1. 供应商 - 这引用了我们使用的特定供应商。
  2. VendorProducts - 这引用了我们所有供应商提供的所有产品。
  3. 我希望能够打电话:

    $vendor->getAvailableProducts()
    

    让它获取CSV并解析它,获取JSON或抓取供应商网站并使用此网站使用该供应商的产品填充数据库中的VendorProducts表。

    我理解Fat Models和Skinny Controllers背后的想法,但是我在实现这个功能时遇到了一些困难。

    我想提供以下功能。

    1. 供应商的getAvailableProducts()函数可以通过Web界面调用和/或可以在cron作业中运行的cakephp shell脚本。
    2. 由于某些功能(如抓取网站)需要相当长的时间,我希望能够在视图中看到此功能的进度,     例如:X / Y产品更新自{供应商}。
    3. 这可以分解为以下问题:

      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?

1 个答案:

答案 0 :(得分:1)

不要使用表类来在模型层或应用程序本身中创建新的命名空间:

  • SRC /供应商
  • SRC /型号/供应商

有一个构建并返回供应商类的工厂:

$vendorA = VendorFactory::get('SupplierA');
$vendorB = VendorFactory::get('SupplierB');

每个供应商类必须实现方法fetchProducts(),使用接口或抽象基类。

该方法应返回一个规范化数组,该数组可用于转换实体中的产品:

$this->newEntities(VendorFactory::get('SupplierA')->fetchProducts());

如果无法知道记录总数,您将很难确定进度。这可能是你刮网站的时候。当API没有告诉您每个JSON数据集的记录总量时,同样的问题也适用。 如果你能够以某种方式得到总数,你可以这样做:

$this->newEntities(VendorFactory::get('SupplierA')->fetchProducts([
    'limit' => 50,
    'offset' => 0
]);

并为供应商实施分页,然后您可以使用该分页在X记录块中的while()循环中运行所有记录。如果你通过shell触发,你可以创建一个" job"为此,并在每个块之后更新进度。这种任务已有多种现有解决方案。最后使用Comet或Websockets在您的网站上更新状态。或旧方法:每隔X秒触发一次AJAX请求以检查状态。

还有很多可以说的,但这实际上已经是非常广泛的问题,很可能没有足够的细节来涵盖所有情况。也有可能(我很确定)有不同的方法可以解决这个问题。