SlideShare uma empresa Scribd logo
1 de 32
Baixar para ler offline
Миграции и
Инсталляции
QuartSoft
YiiSoft
Климов П.В.
Инсталляция рабочей копии проекта
Настройка окружения
(GIT, PHP, Composer и т.д.)
$ composer install
Проверка требований
$ php requirements.php
Донастройка окружения
(php.ini, Imagick и т.д.)
Создание локальных
директорий
(‘@assets’, ‘@runtime’)
Создание локальных файлов
(‘config/local.php’, ‘.htaccess’)
Миграция БД
$ php yii migrate/up
Дополнительные действия
(crontab, sitemap и т.п.)
–
+
Развертывание PHP кода
$ git clone
Обновление рабочей копии проекта
$ composer install/update
Проверка требований
$ php requirements.php
Донастройка окружения
(php.ini, Imagick и т.д.)
Очистка временных
директорий
(‘@assets’, ‘@runtime’)
Обновление (пересоздание)
локальных файлов
(‘config/local.php’, ‘.htaccess’)
Миграция БД
$ php yii migrate/up
Дополнительные действия
(crontab, sitemap и т.п.)
–
+
Обновление PHP кода
$ git pull
Откат рабочей копии проекта
$ composer install
Очистка временных
директорий
(‘@assets’, ‘@runtime’)
Обновление (пересоздание)
локальных файлов
(‘config/local.php’)
Миграция (откат) БД
$ php yii migrate/down
Дополнительные действия
(crontab, sitemap и т.п.)
Откат PHP кода
$ git reset/checkout
Системы контроля версий
Database
DB
Migration
Миграции по разным рабочим копиям
t
“Dev” “Production”
A
B
C
D
A
B
C
D
class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}
public function down() {
echo "m???_createUser cannot be reverted.n";
return false;
}
class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}
public function down() {
$this->dropTable(‘User’);
}
История PHP и история БД
t
“Dev” “Production”
A
B
C
1
2
3
4
5
6
PHP DB
A
B
C
1
2
3
4
5
6
PHP DB
class m141106_185632_log_init extends Migration {
public function up() {
foreach (Yii::$app->getLog()->targets as $target) {
if ($target instanceof DbTarget) {
$this->createTable($target->logTable, […]);
}
}
}
class m141106_185632_log_init extends Migration {
public function up() {
$columns = […];
$this->createTable(‘AppLog’, $columns);
$this->createTable(‘ErrorLog’, $columns);
}
use appmodelsUser;
class m141106_185632_updateUser extends Migration {
public function up() {
User::updateAll([‘statusId’ => 5], [‘statusId’ => 10]);
}
public function down() {
foreach (User::find()->where([‘statusId’ => 10])->all() as $user) {
$user->statusId = 5;
}
}
class m141106_185632_updateUser extends Migration {
public function up() {
$this->update(‘User’, [‘statusId’ => 5], [‘statusId’ => 10]);
}
}
class m141106_185632_createFaqCategory extends Migration {
public function up() {
$this->createTable(‘FaqCategory’, […]);
}
}
class m141106_185632_createFaqQuestion extends Migration {
public function up() {
$this->createTable(‘FaqQuestion’, […]);
}
}
class m141106_185632_createFaq extends Migration {
public function up() {
$this->createTable(‘FaqCategory’, […]);
$this->createTable(‘FaqQuestion’, […]);
}
}
«Инсталляция» расширения / модуля
$ composer require/update
Применение на уровне PHP
(конфигурация
компонентов и модулей)
Применение на уровне БД
(создание миграции БД)
Миграция БД
$ php yii migrate/up
Применение миграций из нескольких
источников
“some/extension”“My Project”
m170501_A
m170502_B
m170504_C
m150501_External
Переключение «migrationPath»
$ php yii migrate
--migrationPath=@app/migrations
$ php yii migrate
--migrationPath=@some/extension/migrations
Использование пространства имен
return [
'controllerMap' => [
'migrate' => [
'class' => 'yiiconsolecontrollersMigrateController',
'migrationNamespaces' => [
'appmigrations',
'someextensionmigrations',
],
],
],
// …
];
История на сервере разработки
m170501_A
m170502_B
m170504_C
m150501_External
t
Расширение
подключено
03-05-17
“My Project” “some/extension”
“Зависит от”
История на «production» сервере
m170501_A
m170502_B
m170504_C
m150501_External
t
“some/extension”
“Зависит от”
migrationPath=some/extension/migrations
migrationPath=app/migrations
“My Project”
История на «production» сервере
m170501_A
m170502_B
m170504_C
m150501_External
t
С «нуля» миграции
применяются в
хронологическом порядке
“My Project” “some/extension”
“Зависит от”
Повторное использование кода
$array = [$day1Revenue, $day2Revenue, $day3Revenue];
$avgRevenue = array_sum($array) / count($array);
// …
$array = [$day1Costs, $day2Costs, $day3Costs];
$avgCosts = array_sum($array) / count($array);
function avg (array $values) {
return array_sum($values) / count($values);
}
$avgRevenue = avg([$day1Revenue, $day2Revenue, $day3Revenue]);
// …
$avgCosts = avg([$day1Costs, $day2Costs, $day3Costs]);
Рефакторинг
function avg (array $values) {
if (empty($values)) {
return 0;
}
return array_sum($values) / count($values);
}
$avgRevenue = avg([$day1Revenue, $day2Revenue, $day3Revenue]);
// …
$avgCosts = avg([$day1Costs, $day2Costs, $day3Costs]);
Внешняя миграция, ревизия №1
class m160201_132117_someExtensionMigration extends Migration
{
public function up()
{
$this->createTable(‘BlogPostCategory’, […]);
$this->createTable(‘BlogPost’, […]);
}
public function down()
{
$this->dropTable(‘BlogPost’);
$this->dropTable(‘BlogPostCategory’);
}
}
Внешняя миграция, ревизия №2
class m160201_132117_someExtensionMigration extends Migration
{
public function up()
{
$this->createTable(‘BlogPostCategory’, […]);
$this->createTable(‘BlogPost’, […]);
$this->createTable(‘BlogPostComment’, […]);
}
public function down()
{
$this->dropTable(‘BlogPostComment’);
$this->dropTable(‘BlogPost’);
$this->dropTable(‘BlogPostCategory’);
}
}
Раздельная история
$ php yii migrate
--migrationPath=@app/migrations
$ php yii migrate
--migrationPath=@some/forum/migrations
--migrationTable=migration_forum
return [
'controllerMap' => [
'migrate-forum' => [
'class' => 'yiiconsolecontrollersMigrateController',
'migrationNamespaces' => [
'someforummigrations',
],
'migrationTable' => 'migration_module',
],
],
// …
];
Наследование
// Без пространства имен:
require (Yii::getAlias(‘@some/extension/
m160201_132117_someExtensionMigration.php’));
class m170505_142134_applySomeExtension extends
m160201_132117_someExtensionMigration {}
// С пространством имен:
namespace appmigrations;
class M170505142134ApplySomeExtension extends
someextensionmigrationsM160201132117SomeExtensionMigration {}
История при наследовании
m170501_A
m170502_B
m170504_C
m150501_External
t
“My Project” “some/extension”
“Зависит от”
m170502_X
Наследование и модификация
require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’));
class m170505_142134_rbac extends m140506_102106_rbac_init
{
protected function getAuthManager()
{
return new yiirbacDbManager([‘itemTable’ => ‘RbacItem’, …]);
}
public function up()
{
parent::up();
$this->alterColumn($this->getAuthManager() ->assignmentTable,
‘user_id’, $this->integer()->notNull());
}
}
Инверсия
require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’));
class m170505_142134_undoRbac extends m140506_102106_rbac_init
{
protected function getAuthManager()
{
return new yiirbacDbManager([‘itemTable’ => ‘RbacItem’, …]);
}
public function up()
{
parent::down(); // down -> up
}
public function down()
{
parent::up(); // up -> down
}
Агрегация
require (Yii::getAlias(‘@some/extension/m160201_132117_A.php’));
require (Yii::getAlias(‘@another/extension/m150301_141133_B.php’));
class m170505_142134_aggregation extends yiidbMigration
{
public function up()
{
(new m160201_132117_A([‘db’ => $this->db]))->up();
(new m150301_141133_B([‘db’ => $this->db]))->up();
}
public function down()
{
(new m150301_141133_B([‘db’ => $this->db]))->down();
(new m160201_132117_A([‘db’ => $this->db]))->down();
}
}
Агрегация с пространством имен
namespace appmigrations;
use someextensionM160201132117A.php’;
use anotherextensionM150301141133B.php;
class M170505142134Aggregation extends yiidbMigration
{
public function up()
{
(new M160201132117A([‘db’ => $this->db]))->up();
(new M150301141133B([‘db’ => $this->db]))->up();
}
public function down()
{
(new M150301141133B([‘db’ => $this->db]))->down();
(new M160201132117A([‘db’ => $this->db]))->down();
}
}
История при агрегации
m170501_A
m170510_B
m170514_C
m150501_Ex1
t
“My Project” “some/extension”
“Зависит от”
m170512_X
“another/extension”
m170505_Ex2
1
1
1
1
Независимое использование
миграций
use myextensionM170505142134Foo;
class InstallController extends yiiconsoleController
{
public function actionInstall()
{
(new M170505142134Foo([‘db’ => Yii::$app->db]))->up();
}
public function actionUninstall()
{
(new M170505142134Foo([‘db’ => Yii::$app->db]))->down();
}
}
Миграции в модульных тестах
class BlogPostTest extends TestCase
{
protected function setUp()
{
$this->mockApplication();
Yii::$app->db->beginTransaction();
(new M170505142134Foo([‘db’ => Yii::$app->db]))->safeUp();
}
protected function tearDown()
{
Yii::$app->db->getTransaction()->rollback();
}
// …
}
Миграции и Инсталляции
• Инсталляция, обновление, откат
рабочей копии проекта
• Миграции – VCS для БД
• Типичные ошибки
• Применение миграций из нескольких
источников
• Независимое использование миграций
http://www.yiiframework.com/

Mais conteúdo relacionado

Mais procurados

Yii2
Yii2Yii2
Yii2Noveo
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Technopark
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндексit-people
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoMagecom Ukraine
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Fedor Lavrentyev
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)Roman Brovko
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Technopark
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb SpockBohdan Danyliuk
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПzfconfua
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5Technopark
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Fedor Lavrentyev
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 

