使用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.

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