Osfonder's blog Just another wd weblog

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;

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