Mais procurados (20)

Yii2
Yii2Yii2
Yii2
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
 
Почему Mojolicious?
Почему Mojolicious?Почему Mojolicious?
Почему Mojolicious?
 
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
 
Erlang tasty & useful stuff
Erlang tasty & useful stuffErlang tasty & useful stuff
Erlang tasty & useful stuff
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2
 
2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock2014 Jeeconf - Geb Spock
2014 Jeeconf - Geb Spock
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Perl 5.10 и 5.12
Perl 5.10 и 5.12Perl 5.10 и 5.12
Perl 5.10 и 5.12
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
 
Laravel 4 fwdays
Laravel 4 fwdaysLaravel 4 fwdays
Laravel 4 fwdays
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
FileAPI 2.0
FileAPI 2.0FileAPI 2.0
FileAPI 2.0
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 

Semelhante a YiiConf: Миграции и инсталляции

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПKirill Chebunin
 
MODX 3: Что нового?
MODX 3: Что нового?MODX 3: Что нового?
MODX 3: Что нового?Ivan Klimchuk
 
Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Stepan Tanasiychuk
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf Conference
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Minktyomo4ka
 
Экскурсия по Flutter SDK
Экскурсия по Flutter SDKЭкскурсия по Flutter SDK
Экскурсия по Flutter SDKSergey Penkovsky
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!Vitebsk Miniq
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
WordPress auto-install: просто о сложном
WordPress auto-install: просто о сложномWordPress auto-install: просто о сложном
WordPress auto-install: просто о сложномVladimir Samoletov
 
WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...
WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...
WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...WordCamp Kyiv
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Web deployment
Web deploymentWeb deployment
Web deploymentGetDev.NET
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Dev_Party
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customersaheadWorks
 

Semelhante a YiiConf: Миграции и инсталляции (20)

Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
MODX 3: Что нового?
MODX 3: Что нового?MODX 3: Что нового?
MODX 3: Что нового?
 
Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?Symfony2. На чем можно сэкономить время при разработке?
Symfony2. На чем можно сэкономить время при разработке?
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
 
Экскурсия по Flutter SDK
Экскурсия по Flutter SDKЭкскурсия по Flutter SDK
Экскурсия по Flutter SDK
 
ES2015+: давно пора!
ES2015+: давно пора!ES2015+: давно пора!
ES2015+: давно пора!
 
Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
WordPress auto-install: просто о сложном
WordPress auto-install: просто о сложномWordPress auto-install: просто о сложном
WordPress auto-install: просто о сложном
 
WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...
WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...
WP Kitchen Meetup Spring 2015 - Владимир Самолетов: WordPress auto-install: п...
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
Валерий Чугреев, ИСЭРТ РАН — Архитектура MVC в контексте web-разработки — про...
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Top 10 problems supporting Magento customers
Top 10 problems supporting Magento customersTop 10 problems supporting Magento customers
Top 10 problems supporting Magento customers
 

