dpi9530 2011-05-09 09:53
浏览 84
已采纳

使用Data Mapper / Gateway设计模式无法将数据传递到视图中。 :(

I can't get the data displayed on my view. And I'm not getting why.


I have a gateway defined like this:

//application/models/Dbtable/Contact.php

class Application_Model_DbTable_Contact extends Zend_Db_Table_Abstract
{
    protected $_name = 'Contact';
}


I have a Mapper like this:

//application/models/mappers/Contact.php

class Application_Model_Mapper_Contact
{

    protected $_dbTable;

    public function setDbTable($dbTable) 
    {
        if (is_string($dbTable)) 
        {
            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) 
        {
            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }

    public function getDbTable() 
    {
        if (null === $this->_dbTable) 
        {
            $this->setDbTable('Application_Model_DbTable_Contact');
        }

        return $this->_dbTable;
    }


    public function fetchAll() 
    {
        $resultSet = $this->getDbTable()->fetchAll();

        $entries = array();

        foreach ($resultSet as $row) 
        {

            $entry = new Application_Model_Contact();

            $entry->setId($row->id);
            $entry->setname($row->name);
            $entry->setaddress($row->address);

            $entries[] = $entry;        

        }

        return $entries;
    }
}


Then, I have a Domain Object like this:

//application/models/Contact.php

class Application_Model_Contact
{
    protected $_id;
    protected $_name;
    protected $_address;

    public function getId() {
        return $this->_id;
    }

    public function setId($id) {
        $this->_id = $id;
    }

    public function getname() {
        return $this->_name;
    }

    public function setname($name) {
        $this->_name = $name;
    }

    public function getaddress() {
        return $this->_address;
    }

    public function setaddress($address) {
        $this->_address = $address;
    }


}


Then, I have a controller like this:

//application/controllers/ContactController.php

class ContactController extends Zend_Controller_Action
{

    public function init()
    {

    }

    public function indexAction()
    {
        $Contact = new Application_Model_Mapper_Contact();        
        $this->view->entries = $Contact->fetchAll();
    }


}


Finally I get a view like this:

//application/views/Contact/index.phml

<dl>
   <?php foreach ($this->entries as $entry): ?>
    <dt><?php echo $this->escape($entry->name) ?></dt>
    <dd><?php echo $this->escape($entry->address) ?></dd>
    <?php endforeach ?>
</dl>

I'm getting:

Notice: Undefined property: Application_Model_Contact::$name

And it's right, because, if I dump $this->entries I get no property with this name.

array(4) {
  [0]=>
  object(Application_Model_Contact)#50 (3) {
    ["_id":protected]=>
    string(1) "1"
    ["_name":protected]=>
    string(5) "NameA"
    ["_address":protected]=>
    string(7) "AddressA"
  }
  [1]=>
  object(Application_Model_Contact)#52 (3) {
    ["_id":protected]=>
    string(1) "2"
    ["_name":protected]=>
    string(5) "NameB"
    ["_address":protected]=>
    string(7) "AddressB"
  }
  [2]=>
  object(Application_Model_Contact)#54 (3) {
    ["_id":protected]=>
    string(1) "3"
    ["_name":protected]=>
    string(5) "NameC"
    ["_address":protected]=>
    string(7) "AddressC"
  }
  [3]=>
  object(Application_Model_Contact)#56 (3) {
    ["_id":protected]=>
    string(1) "4"
    ["_name":protected]=>
    string(5) "NameD"
    ["_address":protected]=>
    string(7) "AddressD"
  }
}


If of course, I do:

<dl>
   <?php foreach ($this->entries as $entry): ?>
    <dt><?php echo $this->escape($entry->_name) ?></dt>
    <dd><?php echo $this->escape($entry->_address) ?></dd>
    <?php endforeach ?>
</dl>

I get:

Fatal error: Cannot access protected property Application_Model_Contact::$_name

And it makes sense, because, it is protected.

I've tried to follow Zend Quick Guide Tutorial structure, but I can't figure this out. http://framework.zend.com/manual/en/learning.quickstart.create-model.html

How can we properly display those elements on the view ? What am I missing ?

Update: As OZ_ pointed out, I indeed could use the getters, but what is bugging me is that, on Zend Quick Start Tutorial, where I've based my structure, they DON'T use getters on the view, so perhaps, I'm doing something wrong.

Thanks a lot for your time here.

  • 写回答

1条回答 默认 最新

  • douyan4243 2011-05-09 10:00
    关注

    Use getters to get property:
    $this->escape($entry->_name)
    replace with
    $this->escape($entry->getname())
    and other properties in same way.
    Protected and private fields can be accessed only through the getters and setters.

    This can be useful to read: http://www.php.net/manual/en/language.oop5.visibility.php

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!