Osfonder's blog Just another wd weblog

25Апр/100

Обзор Doctrine 2.0

Презентация, находящейся пока в разработке версии, Doctrine ORM PHP Framework от разработчиков.
Подробно, вплоть до используемых ими инструментов. Очень хорошо раскрыли перспективы развития.

Метки записи: , Нет комментариев
24Апр/100

Что такое ORM и когда её использовать

Обоснование ORM модели. Что к чему

В первом, формальном приближении, понимание ORM модели в том, что все записи представляются в виде объектов, поля — в виде свойств. Но не стоит на этом определении заострять особое внимание. Суть модели чуть ниже.

Дело в том, что очень часто(в средних и больших проектах), мы не имеем заранее представления о том, какие и сколько свойств будет у объекта.

Например, если мы храним в базе данных информацию о недвижимости, пусть частном доме, мы не можем заранее знать какими параметрами он будет обладать, есть ли у него гараж или сад, или большая часть окон на восток, или мансарда имеет место быть, или мало ли еще чего продавец захочет указать.

Даже в этом примере физического объекта на этапе проектирования определить все эти параметры нельзя. Что уж говорить о профилях пользователей и тем более об абстрактных информационных и научных данных.

Классическая модель

Старая школа подсказала бы нам заводить для каждого такого объекта таблицу и таблицу связанных с ним параметров. А где возможно определить количество параметров заранее, ограничиться одной с множеством полей — одно под каждое свойство, грубо говоря.
Получиться хорошая, быстрая база данных.

Суть ORM

Но технологии идут вперед и скорость работы серверов, куда быстрее чем раньше. Что позволяет, сильно модель базы данных упростить, и ускорить процесс разработки. В наипростейшем случае сократить до двух таблиц: одна всех объектов, вторая — их свойств.
В этом и есть истинное понимание и суть ORM модели базы данных.

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

Когда отказываться от ORM

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

Авторитетное мнение

Современный PHP Framework — Symfony, проводил 15-17 февраля 2010 года международную конференцию в Париже symfony live.
На ней был весьма интересный доклад от разработчика из Yahoo! Дастина Уиттла(Dustin Whittle). Он рассказал, как они затачивают symfony под свои проекты.
Так же он отметил, что для маленьких проектов нужно отказываться от ORM, а для средних нужно использовать Doctrine.

Посты по теме

  1. Doctrine tutorial. Первые шаги. Установка, настройка, создание таблиц
23Апр/102

Doctrine tutorial. Первые шаги. Установка, настройка, создание таблиц

По долгу службы я работаю на проектом, в котором возникла необходимость использования этой системы.
Если вкратце Doctrine — это открытый php framework для работы с ORM моделью базы данных.
До этого с ним работать не приходилось и я занялся поиском уроков по началу работы с этим фрэймворком. Но ресурсов на русском языке, почти не было. Статьи были либо уже матерых разработчиков скупо описывающих шаблоны, либо обзорные о возможностях. И тех и тех по пальцам пересчитать. Но, как и с чего начать не найти.
Поэтому я пришел пораньше в пустой офис, чтобы описать, пока свежи в памяти и материалы под рукой, первые этапы разработки на нем.

Итак, Doctrine — это фреймворк, генерирующий по заданным вами правилам, модель базы данных и классы php для работы с ней. Таким образом позволяя полностью абстрагироваться от конкретной БД. PostgreSQL, Oracle, MySQL и т.п. не меняя описания вашей базы данных в doctrine, вы можете использовать любую из них.

1. Установка

С чего начать?
Для начала в папку с проектом нужно загрузить framework. Например так:

svn co http://svn.doctrine-project.org/branches/1.2/lib lib/vendor/doctrine

Теперь в lib/vendor/doctrine лежит наша библиотека.

2. Настройка

Далее в корне создаем конфигурационный файл, в котором буду базовые настройки.

bootstrap.php

require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
spl_autoload_register(array('Doctrine_Core', 'modelsAutoload'));
$manager = Doctrine_Manager::getInstance();
$manager->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
$manager->setAttribute(Doctrine_Core::ATTR_AUTOLOAD_TABLE_CLASSES, true);
$manager->setAttribute(Doctrine_Core::ATTR_MODEL_LOADING, Doctrine_Core::MODEL_LOADING_CONSERVATIVE);

$conn = Doctrine_Manager::connection('mysql://USERNAME:PASSWORD@localhost/DATABASE');
$conn->setCharset('utf8');

Этот файл будет подключаться во всех скриптах, использующих Doctrine:

require_once('bootstrap.php');

3. Создание таблиц

Подготовка завершена. Настало время описать нашу базу данных. Самый распространенный это способ сделать — использовать yaml(доктрин может сгенерировать эти файлы и на основе имеющейся БД)

Начнем с простого, одна таблица user на языке yaml будет выглядеть так:
schema.yml

User:
  tableName: user
  columns:
    id:
      type: integer(8)
      primary: true
      autoincrement: true
    is_active:
      type: integer(1)
      default: '1'
    is_super_admin:
      type: integer(1)
      default: '0'
    created_at:
      type: timestamp(25)
      notnull: true
    updated_at:
      type: timestamp(25)
      notnull: true
    first_name: string(255)
    last_name: string(255)
    username: string(255)
    password: string(255)
    type: string(255)

Оригинальный SQL синтаксис для неё был бы такой:

CREATE TABLE user (
   id bigint(20) NOT NULL auto_increment,
   first_name varchar(255) default NULL,
   last_name varchar(255) default NULL,
   username varchar(255) default NULL,
   password varchar(255) default NULL,
   type varchar(255) default NULL,
   is_active tinyint(1) default '1',
   is_super_admin tinyint(1) default '0',
   created_at TIMESTAMP,
   updated_at TIMESTAMP,
   PRIMARY KEY  (id)
) ENGINE=InnoDB

Но нас он не интересует.

Создаем папку schemas и помещаем в нее вышеуказанный файл schema.yml

Теперь создадим файл generate.php в корне который сделает всю работу по созданию БД и php классов:

include 'bootstrap.php';
Doctrine_Core::dropDatabases();
Doctrine_Core::createDatabases();
Doctrine_Core::generateModelsFromYaml('schemas/schema.yml', 'models');
Doctrine_Core::createTablesFromModels('models');

После запуска, в корневой папке будет создана папка models, с содержащимися в ней php классами, а в базе данных будут создана таблица user (проверьте имя пользователя, пароль и название БД в bootstrap.php).

4. Использование

Ну и тестовый файл:
creareUser.php

require_once('bootstrap.php');
Doctrine_Core::loadModels('models');

$user = new User();

$user->username = 'login';
$user->password = md5('pass'.'salt');

$user->save();

var_dump($user->toArray());

Выполнив его увидим информацию о только что созданном пользователе и наша таблица user потолстеет на одну запись (проверьте имя пользователя, пароль и название БД).

5. Бонус

Интриги ради продемонстрируем одну из возможностей Doctrine

Открываем файл models/User.php и заменяем его содержимое на такое:
models/User.php

class User extends BaseUser
{
    public function setPassword($password)
    {
        return $this->_set('password', md5($password));
    }
}

Теперь, создавая пользователя можно сразу писать

$user->password = 'pass';

и он будет автоматически захэширован в md5:
убедиться можно, выполнив

echo $user->password;

Для начала, пожалуй, достаточно.