Undr

На память

DoctrinePHP. Руководство пользователя. Глава 1 Начало.

1 Star2 Stars3 Stars4 Stars5 Stars (1 голосов, средний: 5.00 из 5)
Loading ... Loading ...

with 2 comments

1.1 Требования

Для использования Доктрины требуется PHP> = 5.2. Она не требует никаких внешних библиотек. Для связи с базои? данных Доктрина использует PDO, которыи? установлен в php по умолчанию.

1.2 Установка

Есть в настоящее время четыре различных способа установки Доктрины.

  • SVN (subversion)
  • SVN externals
  • Pear
  • Zip архив

Рекомендуется загрузить Доктрину через SVN (subversion), потому что в этом случае ее легко обновлять. Если ваш проект уже находится под контролем SVN, Вы должны выбрать SVN externals.

Если вы хотите попробывать Доктрину, то используи?те sandbox.

1.2.1 Sandbox

Доктрина также обеспечивает специальныи? пакет не требует предварительнои? конфигурации. Он включает интерфеи?с комманднои? строки для управления фаи?лами схемы, миграциями, конектами к базе, тестовыми данными и многим другим. Вы можете прочесть о пакете Sandbox и о том как его использовать в разделе Утилиты, подраздел Sandbox.

Ниже даны ссылки на статьи о том как начать использовать Доктрину с пакетом Sandbox. С помощью этих статеи? вы освоите пакет Sandbox менее чем за 5 минут. Статьи содержат фаи?лы схемы базы данных, тестовые данные, и исходныи? код для того, чтобы управлять моделью User с помощью Доктрины. Простые функциональные возможности по созданию, изменению и удалению данных модели.

Мои? первыи? проект с Доктринои?

Sandbox

1.2.2 SVN

Установить Доктрину через SVN очень просто. Просто получите последнюю ревизию Доктрины по адресу http://svn.phpdoctrine.org/branches/0.10

Чтобы загрузить Доктрину в текущую директорию, используи?те командную строку svn:

Листинг. 1
svn co http://svn.phpdoctrine.org/branches/0.11 .

Если у вас нет клиента SVN, выберите один из списка. Наи?дите опцию Checkout и введите путь svn.phpdoctrine.org/branches/0.11. Вводить имя пользователя и пароль чтобы скачать Доктрину не надо.

  • TortoiseSVN – приложение для Windows, интегрированное в оболочку Windows
  • svnx – GUI клиент для Mac
  • Eclipce имеет встроенныи? SVN клиент – subeclipce

Вы можете обновить до последнеи? версии командои?

Листинг. 2
svn update

в вашеи? директории с Доктринои?.

1.2.3 SVN externals

Если ваш проект находится под контролем SVN, Вы должны настроить доктрину через svn externals. Вы можете сделать это командои?:

Листинг. 3
svn pe svn:externals /path/to/project

Вы должны поместить следующую строку в редактор и сохранить изменения.

Листинг. 4
doctrine http://svn.phpdoctrine.org/tags/0.11.0

Потом загрузите Доктрину

Листинг. 5
svn update

1.2.4 PEAR

Вы можете установить Доктрину через PEAR со следующеи? командои?:

Листинг. 6
pear install http://pear.phpdoctrine.org/Doctrine-0.11.0

1.2.5 Zip-архив

Вы можете загрузить Доктрину как .zip или .tgz (для Linux) пакет со страницы http://www.phpdoctrine.org/download. Просто разархивируи?те архив.

Под Linux Вы можете извлечь .tgz пакет со командои?:

Листинг. 7
tar xzf Doctrine-0.11.0.tgz

1.3 Начало нового проекта

Doctrine_Record – основнои? компонент каждого проекта на основе Доктрины. Должен быть по краи?неи? мере один Doctrine_Record для каждои? таблицы базы данных. Doctrine_Record использует паттерн Active Record

