Zend - шаблон проектирования DataMapper & Table Gateway - PullRequest
4 голосов
/ 10 февраля 2012

Это прямо из Руководства по быстрому запуску Zend.Мой вопрос: зачем вам метод setDbTable(), когда метод getDbTable() назначает объект по умолчанию Zend_Db_Table?Если вы знаете, что этот маппер использует конкретную таблицу, зачем даже предлагать возможность использования «неправильной» таблицы через setDbTable()?Какую гибкость вы получаете, имея возможность устанавливать таблицу, если остальная часть кода (find(), fetchAll() и т. Д.) Относится к Guestbook?

class Application_Model_GuestbookMapper 
{
    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_Guestbook');
        }
        return $this->_dbTable;
    }

    ... GUESTBOOK SPECIFIC CODE ...
}

class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract
{
    protected $_name = 'guestbook_table';
}

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Фил прав, это известно как шаблон с отложенной загрузкой . Я только что реализовал этот шаблон в недавнем проекте из-за этих преимуществ:

  • Когда я вызываю метод getMember (), я получаю возвращаемое значение, независимо от того, было ли оно установлено ранее или нет. Это отлично подходит для метода цепочки : $this->getCar()->getTires()->getSize();

  • Этот шаблон предлагает гибкость в том, что внешний код вызова все еще может устанавливать значения элементов: $myClass->setCar(new Car());

- РЕДАКТИРОВАТЬ -

Будьте осторожны при реализации шаблона проектирования с отложенной загрузкой. Если ваши объекты не гидратированы должным образом, будет выдан запрос для каждой части данных, которые НЕ доступны. Лучшее, что можно сделать - это привязать свой журнал запросов к базе данных на этапе разработки, чтобы убедиться, что количество и тип запросов соответствуют вашим ожиданиям. В рамках проекта, над которым я работал, было выполнено более 27 запросов на «подробные» страницы, и я понятия не имел, пока не увидел запросы.

1 голос
/ 10 февраля 2012

Этот метод называется отложенной загрузкой.Это позволяет свойству оставаться пустым до тех пор, пока оно не будет запрошено, если оно не установлено ранее.

Одно использование для setDbTable() будет тестированием.Таким образом, вы можете установить макет таблицы БД или что-то в этом роде.

0 голосов
/ 09 мая 2013

Одно дополнение: если setDbTable() предназначен исключительно для отложенной загрузки, не имеет ли смысла делать его закрытым?Таким образом, это позволит избежать случайного присваивания и неправильной таблицы, как первоначально упоминал Сэм.Должны ли мы ставить под угрозу дизайн ради тестируемости?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...