→

PHP программирование →  Установка ORM Doctrine на Codeigniter (перевод на русский)

Предисловие:
На хабре была описана Правильная интеграция Doctrine в CodeIgniter. Она то, казалось бы, и правильная, но последняя строка мне не очень понравилась: UPD2: в config/autoload.php обязательно надо выключить «database» из списка загружаемых библиотек. Получается, что с БД, при подключенном Doctrine мы работать не сможем.

Скачать Doctrine


В первую очередь, необходимо скачать последнюю версию Doctrine. И положить в папку system/database.
Для линуксоидов:
$ cd system/database
$ svn co http://svn.phpdoctrine.org/branches/0.10/lib doctrine
$ cd ..

// If you use svn in your project you can set Doctrine
// as an external so you receive bug fixes automatically from svn
$ svn propedit svn:externals database

// In your favorite editor add the following line
// doctrine http://svn.phpdoctrine.org/branches/0.10/lib

Установка Doctrine


Конфигурировать доктрин мы будем в файле system/application/config/database.php. Для этого нам необходимо открыть его в любимом редакторе. А линуксоидам сделать следующее:
$ vi application/config/database.php


Далее находим строку:
$db['default']['cachedir'] = "";

И ниже дописываем:

// Create dsn from the info above
$db['default']['dsn'] = $db['default']['dbdriver'] .
                        '://' . $db['default']['username'] .
                        ':' . $db['default']['password'].
                        '@' . $db['default']['hostname'] .
                        '/' . $db['default']['database'];

// Require Doctrine.php
require_once(realpath(dirname(__FILE__) . '/../..') . DIRECTORY_SEPARATOR . 'database/doctrine/Doctrine.php');

// Set the autoloader
spl_autoload_register(array('Doctrine', 'autoload'));

// Load the Doctrine connection
Doctrine_Manager::connection($db['default']['dsn'], $db['default']['database']);

// Load the models for the autoloader
Doctrine::loadModels(realpath(dirname(__FILE__) . '/..') . DIRECTORY_SEPARATOR . 'models');


Далее подключаем файл application/config/database.php в свой фронт контроллер это файл index.php в корне вашего проекта, его нужно открыть любимым редактором.
Линуксоидам сделать так:
$ cd ..
$ vi index.php

Меняем две последних строчки кода на:
require_once APPPATH.'config/database.php';
require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;

Установка Comand Line интерфейса


Создайте файл system/application/doctrine (без расширения). Линуксоидам:
$ vi system/application/doctrine

Поместите туда следующий код:
<?php
require_once('config/database.php');

// Configure Doctrine Cli
// Normally these are arguments to the cli tasks but if they are set here the arguments will be auto-filled
$config = array('data_fixtures_path'  =>  dirname(__FILE__) . DIRECTORY_SEPARATOR . '/fixtures',
                'models_path'         =>  dirname(__FILE__) . DIRECTORY_SEPARATOR . '/models',
                'migrations_path'     =>  dirname(__FILE__) . DIRECTORY_SEPARATOR . '/migrations',
                'sql_path'            =>  dirname(__FILE__) . DIRECTORY_SEPARATOR . '/sql',
                'yaml_schema_path'    =>  dirname(__FILE__) . DIRECTORY_SEPARATOR . '/schema');

$cli = new Doctrine_Cli($config);
$cli->run($_SERVER['argv']);

Далее создаем папки для нужд и испражнений Doctrine.
system/application/fixtures
system/application/migrations
system/application/schema
system/application/sql

TODO линуксоидам:
// Create directory for your yaml data fixtures files
$ mkdir system/application/fixtures

// Create directory for your migration classes
$ mkdir system/application/migrations

// Create directory for your yaml schema files
$ mkdir system/application/schema

// Create directory to generate your sql to create the database in
$ mkdir system/application/sql


Наш Comand Line интерфейс готов. Дальше всеравно прийдется лезть в командную строку:) Для того что бы просмотреть все, что умеет Doctrine, необходимо запустить shell скрипт:
$ cd system/application
$ ./doctrine
Doctrine Command Line Interface

./doctrine build-all
./doctrine build-all-load
./doctrine build-all-reload
./doctrine compile
./doctrine create-db
./doctrine create-tables
./doctrine dql
./doctrine drop-db
./doctrine dump-data
./doctrine generate-migration
./doctrine generate-migrations-db
./doctrine generate-migrations-models
./doctrine generate-models-db
./doctrine generate-models-yaml
./doctrine generate-sql
./doctrine generate-yaml-db
./doctrine generate-yaml-models
./doctrine load-data
./doctrine load-dummy-data
./doctrine migrate
./doctrine rebuild-db
$

Для фанатов видоуса необходимо запустить скрипт через php
> php.exe doctrine

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


Для начала работы создадим yaml схему.
---
User:
  columns:
    username:
      type: string(255)
    password:
      type: string(255)

И положим его в папку system/application/schema. Следующая команда сгенерит нам модели (php классы для работы с данными) из yaml файлов и положит их в system/application/models
$ ./doctrine generate-models-yaml
generate-models-yaml - Generated models successfully from YAML schema

Что бы посмотреть, что нам нагенерил Doctrine откроем файл system/application/models/generated/BaseUser.php
<?php

/**
* This class has been auto-generated by the Doctrine ORM Framework
*/

abstract class BaseUser extends Doctrine_Record
{
  public function setTableDefinition()
  {
    $this->setTableName('user');
    $this->hasColumn('username', 'string', 255, array (
));
    $this->hasColumn('password', 'string', 255, array (
));
  }
}

// Add custom methods to system/application/models/User.php

<?php

/**
* This class has been auto-generated by the Doctrine ORM Framework
*/

class User extends BaseUser
{
  public function setPassword($password)
  {
    $this->password = md5($password);
  }
}

/**
* This class has been auto-generated by the Doctrine ORM Framework
*/

class UserTable extends Doctrine_Table
{
  public function retrieveAll()
  {
    $query = new Doctrine_Query();
    $query->from('User u');
    $query->orderby('u.username ASC');

    return $query->execute();
  }
}

Создадим тестовые данные для загрузки в наше приложение. Для этого необходимо создать файл system/application/fixtures/users.yml. И в нем прописать данные:
---
User:
  jwage:
    username: jwage
    password: test

Командой build-all-reload мы пересоздадим нашу БД и модели
$ ./doctrine build-all-reload
build-all-reload - Are you sure you wish to drop your databases? (y/n)
y
build-all-reload - Successfully dropped database named: "jwage_codeigniter"
build-all-reload - Generated models successfully from YAML schema
build-all-reload - Successfully created database named: "jwage_codeigniter"
build-all-reload - Created tables successfully
build-all-reload - Data was successfully loaded

Для того. что бы убедиться, что все сделано правильно откройте/создайте system/application/views/welcome_message.php и добавьте следующий код:
$user = new User();
$user->username = 'zYne-';
$user->setPassword('password');
$user->save();

$userTable = Doctrine::getTable('User');
$user = $userTable->findOneByUsername('zYne-');

echo $user->username; // prints 'zYne-'

$users = $userTable->retrieveAll();

echo $users->count(); // echo '2''
foreach ($users as $user)
{
  echo $user->username;
}
0
1