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;

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

Комментарии (2) Пинги (0)
  1. Статья интересная, но одно но, такое встречаю на большинстве блогов. Кто-то начинает описывать введение к чему-либо, все отлично интересно, «автор пеши еще». А дальше тишина. Было бы не плохо прочитать про создание более сложных структур, интересные вопросы. Все таки оффман, это далеко не туториал. Хотя и без оффдокументации далеко не уйдешь тоже.
    Поэтому пишите еще статьи, не оставляйте одно введение)

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


Оставить комментарий


Нет обратных ссылок на эту запись.