Доктрина всегда добавляет первичныи? ключ ‘id’ к таблицам, у которых неопределены первичные ключи. Чтобы создать таблицу базы данных Вам надо всего лишь определить класс, которыи? расширяет Doctrine_Record и определить метод setTableDefinition() которыи? вызывает методы hasColumn() для определения полеи? таблицы и экспортировать эти классы.

Допустим, что мы хотим создать таблицу с называнием user с колонками id (первичныи? ключ), name, username, password и created. При условии, что Вы уже установили Доктрину, Вам нужно написать всего лишь:

User.php:
Листинг. 8
<?php
class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        // set 'user' table columns, note that
        // id column is auto-created as no primary key is specified

        $this->hasColumn('name', 'string',30);
        $this->hasColumn('username', 'string',20);
        $this->hasColumn('password', 'string',16);
    }

    public function setUp()
    {
        $this->actAs('Timestampable');
    }
}
?>

Вы так же можете сначало создать фаи?л схемы в YAML, и сгенерировать нужныи? Doctrine_Record.

Листинг. 9
---
User:
 actAs: [Timestampable]
 columns:
   name: string(30)
   username: string(20)
   password: string(16)

Вы можете сгенерировать от yaml php код следующеи? строчкои?:

Листинг. 10
<?php
Doctrine::generateModelsFromYaml('/path/to/user.yml', /path/to/generate/models);
?>

В папках /path/to/generate/models/ и /path/to/generate/models/generated появятсяфаи?лы User.php и BaseUser.class.php. User.php – для Вас, чтобы Вы могли добавить свои функциональные возможности, а BaseUser.php – код, которыи? автоматически генерируется от фаи?ла схемы YAML.

Теперь, когда мы имеем класс Doctrine_Record, мы можем экспортировать его в базу данных и создать таблицы. Чтобы экспортировать класс User в базу данных нам надо:

Листинг. 11
<?php
//require the base Doctrine class
require_once('path-to-doctrine/lib/Doctrine.php');

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

require_once('User.php');

//set up a connection
Doctrine_Manager::connection('mysql://user:pass@localhost/test');

//export the classes
Doctrine::createTablesFromArray(array('User'));
?>

Мы теперь имеем модель, которая поддерживает основные CRUD операции!

1.4 Работа с существующими базами данных

1.4.1 Введение

Обычно, если мы ищем инструменты ORM, типа Доктрины, то, это означает, что база данных имеет большое число таблиц и будет использоваться часто. Иначе продуктивнеи? ипользовать чистыи? SQL.

Доктрина может генерировать классы Doctrine_Record используя существующую базу данных. Поэтому нет потребности вручную писать эти классы.

1.4.2 Первыи? импорт

Предположим, что мы имеем mysql базу данных, названную test с единственнои? таблицеи?, названнои? file.

Таблица file была создана следующим sql запросом:

Листинг. 12
CREATE TABLE file (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL,
    name VARCHAR(150),
    size BIGINT,
    modified BIGINT,
    type VARCHAR(10),
    content TEXT,
    path TEXT,
    PRIMARY KEY(id))

Теперь мы хотим сгенерировать класс Doctrine_Record. Это делается так:

Листинг. 13
<?php
require_once('path-to-doctrine/lib/Doctrine.php');

spl_autoload_register(array('Doctrine', 'autoload'));
Doctrine_Manager::connection('mysql://root:dc34@localhost/test');

// import method takes one parameter: the import directory (the directory where
// the generated record files will be put in
Doctrine::generateModelsFromDb('myrecords');
?>

Опля! В папке myrecords/generated появился фаи?л BaseFile.php. Примерно такои?:

Листинг. 14
<?php
/**
 * This class has been auto-generated by the Doctrine ORM Framework
 */

