Pull to refresh

Ускоряем разработку ч.1 (Расиширяем Zend_Db_Table)

Reading time4 min
Views663
Доброго времени суток. Многие согласятся с тем, что Zend Framework — это отличный инструмент, который позволяет сильно сократить время разработки проекта (и не только), но всё-равно часто приходится делать copy-paste методов в разных местах (контроллерах, моделях и т. д. ). Одним из таких мест является модель таблицы базы данных.

Zend_Db_Table и так позволяет легко выполнять CRUD операции.

Итак, какие действия при написании, например, модуля для CMS мы выполняем постоянно?

  • Добавить элемент
  • Выбрать элементы по какому-либо полю
  • Удалить элемент
  • Обновить элемент

Итак приступим.

Создадим класс library/App/Db/Table.php
<?php
class App_Db_Table extends Zend_Db_Table_Abstract
{

}


* This source code was highlighted with Source Code Highlighter.


Создадим метод для добавления элемента
  public function addItem($data){
    if(empty($data)) {
      throw new Exception("Нет данных для добавления");
    }
    return $this->insert($data);
  }


* This source code was highlighted with Source Code Highlighter.


Теперь создадим метод для обновления элемента по ключевому полю id
  public function updateItemById($id, $data = NULL){
    if(empty($id)) {
      throw new Exception("Необходимо указать id обновляемого элемента");
    }

    if(empty($data)) {
      throw new Exception("Нет данных для обновления");
    }
    
    $where = $this->getAdapter()->quoteInto('id = ?', (int)$id);
    return $this->update($data, $where);
  }


* This source code was highlighted with Source Code Highlighter.


Метод удаления элемента по ключевому полю id
  public function deleteItemById($id){
    if(empty($id)) {
      throw new Exception("Необходимо указать id удаляемого элемента");
    }
    $result = $this->delete(array('id = ?' => (int)$id));
    if(0 === $result) {
      throw new Exception("Элемент не найден");
    }
  }


* This source code was highlighted with Source Code Highlighter.


Метод выборки элемента по ключевому полю id
  public function getItemById($id){
    if(empty($id)) {
      throw new Exception("Необходимо указать id для выбора элемента");
    }
    $select = $this->getAdapter()->quoteInto('id = ?', (int)$id);
    $result = $this->fetchRow($select);
    if(NULL !== $result) {
      return $result->toArray();
    }else{
      throw new Exception("Элемент не найден");
    }
  }


* This source code was highlighted with Source Code Highlighter.


И для удобства будем использовать магический метод getItemsBy, который позволит выбрать элементы по значению любого поля.
  public function getItemsBy($key, $value){
    $where = $this->getAdapter()->quoteInto("$key = ?", $value);
    $result = $this->fetchAll($where)->toArray();
    if(count($result) > 0) {
      return $result;
    }else{
      throw new Exception("Элементы не найдены");
    }
  }

  public function __call($name, $arguments) {
    if(0 === strpos($name, 'getItemsBy')) {
     array_unshift($arguments, substr($name, 10));
     return call_user_func_array(array($this, 'getItemsBy'), $arguments);
    }
    
    throw new Exception("Неизвестный метод ".$name);
  }


* This source code was highlighted with Source Code Highlighter.


Как теперь это использовать? Создадим модель таблицы test (applicaiton/models/DbTable/Test.php) расширяющюю созданный нами класс, где будут доступны все написанные нами методы
class Model_DbTable_Test extends App_Db_Table
{
  protected $_name = 'test';
}


* This source code was highlighted with Source Code Highlighter.


Пример для контроллера
    // Создадим объект модели таблицы Test
    $model = new Model_DbTable_Test();

    // Выберем элемент с id = 1
    try{
      $item = $model->getItemById(1);
    }
    catch (Exception $e){
      print $e->getMessage();
    }

    // Выберем элемент используя магический мето getItemsBy()
    try{
      $item = $model->getItemsByName('itemname');
    }
    catch (Exception $e){
      print $e->getMessage();
    }


* This source code was highlighted with Source Code Highlighter.


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

P.S. не забудте добавить library/App для автоподгрузки классов, например в .ini конфиге
autoloaderNamespaces[] = «App_»
Tags:
Hubs:
Total votes 8: ↑5 and ↓3+2
Comments32

Articles