2012-10-10 162 views
1

我需要制作一个CakePHP帮手,它需要动态制作一些HTML。但是代码的一部分是做1-2个数据库查询。这些查询对于这个帮助程序非常重要,因为它所填充的所有文本都在数据库中。制作CakePHP Helper所需的建议

根据MVC模式,我不应该在View(Helper)中进行数据库查询。我想知道最好的设计是什么,因为我希望它与PHPUnit测试一致。

任何想法将受到欢迎...

回答

2

由于View工作纯粹是为了从Controller显示传递给它的(已有)的信息,我认为这将是这样的:

控制器:

public function foo() { 
    $bar = $this->MyModel->find('all'); 
    $this->set(array('bar' => $bar)); 
} 

您的看法:

$result = $this->MyHelper->foo($bar); 
+0

听起来不错Paulo ...这看起来像一个可行的解决方案。我在想什么是数据库查询将进入模型中的函数。这个函数将在控制器中被调用,并且输出将被传递给帮助器。这样,在测试Helper时,我可以模拟模型函数,并将它传递给我想要的数据,以使单元测试独立于模型。 –

1

您可以创建一个组件:

/** 
* Set data info 
* @access public 
* @return void 
*/ 
public function setData() 
{ 
    $data = $this->Model->find('first', $params); 
    $this->Controller->set('data', $data); 
} 

而且在布局打印助手:

echo $this->MyNewHelper->someHtml($data); 
+1

组件是一个不好的地方处理数据,因为它们绑定到控制器。应该在模型中完成并传递给视图。您的示例也不显示实际组件。 –

0

如果它的东西,可能不是一个助手的元素,你可以使用CakePHP的RequestAction [details here]到拉取元素所需的数据。

然后,您可以将任何参数传递给元素,并使用这些参数传递给您的控制器,从而进行模型调用。

这与MVC非常吻合,因为元素只显示视图,但它指定应该从哪里得到它的数据(仍然使用模型来检索它),这使得它非常可重用。