2013-04-22 35 views
1

我是zf2的新手,並且在使用它的方式方面遇到了一些困難。zend框架2從實體中獲取表格instace

基本上我試圖從實體

得到表處理程序的實例在這個例子中(我們有一個

namespace Album\Model; 

class Album 
{ 
public $id; 
public $artist; 
public $title; 

    public function exchangeArray($data) 
    { 
     $this->id  = (isset($data['id'])) ? $data['id'] : null; 
     $this->artist = (isset($data['artist'])) ? $data['artist'] : null; 
     $this->title = (isset($data['title'])) ? $data['title'] : null; 
    } 
} 

而一個tableGetaway

namespace Album\Model; 

use Zend\Db\TableGateway\TableGateway; 

class AlbumTable 
{ 
    protected $tableGateway; 

    public function __construct(TableGateway $tableGateway) 
    { 
     $this->tableGateway = $tableGateway; 
    } 

    public function fetchAll() 
    { 
     $resultSet = $this->tableGateway->select(); 
     return $resultSet; 
    } 

    public function getAlbum($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 saveAlbum(Album $album) 
    { 
     $data = array(
      'artist' => $album->artist, 
      'title' => $album->title, 
     ); 

     $id = (int)$album->id; 
     if ($id == 0) { 
      $this->tableGateway->insert($data); 
     } else { 
      if ($this->getAlbum($id)) { 
       $this->tableGateway->update($data, array('id' => $id)); 
      } else { 
       throw new \Exception('Form id does not exist'); 
      } 
     } 
    } 

    public function deleteAlbum($id) 
    { 
     $this->tableGateway->delete(array('id' => $id)); 
    } 
} 

後使用ServiceManager配置表格網關並注入到AlbumTable中,我們可以將此函數放入控制器中

public function getAlbumTable() 
{ 
    if (!$this->albumTable) { 
     $sm = $this->getServiceLocator(); 
     $this->albumTable = $sm->get('Album\Model\AlbumTable'); 
    } 
    return $this->albumTable; 
} 

,所以我們可以做的東西一樣

public function indexAction(){ 
    $albums = $this->getAlbumTable()->fetchAll(); 
    return array('albums' => $albums); 
} 

我覺得這是非常多餘的,因爲這樣一來,如果我們有另一個控制器,我們必須重新聲明getAlbumTable功能再次

我的問題是有一種從實體中獲取表格實例的方法專輯

類似於

$album = new Album(); 
$album->getTable()->findAll(); 

回答

3

實際上根本不需要這個getAlbumTable()函數。這主要是爲了清理代碼,但很坦率地說:完全不需要。你可以簡單地設置你的行動訪問自己的的ServiceManager:

public function overviewAction() { // very minified 
    $table = $this->getServiceLocator()->get('Album\Model\AlbumTable'); 
    return array('albums' => $table->fetchAll()); 
} 

與分離,這是在一個請求之間主要做轉發的目的到另一個動作的優點。在這種情況下,ServiceLocator將不會被稱爲第二次。

您的方法會使代碼有點模糊。因爲你的Model和Mapper之間沒有乾淨的分離。 Album -Model應該只是一個Data-Object