abstract class BaseFile extends Doctrine_Record
{
  public function setTableDefinition()
  {
    $this->setTableName('file');
    $this->hasColumn('id', 'integer', 4, array('alltypes' =>  array(  0 => 'integer', ), 'ntype' => 'int(10) unsigned', 'unsigned' => 1, 'values' =>  array(), 'primary' => true, 'notnull' => true, 'autoincrement' => true));
    $this->hasColumn('name', 'string', 150, array('alltypes' =>  array(  0 => 'string', ), 'ntype' => 'varchar(150)', 'fixed' => false, 'values' =>  array(), 'primary' => false, 'notnull' => false, 'autoincrement' => false));
    $this->hasColumn('size', 'integer', 8, array('alltypes' =>  array(  0 => 'integer', ), 'ntype' => 'bigint(20)', 'unsigned' => 0, 'values' =>  array(), 'primary' => false, 'notnull' => false, 'autoincrement' => false));
    $this->hasColumn('modified', 'integer', 8, array('alltypes' =>  array(  0 => 'integer', ), 'ntype' => 'bigint(20)', 'unsigned' => 0, 'values' =>  array(), 'primary' => false, 'notnull' => false, 'autoincrement' => false));
    $this->hasColumn('type', 'string', 10, array('alltypes' =>  array(  0 => 'string', ), 'ntype' => 'varchar(10)', 'fixed' => false, 'values' =>  array(), 'primary' => false, 'notnull' => false, 'autoincrement' => false));
    $this->hasColumn('content', 'string', null, array('alltypes' =>  array(  0 => 'string',   1 => 'clob', ), 'ntype' => 'text', 'fixed' => false, 'values' =>  array(), 'primary' => false, 'notnull' => false, 'autoincrement' => false));
    $this->hasColumn('path', 'string', null, array('alltypes' =>  array(  0 => 'string',   1 => 'clob', ), 'ntype' => 'text', 'fixed' => false, 'values' =>  array(), 'primary' => false, 'notnull' => false, 'autoincrement' => false));
  }

  public function setUp()
  {
    parent::setUp();
  }
}

В папке myrecords так же есть фаи?л File.php. В нем примерно это:

Листинг. 15
<?php
/**
 * This class has been auto-generated by the Doctrine ORM Framework
 */

class File extends BaseFile
{

}
?>

Доктрина автоматически для модели генерирует класс Doctrine_Table в myrecords/UserTable.php:

Листинг. 16
<?php
/**
 * This class has been auto-generated by the Doctrine ORM Framework
 */

class FileTable extends Doctrine_Table
{

}
?>

Сюда Вы можете поместить свои собственные методы поиска, которые Вы можете использовать, вызывая Doctrine::getTable('User')

1.4.3 Импорт таблиц в единственном числе

By default Doctrine will attempt to ensure your models are singularized when they are imported from an existing database. This feature may not be ideal for everyone so it can easily be turned off using an attribute.

По умолчанию Доктрина создает модель в единственном числе когда импортирует ее из существующеи? базы. Эта особенность может быть не всегда полезна, поэтому вы легко можите ее отключить используя аттрибуты.

Листинг. 17
<?php
Doctrine_Manager::getInstance()->setAttribute('singularize_import', false);
?>

Если Вы имеете таблицу “files”, то в результате появится модель “Files”, а не “File”.

1.5 Создание таблиц

1.5.1 Введение

Доктрина поддрерживает экспорт классов Doctrine_Record в базу данных. Это означает что основываясь на определении таблицы в вашем Doctrine_Record, Доктрина создает таблицы в базе данных.

Допустим, что мы имеем классы по имени User и Phonenumber со следующими определениями:

Листинг. 18
<?php
// file User.php
class User extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('name', 'string', 20);
    }
    public function setUp()
    {
        $this->hasMany('Phonenumber', array('local' => 'id',
                                            'foreign' => 'user_id'));
    }
}
// file Phonenumber.php
class Phonenumber extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->hasColumn('phonenumber', 'string', 20);
        $this->hasColumn('user_id', 'integer');
    }
    public function setUp()
    {
        $this->hasOne('User', array('local' => 'user_id',
                                    'foreign' => 'id',
                                    'onDelete' => 'CASCADE'));
    }
}
?>

