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;

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

22Мар/100

Используйте CDN для ускорения своих сайтов.

Создавая современный сайт или веб-приложение вы наверняка используете сторонние JavaScript библиотеки и css фрэймворки.

Самые популярные и используемые из них располагаются в CDN Google, Microsoft и Yahoo!. Это значит, что вы можете подключать их на ваших страницах прямо с серверов вышеуказанных компаний.

А следовательно посетитель, пришедший с другого сайта, который использует ту же библиотеку, с той же Content Delivery Network, не будет повторно ее скачивать и затратит меньше времени на загрузку страницы. Вы же — понизите побочный траффик своего сервера.

Ниже представлен список наиболее полпулярных библиотек с сылками в CDN.

jQuery

Последняя версия первой ветки:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

1.4.2
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jquery/jquery-1.4.2.min.js"></script>

jQuery UI

1.7.2

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js"></script>

CSS для jQuery UI

jQuery Validate Plugin

1.6
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jQuery.Validate/1.6/jQuery.Validate.min.js"></script>

ASP.NET Ajax Start.js

beta 0911

<script type="text/javascript" src="http://ajax.microsoft.com/ajax/beta/0911/Start.js"></script>

Prototype

1.6.1.0

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"></script>

script.aculo.us

1.8.3

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js"></script>

MooTools

1.2.4

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/mootools/1.2.4/mootools-yui-compressed.js"></script>

Dojo

1.4.1

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.4.1/dojo/dojo.xd.js"></script>

SWFObject

2.2

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>

Yahoo! User Interface Library (YUI)

2.8.0r4

<script type="text/javascript" src="http://yui.yahooapis.com/2.8.0r4/build/yuiloader/yuiloader-min.js"></script>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/yui/2.8.0r4/build/yuiloader/yuiloader-min.js"></script>

3.0.0

<script type="text/javascript" src="http://yui.yahooapis.com/3.0.0/build/yui/yui-min.js"></script>

Ext Core

3.1.0

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/ext-core/3.1.0/ext-core.js"></script>

Chrome Frame

1.0.2

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js"></script>

YUI CSS Reset

2.8.0r4

<link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/2.8.0r4/build/reset/reset-min.css"/>

jQuery UI Themes

<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/themes/base/jquery-ui.css"/>

Black Tie, Blitzer, Cupertino, Dark Hive, Dot Luv, Egg Plant, Excite Bike, Flick, Hot Sneaks, Humanity, Le Frog, Mint Choc, Overcast, Pepper Grinder, Redmond, Smoothness, South Street, Start, Sunny, Swanky Purse, Trontastic, UI Darkness, UI Lightness, Vader and Base