PHP программирование → Установка ORM Doctrine на Codeigniter (перевод на русский)
Предисловие:
На хабре была описана Правильная интеграция Doctrine в CodeIgniter. Она то, казалось бы, и правильная, но последняя строка мне не очень понравилась: UPD2: в config/autoload.php обязательно надо выключить «database» из списка загружаемых библиотек. Получается, что с БД, при подключенном Doctrine мы работать не сможем.
В первую очередь, необходимо скачать последнюю версию Doctrine. И положить в папку system/database.
Для линуксоидов:
Конфигурировать доктрин мы будем в файле system/application/config/database.php. Для этого нам необходимо открыть его в любимом редакторе. А линуксоидам сделать следующее:
Далее находим строку:
И ниже дописываем:
// 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 в корне вашего проекта, его нужно открыть любимым редактором.
Линуксоидам сделать так:
Меняем две последних строчки кода на:
Создайте файл system/application/doctrine (без расширения). Линуксоидам:
Поместите туда следующий код:
Далее создаем папки для нужд и испражнений Doctrine.
system/application/fixtures
system/application/migrations
system/application/schema
system/application/sql
TODO линуксоидам:
Наш Comand Line интерфейс готов. Дальше всеравно прийдется лезть в командную строку:) Для того что бы просмотреть все, что умеет Doctrine, необходимо запустить shell скрипт:
Для фанатов видоуса необходимо запустить скрипт через php
Для начала работы создадим yaml схему.
И положим его в папку system/application/schema. Следующая команда сгенерит нам модели (php классы для работы с данными) из yaml файлов и положит их в system/application/models
Что бы посмотреть, что нам нагенерил Doctrine откроем файл system/application/models/generated/BaseUser.php
Создадим тестовые данные для загрузки в наше приложение. Для этого необходимо создать файл system/application/fixtures/users.yml. И в нем прописать данные:
Командой build-all-reload мы пересоздадим нашу БД и модели
Для того. что бы убедиться, что все сделано правильно откройте/создайте system/application/views/welcome_message.php и добавьте следующий код:
На хабре была описана Правильная интеграция 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
$ 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
$ vi index.php
Меняем две последних строчки кода на:
require_once APPPATH.'config/database.php';
require_once BASEPATH.'codeigniter/CodeIgniter'.EXT;
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']);
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
$ 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
$
$ ./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)
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
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();
}
}
/**
* 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
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
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;
}
$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;
}



