【问题标题】:CakePHP 3.0: How Can I Organize These Model FunctionsCakePHP 3.0:如何组织这些模型函数
【发布时间】:2015-09-23 06:32:27
【问题描述】:

我正在开发一个 CakePHP3 应用程序,该应用程序将用于显示有关我们的供应商当前提供的产品的信息。

** 不同的供应商以不同的方式提供他们的产品列表,CSV、JSON 或通过网络抓取**

我创建了 2 个模型:

  1. 供应商 - 这引用了我们使用的特定供应商。
  2. VendorProducts - 这引用了我们所有供应商提供的所有产品。

我希望能够调用类似:

$vendor->getAvailableProducts()

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

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

我想提供以下功能。

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

这可以分解为以下问题:

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?

【问题讨论】:

    标签: cakephp cakephp-3.0 solid-principles


    【解决方案1】:

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

    • src/供应商
    • src/型号/供应商

    有一个工厂来构造并返回你的 Vendor 类:

    $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 触发它,您可以为此创建一个“作业”并在每个块之后更新进度。对于此类任务,已经有多种现有的解决方案。最后使用 Comet 或 Websockets 在您的网站上更新状态。还是老办法:每隔 X 秒触发一次 AJAX 请求来检查状态。

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

    【讨论】:

    • 谢谢。你提供了非常详尽的细节,也是我开始的好地方。我会着手解决这个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2014-07-31
    相关资源
    最近更新 更多