在使用Zend Framework时,我们经常需要自定义帮助程序来简化工作。在zf1中,从helper访问数据库模型很容易,但我卡在了如何在Custom View Helper中访问任何表的数据库模型上。因为我需要它,所以我通过在视图中创建一个新的db adapter对象来解决问题,这并不是一个好方法。但最近我通过一种非常有趣的方式知道了如何在视图助手中访问数据库适配器,并且可以在任何表上执行任何查询。这可能不是Zend F2的方式,但是解决问题的方法非常简单和快捷。
以下是我的模型示例...
<?php
namespace Application\Model;
use Zend\Db\TableGateway\TableGateway;
class SlideImageSubTable {
protected $tableGateway;
public $adapter;
public function __construct(TableGateway $tableGateway) {
$this->tableGateway = $tableGateway;
$this->adapter = $this->tableGateway->getAdapter();
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
public function getSlideImageSub($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
public function getImageMenu($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('slide_image_id' => $id));
$rows = array_values(iterator_to_array($rowset));
if (!$rows) {
throw new \Exception("Could not find row $id");
}
return $rows;
}
public function saveSlideImageSub(SlideImageSub $slideImageSub) {
$data = array(
'slide_image_id' => $slideImageSub->slide_image_id,
'title' => $slideImageSub->title,
'description' => $slideImageSub->description
);
$id = (int) $slideImageSub->id;
if ($id == 0) {
$this->tableGateway->insert($data);
} else {
if ($this->getSlideImageSub($id)) {
$this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Form id does not exist');
}
}
}
public function deleteSlideImageSub($id) {
$this->tableGateway->delete(array('id' => $id));
}
}
只需查看“public $adapter”公共变量。在构造函数中,我将通过调用$this->tableGateway->getAdapter()方法来初始化它,getAdapter()可通过网关对象使用。
然后在我的控制器操作视图中,我必须将其分配给任何变量并将该变量传递到视图页面。像这样...
public function equitiesAction() {
$image_id = $this->params('id');
$result = $this->getTable('SlideImageSub')->getImageMenu($image_id);
$adapter = $this->table->adapter;
$view = new ViewModel(array(
'result' => $result,
'adapter' => $adapter,
));
return $view;
}
在视图中,我将“adapter”对象传递给自定义视图,如下所示...
<?php echo $this->GetMenuProducts( $this->adapter); ?>
现在在自定义视图中,我可以使用这个数据库适配器对象并在任何表上创建选择查询。
希望这能帮助到某些人,我寻找了如何在自定义视图助手中使用数据库访问,但提供的配置方法对我来说不起作用。
谢谢