YiiConf: Миграции и инсталляции

  • 2. Инсталляция рабочей копии проекта Настройка окружения (GIT, PHP, Composer и т.д.) $ composer install Проверка требований $ php requirements.php Донастройка окружения (php.ini, Imagick и т.д.) Создание локальных директорий (‘@assets’, ‘@runtime’) Создание локальных файлов (‘config/local.php’, ‘.htaccess’) Миграция БД $ php yii migrate/up Дополнительные действия (crontab, sitemap и т.п.) – + Развертывание PHP кода $ git clone
  • 3. Обновление рабочей копии проекта $ composer install/update Проверка требований $ php requirements.php Донастройка окружения (php.ini, Imagick и т.д.) Очистка временных директорий (‘@assets’, ‘@runtime’) Обновление (пересоздание) локальных файлов (‘config/local.php’, ‘.htaccess’) Миграция БД $ php yii migrate/up Дополнительные действия (crontab, sitemap и т.п.) – + Обновление PHP кода $ git pull
  • 4. Откат рабочей копии проекта $ composer install Очистка временных директорий (‘@assets’, ‘@runtime’) Обновление (пересоздание) локальных файлов (‘config/local.php’) Миграция (откат) БД $ php yii migrate/down Дополнительные действия (crontab, sitemap и т.п.) Откат PHP кода $ git reset/checkout
  • 6. Миграции по разным рабочим копиям t “Dev” “Production” A B C D A B C D
  • 7. class m170506_185632_createUser extends Migration { public function up() { $this->createTable(‘User’, []); } public function down() { echo "m???_createUser cannot be reverted.n"; return false; } class m170506_185632_createUser extends Migration { public function up() { $this->createTable(‘User’, []); } public function down() { $this->dropTable(‘User’); }
  • 8. История PHP и история БД t “Dev” “Production” A B C 1 2 3 4 5 6 PHP DB A B C 1 2 3 4 5 6 PHP DB
  • 9. class m141106_185632_log_init extends Migration { public function up() { foreach (Yii::$app->getLog()->targets as $target) { if ($target instanceof DbTarget) { $this->createTable($target->logTable, […]); } } } class m141106_185632_log_init extends Migration { public function up() { $columns = […]; $this->createTable(‘AppLog’, $columns); $this->createTable(‘ErrorLog’, $columns); }
  • 10. use appmodelsUser; class m141106_185632_updateUser extends Migration { public function up() { User::updateAll([‘statusId’ => 5], [‘statusId’ => 10]); } public function down() { foreach (User::find()->where([‘statusId’ => 10])->all() as $user) { $user->statusId = 5; } } class m141106_185632_updateUser extends Migration { public function up() { $this->update(‘User’, [‘statusId’ => 5], [‘statusId’ => 10]); } }
  • 11. class m141106_185632_createFaqCategory extends Migration { public function up() { $this->createTable(‘FaqCategory’, […]); } } class m141106_185632_createFaqQuestion extends Migration { public function up() { $this->createTable(‘FaqQuestion’, […]); } } class m141106_185632_createFaq extends Migration { public function up() { $this->createTable(‘FaqCategory’, […]); $this->createTable(‘FaqQuestion’, […]); } }
  • 12. «Инсталляция» расширения / модуля $ composer require/update Применение на уровне PHP (конфигурация компонентов и модулей) Применение на уровне БД (создание миграции БД) Миграция БД $ php yii migrate/up
  • 13. Применение миграций из нескольких источников “some/extension”“My Project” m170501_A m170502_B m170504_C m150501_External
  • 14. Переключение «migrationPath» $ php yii migrate --migrationPath=@app/migrations $ php yii migrate --migrationPath=@some/extension/migrations Использование пространства имен return [ 'controllerMap' => [ 'migrate' => [ 'class' => 'yiiconsolecontrollersMigrateController', 'migrationNamespaces' => [ 'appmigrations', 'someextensionmigrations', ], ], ], // … ];
  • 15. История на сервере разработки m170501_A m170502_B m170504_C m150501_External t Расширение подключено 03-05-17 “My Project” “some/extension” “Зависит от”
  • 16. История на «production» сервере m170501_A m170502_B m170504_C m150501_External t “some/extension” “Зависит от” migrationPath=some/extension/migrations migrationPath=app/migrations “My Project”
  • 17. История на «production» сервере m170501_A m170502_B m170504_C m150501_External t С «нуля» миграции применяются в хронологическом порядке “My Project” “some/extension” “Зависит от”
  • 18. Повторное использование кода $array = [$day1Revenue, $day2Revenue, $day3Revenue]; $avgRevenue = array_sum($array) / count($array); // … $array = [$day1Costs, $day2Costs, $day3Costs]; $avgCosts = array_sum($array) / count($array); function avg (array $values) { return array_sum($values) / count($values); } $avgRevenue = avg([$day1Revenue, $day2Revenue, $day3Revenue]); // … $avgCosts = avg([$day1Costs, $day2Costs, $day3Costs]);
  • 19. Рефакторинг function avg (array $values) { if (empty($values)) { return 0; } return array_sum($values) / count($values); } $avgRevenue = avg([$day1Revenue, $day2Revenue, $day3Revenue]); // … $avgCosts = avg([$day1Costs, $day2Costs, $day3Costs]);
  • 20. Внешняя миграция, ревизия №1 class m160201_132117_someExtensionMigration extends Migration { public function up() { $this->createTable(‘BlogPostCategory’, […]); $this->createTable(‘BlogPost’, […]); } public function down() { $this->dropTable(‘BlogPost’); $this->dropTable(‘BlogPostCategory’); } }
  • 21. Внешняя миграция, ревизия №2 class m160201_132117_someExtensionMigration extends Migration { public function up() { $this->createTable(‘BlogPostCategory’, […]); $this->createTable(‘BlogPost’, […]); $this->createTable(‘BlogPostComment’, […]); } public function down() { $this->dropTable(‘BlogPostComment’); $this->dropTable(‘BlogPost’); $this->dropTable(‘BlogPostCategory’); } }
  • 22. Раздельная история $ php yii migrate --migrationPath=@app/migrations $ php yii migrate --migrationPath=@some/forum/migrations --migrationTable=migration_forum return [ 'controllerMap' => [ 'migrate-forum' => [ 'class' => 'yiiconsolecontrollersMigrateController', 'migrationNamespaces' => [ 'someforummigrations', ], 'migrationTable' => 'migration_module', ], ], // … ];
  • 23. Наследование // Без пространства имен: require (Yii::getAlias(‘@some/extension/ m160201_132117_someExtensionMigration.php’)); class m170505_142134_applySomeExtension extends m160201_132117_someExtensionMigration {} // С пространством имен: namespace appmigrations; class M170505142134ApplySomeExtension extends someextensionmigrationsM160201132117SomeExtensionMigration {}
  • 24. История при наследовании m170501_A m170502_B m170504_C m150501_External t “My Project” “some/extension” “Зависит от” m170502_X
  • 25. Наследование и модификация require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’)); class m170505_142134_rbac extends m140506_102106_rbac_init { protected function getAuthManager() { return new yiirbacDbManager([‘itemTable’ => ‘RbacItem’, …]); } public function up() { parent::up(); $this->alterColumn($this->getAuthManager() ->assignmentTable, ‘user_id’, $this->integer()->notNull()); } }
  • 26. Инверсия require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’)); class m170505_142134_undoRbac extends m140506_102106_rbac_init { protected function getAuthManager() { return new yiirbacDbManager([‘itemTable’ => ‘RbacItem’, …]); } public function up() { parent::down(); // down -> up } public function down() { parent::up(); // up -> down }
  • 27. Агрегация require (Yii::getAlias(‘@some/extension/m160201_132117_A.php’)); require (Yii::getAlias(‘@another/extension/m150301_141133_B.php’)); class m170505_142134_aggregation extends yiidbMigration { public function up() { (new m160201_132117_A([‘db’ => $this->db]))->up(); (new m150301_141133_B([‘db’ => $this->db]))->up(); } public function down() { (new m150301_141133_B([‘db’ => $this->db]))->down(); (new m160201_132117_A([‘db’ => $this->db]))->down(); } }
  • 28. Агрегация с пространством имен namespace appmigrations; use someextensionM160201132117A.php’; use anotherextensionM150301141133B.php; class M170505142134Aggregation extends yiidbMigration { public function up() { (new M160201132117A([‘db’ => $this->db]))->up(); (new M150301141133B([‘db’ => $this->db]))->up(); } public function down() { (new M150301141133B([‘db’ => $this->db]))->down(); (new M160201132117A([‘db’ => $this->db]))->down(); } }
  • 29. История при агрегации m170501_A m170510_B m170514_C m150501_Ex1 t “My Project” “some/extension” “Зависит от” m170512_X “another/extension” m170505_Ex2 1 1 1 1
  • 30. Независимое использование миграций use myextensionM170505142134Foo; class InstallController extends yiiconsoleController { public function actionInstall() { (new M170505142134Foo([‘db’ => Yii::$app->db]))->up(); } public function actionUninstall() { (new M170505142134Foo([‘db’ => Yii::$app->db]))->down(); } }
  • 31. Миграции в модульных тестах class BlogPostTest extends TestCase { protected function setUp() { $this->mockApplication(); Yii::$app->db->beginTransaction(); (new M170505142134Foo([‘db’ => Yii::$app->db]))->safeUp(); } protected function tearDown() { Yii::$app->db->getTransaction()->rollback(); } // … }
  • 32. Миграции и Инсталляции • Инсталляция, обновление, откат рабочей копии проекта • Миграции – VCS для БД • Типичные ошибки • Применение миграций из нескольких источников • Независимое использование миграций http://www.yiiframework.com/