Допустим, что эти классы находятся в папке ‘models/’. Теперь мы можем создать таблицы в базе данных использюя эти классы следующим кодом:

Листинг. 19
<?php
require_once('path-to-doctrine/lib/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

//in order to export we need a database connection
Doctrine_Manager::connection('mysql://user:pass@localhost/test');

Doctrine::createTablesFromModels('models');
?>

Это испольнит следующие запросы к базе данных на mysql.

Листинг. 20
CREATE TABLE user (id BIGINT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id), INDEX(id));
CREATE TABLE phonenumber (id INT AUTO_INCREMENT, phonenumber VARCHAR(20), user_id BIGINT, PRIMARY KEY(id), INDEX(user_id));
ALTER TABLE phonenumber ADD CONSTRAINT FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE;

Обратите внимание на следующее:

  1. Добавлены первичные ключи с автоприращением, хотя мы не определяли никаких первичных ключеи?.
  2. Доктрина сама добавляет индексы к полям отношения, в таблицах которые друг на друга ссылаются (это необходимо в mysql).

1.5.2 Получение экспортных SQL запросов

Бывают ситуации, когда Вы не хотите сразу выполнять экспортные запросы, Вы хотите получить текст запросов и, возможно, сохранить его в фаи?ле build.sql. Это может быть легко достигнуто следующим образом:

Листинг. 21
<?php
require_once('path-to-doctrine/lib/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
Doctrine_Manager::connection('mgsql://user:pass@localhost/test');
$queries = Doctrine::generateSqlFromModels('models');
echo $queries;
?>

1.5.3 Настрои?ки экспорта

Листинг. 22
<?php
// export everything, table definitions and constraints
$manager = Doctrine_Manager::getInstance();

$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);

// export classes without constraints
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_TABLES ^
                                              Doctrine::EXPORT_CONSTRAINTS);
// turn off exporting
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_NONE);

$sql = Doctrine::generateSqlFromModels();
?>

1.6 Создание моделеи?

Доктрина дает возможность создать модели на основе существующих баз данных, или на основе фаи?лов схемы YAML. Вы уже читали о создании моделеи? на основе существующеи? базы данных в разделе 1.4 Работа с существующими базами данных.

Вот – простои? пример того, как создать ваши модели на основе yaml фаи?лов схемы.

Создаи?те schema_files/user.yml и поместите следующии? yaml в фаи?л

Листинг. 23
---
User:
 columns:
   username: string(255)
   password: string(255)

Теперь нам нужен небольшои? код чтобы создать класс модели (Doctrine_Record).

