2

我想从概念上了解如何设置控制器/模型,以防我想通过不同的控制器导入供应商数据(csv/xml/soap/..)。我简化了我的案例以便更好地集中注意力。

在 ATK4 中,我有 Model_Supplier。主要字段是:名称,类型。类型可以是 csv1,csv2,csv3,xml1,xml2,soap1。一些供应商正在使用相同的类型。

我喜欢加载模型并执行->import()。但是 import() 对于每种类型应该是不同的。

我考虑了以下可能性:[1]加载模型,setController,钩子方法来建模然后使用model->import()

$m=$this->add('Model_Supplier)->load(1);
$m->setController($m['type']);
$m->import();

然后在 Controller_Csv1 中,需要通过 init() 像这样添加方法 import():

$this->owner->addMethod('import',array($this,'import'));

[2] 加载模型,setController 并执行 controller->import()

$m=$this->add('Model_Supplier)->load(1);
$c=$m->setController($m['type']);
$c->import();

那么控制器中的 import() 应该引用 $this->owner 作为模型

[3] 另一种选择是使用 Model_Supplier_Csv1 扩展 Model_Supplier,然后在此处使用 import()。但是,我首先需要加载 Model_Supplier 来识别类型,然后卸载并再次加载 Model_Supplier_$type

[4]或者添加模型,然后添加控制器,然后将模型实例设置为控制器并执行controller->import()

$m=$this->add('Model_Supplier)->load(1);
$c=$this->add('Controller_'.$m['type']);
$c->setModel($m);
$c->import();

[5] 也许是我没有想到的另一种解决方案。

什么是符合 ATK4 的最佳方法?

4

1 回答 1

2

2.

这取决于您的应用程序中的许多因素,但我认为第二种选择是最合适的。用法是:

$model->setController($m['type'])->import();

您还可以在模型中创建方法:

function import(){
    return $this->setController($m['type'])->import();
}

那么你可以简单地打电话$model->import();

于 2012-08-02T09:56:25.647 回答