Листинг. 24
<?php
require_once('/path/to/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));

Doctrine::generateModelsFromYaml('/path/to/schema_files/', '/path/to/generate/models');
?>

Теперь Вы имеете models/User.php и models/generated/BaseUser.php. User.php – для того, чтобы добавить свои? дополнительныи? код, этот фаи?л создается только один раз, и BaseUser.php – создается каждыи? раз, когда Вы вызываете generateModelsFromYaml()

1.7 Автозагрузка моделеи?

Доктрина предлагает два способа загружать модели. Ленивую загрузку, и агрессивную загрузку. Ленивая загрузка не будет сразу загружать PHP фаи?лы, вместо этого сохранит путь к классу и его название, и использует его в Doctrine::autoload() которыи? мы зарегистрировали, используя spl_autoload_register(array('Doctrine', 'autoload')), как автоматическии? загрузчик классов. Ниже – примеры использования обоих видов загрузки.

1.7.1 Ленивая загрузка

Ленивая загрузка моделеи? идеальныи? способ загрузки на время разработки приложения. Этот метод лениво загрузит только требуемыи? фаи?л, содержащии? требуемыи? класс.

Ленивая загрузка требует, чтобы каждыи? фаи?л содержал только один класс, и фаи?л должен быть назван по имени класса. Пример, если Вы имеете класс по имени User, то он должен содержаться в фаи?ле по имени User.php

Вот пример использования ленивои? загрузки моделеи?:

Листинг. 25
<?php
//require the base Doctrine class
require_once('path-to-doctrine/lib/Doctrine.php');

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

Doctrine_Manager::getInstance()->setAttribute('model_loading', 'conservative');
Doctrine::loadModels('/path/to/models'); // This call will not require the found .php files

$user = new User(); // This will invoke Doctrine::autoload() to include the file so the User class is present.
?>

1.7.2 Агрессивная загрузка

Агрессивная загрузка моделеи? – способ по умолчанию используемыи? в Доктрине, он очень прост. Доктрина будет искать все фаи?лы с расширением .php и подгружать их . Доктрина не может поддерживать наследование при загрузке модели, если ваша модель унаследована от другои? модели, Доктрина автоматически не подгрузит родительскии? класс. Вы сами должны следить за тем чтобы разрешить эти зависимости.

При агрессивном способе загрузки Вы можете иметь множество классов в одном фаи?ле. Названия класса и фаи?ла могут не совподать.

Минус агрессивнои? загрузки в том, что загружаются все фаи?лы с расширением .php, поэтому если у Вас много моделеи?, то лучше использовать ленивую загрузку.

Вот пример агрессивнои? загрузки моделеи?.

Листинг. 26
<?php
//require the base Doctrine class
require_once('path-to-doctrine/lib/Doctrine.php');

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

Doctrine_Manager::getInstance()->setAttribute('model_loading', 'aggressive'); // Thi
Doctrine::loadModels('/path/to/models'); // This call will not require the found .php files

$user = new User(); // This will invoke Doctrine::autoload() to include the file so the User class is present.
?>

1.8 Интерфеи?с комманднои? строки (CLI)

Интерфеи?с комманднои? строки – сборник часто используемых задач в Доктрине, доступныи? комманднои? строки. Про CLI можно почитать в разде 6.3 Интерфеи?с комманднои? строки.

1.9 Мои? первыи? тестовыи? проект.

1.9.1 Введение

Это обучающии? пример с практическими рекомендациями для создании вашего первого проекта, сделанного с использованием Доктрины. Эта пример использует готовыи? пакет Sandbox Доктрины. Потребуется веб сервер, PHP и PDO + Sqlite.

1.9.2 Загрузка

Чтобы начать, загрузите последнии? пакет Sandbox Доктрины: http://www.phpdoctrine.org/download. Разархивируи?те загруженныи? фаи?л, Вы получите папку названную Doctrine-x.x.x-Sandbox. В этои? папке простои? пример приложения с использованием Доктрины.

1.9.3 Содержание Пакета

Структура фаи?лов следюющая:

Листинг. 27
$ cd Doctrine-0.10.1-Sandbox
$ ls
config.php    doctrine    index.php    migrations    schema
data        doctrine.php    lib        models

Sandbox не требует никакои? настрои?ки, он готов к использованию с sqlite базои? данных. Ниже – описание каждого из фаи?лов/папок и его назначение.

  • doctrine – исходник Shell для CLI. Запустите ./doctrine, чтобы посмотреть список команд или ./doctrine help, чтобы увидеть детальные описания команд.
  • doctrine.php – исходник php, которыи? загружает CLI Доктрины, которыи? запускается из в вышеупомянутои? ./doctrine
  • index.php – Переднии? диспетчер сети для вашего заявления сети
  • migrations – Папка для классов миграции
  • schema – Папка для фаи?лов схемы
  • модели – Папка для классов моделеи?
  • lib – Папка с классами Доктрины

1.9.4 Запуск CLI

Если Вы запустите исходник Shell для CLI, то это увидите следующее:

Листинг. 28
$ ./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

1.9.5 Определение схемы базы данных

Ниже, образец yaml схемы базы данных. Поместите yaml фаи?л в schemas/schema.yml. CLI ищет все *.yml фаи?лы в папке для схем.

Листинг. 29
---
User:
 columns:
   id:
     primary: true
     autoincrement: true
     type: integer(4)
   username: string(255)
   password: string(255)
 relations:
   Groups:
     class: Group
     refClass: UserGroup
     foreignAlias: Users

Group:
 tableName: groups
 columns:
   id:
     primary: true
     autoincrement: true
     type: integer(4)
   name: string(255)

UserGroup:
 columns:
   user_id: integer(4)
   group_id: integer(4)
 relations:
   User:
     onDelete: CASCADE
   Group:
     onDelete: CASCADE

1.9.6 Тестовые данные

Ниже пример yaml фаи?ла для тестовых данных. Поместите этот фаи?л в data/fixtures/data.yml. CLI ищет все *.yml фаи?лы в папке для тестовых данных.

Листинг. 30
---
User:
 zyne:
   username: zYne-
   password: changeme
   Groups: [founder, lead, documentation]
 jwage:
   username: jwage
   password: changeme
   Groups: [lead, documentation]

Group:
 founder:
   name: Founder
 lead:
   name: Lead
 documentation:
   name: Documentation

1.9.7 Сборка всего этого

Теперь, когда Вы написали фаи?лы схемы и тестовых данных, можно создать php код и начинать работать с моделями. Запустите команду указанную ниже и создаи?те модели в папке для моделеи?.

Листинг. 31
$ ./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 for connection "sandbox" at path "/Users/jwage/Sites/doctrine/branches/0.11/tools/sandbox/sandbox.db"
build-all-reload - Generated models successfully from YAML schema
build-all-reload - Successfully created database for connection "sandbox" at path "/Users/jwage/Sites/doctrine/branches/0.11/tools/sandbox/sandbox.db"
build-all-reload - Created tables successfully
build-all-reload - Data was successfully loaded

Загляните в папку для моделеи? и Вы увидите, что классы моделеи? были созданы. Теперь Вы можете писать код в index.php, чтобы работать с Доктринои? непосредственно. В index.php запишите код, типа следующего.

1.9.8 Тестирование

Листинг. 32
<?php
$query = new Doctrine_Query();
$query->from('User u, u.Groups g');

$users = $query->execute();

echo '<pre>';
print_r($users->toArray(true));
?>

print_r() должен отобразить следующие данные. Обратите внимание, это те данные которые мы внесли в yaml фаи?л тестовых данных. Вы можете добавить больше данных и запустить еще раз build-all-reload, чтобы пересоздать базу данных.

Листинг. 33
Array
(
    [0] => Array
        (
            [id] => 1
            [username] => zYne-
            [password] => changeme
            [Groups] => Array
                (
                    [0] => Array
                        (
                            [id] => 1
                            [name] => Founder
                        )
                    [1] => Array
                        (
                            [id] => 2
                            [name] => Lead
                        )
                    [2] => Array
                        (
                            [id] => 3
                            [name] => Documentation
                        )
                )
        )

    [1] => Array
        (
            [id] => 2
            [username] => jwage
            [password] => changeme
            [Groups] => Array
                (
                    [0] => Array
                        (
                            [id] => 2
                            [name] => Lead
                        )
                    [1] => Array
                        (
                            [id] => 3
                            [name] => Documentation
                        )
                )
        )
)

Вы можете непосредственно выполнять запросы к вашеи? базе данных при помощи DQL используя CLI и команду dql. Примерно так:

Листинг. 34
jwage:sandbox jwage$ ./doctrine dql "FROM User u, u.Groups g"
dql - executing: "FROM User u, u.Groups g" ()
dql - -
dql -   id: 1
dql -   username: zYne-
dql -   password: changeme
dql -   Groups:
dql -     -
dql -       id: 1
dql -       name: Founder
dql -     -
dql -       id: 2
dql -       name: Lead
dql -     -
dql -       id: 3
dql -       name: Documentation
dql - -
dql -   id: 2
dql -   username: jwage
dql -   password: changeme
dql -   Groups:
dql -     -
dql -       id: 2
dql -       name: Lead
dql -     -
dql -       id: 3
dql -       name: Documentation

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

Теперь мы продемонстрируем, как написать программу управления пользователями используя Доктрину. Поместите следующии? код в index.php и просмотрите в браузере. Вы увидите простое приложение.

Листинг. 35
<?php
require_once('config.php');

Doctrine::loadModels('models');

$module = isset($_REQUEST['module']) ? $_REQUEST['module']:'users';
$action = isset($_REQUEST['action']) ? $_REQUEST['action']:'list';

if ($module == 'users') {
    $userId = isset($_REQUEST['id']) && $_REQUEST['id'] > 0 ? $_REQUEST['id']:null;
    $userTable = Doctrine::getTable('User');

    if ($userId === null) {
        $user = new User();
    } else {
        $user = $userTable->find($userId);
    }

    switch ($action) {
        case 'edit':
        case 'add':
            echo '<form action="index.php?module=users&action=save" method="POST">
                  <fieldset>
                    <legend>User</legend>
                    <input type="hidden" name="id" value="'
. $user->id . '" />
                    <label for="username">Username</label> <input type="text" name="user[username]" value="'
. $user->username . '" />
                    <label for="password">Password</label> <input type="text" name="user[password]" value="'
. $user->password . '" />
                    <input type="submit" name="save" value="Save" />
                  </fieldset
                  </form>'
;
            break;
        case 'save':
            $user->merge($_REQUEST['user']);
            $user->save();

            header('location: index.php?module=users&action=edit&id=' . $user->id);
            break;
        case 'delete':
            $user->delete();

            header('location: index.php?module=users&action=list');
            break;
        default:
            $query = new Doctrine_Query();
            $query->from('User u')
                  ->orderby('u.username');

            $users = $query->execute();

            echo '<ul>';
            foreach ($users as $user) {
                echo '<li><a href="index.php?module=users&action=edit&id=' . $user->id . '">' . $user->username . '</a> &nbsp; <a href="index.php?module=users&action=delete&id=' . $user->id . '">[X]</a></li>';
            }
            echo '</ul>';
    }

    echo '<ul>
            <li><a href="index.php?module=users&action=add">Add</a></li>
            <li><a href="index.php?module=users&action=list">List</a></li>
          </ul>'
;
} else {
    throw new Exception('Invalid module');
}
?>

Написал undr ()

1 сентября 2009 в 00:53

2 Responses to 'DoctrinePHP. Руководство пользователя. Глава 1 Начало.'

Подписаться на комментарии or TrackBack to 'DoctrinePHP. Руководство пользователя. Глава 1 Начало.'.

  1. Млин! Рулеззз!!! Однозначное спасибо за статью. Только начал погружаться в доктрину, но курить английскую документацию непривычно (до этого старался обходиться русским языком). А тут все по полочкам и по кирпичикам. Для старта очень даже полезно. Так что, автор, еще раз спасибо. Беру на заметку. И Чего Таких Интузиазистов так мало :(

    Дмитрий

    26 Окт 10 at 18:10

  2. К сожалению я перевел только 3 главы и то для старой доктрины. Дата перевода не соответствует дате опубликования.

    На текущий момент не вижу смысла переводить: во-первых, информация устаревает раньше, чем успеваешь ее нормально перевести, а во-вторых, мне уже не нужен перевод – могу более-менее сносно и так читать, на англицком.

    Так что насчет Интузиазизма это Вы поспешили :) Хотя я очень рад что это кому-то пригодилось, тем более что сам сюда не заглядовал очень давно.

    undr

    26 Окт 10 at 21:20

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