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

Содержание

Слайд 2

Инсталляция рабочей копии проекта

Инсталляция рабочей копии проекта

Слайд 3

Обновление рабочей копии проекта

Обновление рабочей копии проекта

Слайд 4

Откат рабочей копии проекта

Откат рабочей копии проекта

Слайд 5

Системы контроля версий

Системы контроля версий

Слайд 6

Миграции по разным рабочим копиям

Миграции по разным рабочим копиям

Слайд 7

class m170506_185632_createUser extends Migration {
public function up() {
$this->createTable(‘User’, []);
}

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 и история БД

История PHP и история БД

Слайд 9

class m141106_185632_log_init extends Migration {
public function up() {
foreach (Yii::$app->getLog()->targets as

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 app\models\User;
class m141106_185632_updateUser extends Migration {
public function up() {
User::updateAll([‘statusId’ =>

use app\models\User; 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

class m141106_185632_createFaqCategory extends Migration { public function up() { $this->createTable(‘FaqCategory’, […]); }
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

«Инсталляция» расширения / модуля

«Инсталляция» расширения / модуля

Слайд 13

Применение миграций из нескольких источников

Применение миграций из нескольких источников

Слайд 14

Переключение «migrationPath»

$ php yii migrate
--migrationPath=@app/migrations
$ php yii migrate
--migrationPath=@some/extension/migrations

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

Переключение «migrationPath» $ php yii migrate --migrationPath=@app/migrations $ php yii migrate --migrationPath=@some/extension/migrations
пространства имен

return [
'controllerMap' => [
'migrate' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => [
'app\migrations',
 'some\extension\migrations',
],
],
],
// …
];

Слайд 15

История на сервере разработки

История на сервере разработки

Слайд 16

История на «production» сервере

История на «production» сервере

Слайд 17

История на «production» сервере

История на «production» сервере

Слайд 18

Повторное использование кода

$array = [$day1Revenue, $day2Revenue, $day3Revenue];
$avgRevenue = array_sum($array) / count($array);
// …
$array

Повторное использование кода $array = [$day1Revenue, $day2Revenue, $day3Revenue]; $avgRevenue = array_sum($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

Рефакторинг function avg (array $values) { if (empty($values)) { return 0; }
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’,

Внешняя миграция, ревизия №1 class m160201_132117_someExtensionMigration extends Migration { public function up()
[…]);
$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’,

Внешняя миграция, ревизия №2 class m160201_132117_someExtensionMigration extends Migration { public function up()
[…]);
$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

Раздельная история $ php yii migrate --migrationPath=@app/migrations $ php yii migrate --migrationPath=@some/forum/migrations
--migrationTable=migration_forum

return [
'controllerMap' => [
'migrate-forum' => [
'class' => 'yii\console\controllers\MigrateController',
'migrationNamespaces' => [
 'some\forum\migrations',
],
'migrationTable' => 'migration_module',
],
],
// …
];

Слайд 23

Наследование

// Без пространства имен:
require (Yii::getAlias(‘@some/extension/ m160201_132117_someExtensionMigration.php’));
class m170505_142134_applySomeExtension extends m160201_132117_someExtensionMigration {}
// С пространством

Наследование // Без пространства имен: require (Yii::getAlias(‘@some/extension/ m160201_132117_someExtensionMigration.php’)); class m170505_142134_applySomeExtension extends m160201_132117_someExtensionMigration
имен:
namespace app\migrations;
class M170505142134ApplySomeExtension extends \some\extension\migrations\M160201132117SomeExtensionMigration {}

Слайд 24

История при наследовании

История при наследовании

Слайд 25

Наследование и модификация

require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’));
class m170505_142134_rbac extends m140506_102106_rbac_init
{
protected function getAuthManager()
{
return

Наследование и модификация require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’)); class m170505_142134_rbac extends m140506_102106_rbac_init { protected function
new yii\rbac\DbManager([‘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 yii\rbac\DbManager([‘itemTable’

Инверсия require (Yii::getAlias(‘@yii/rbac/m140506_102106_rbac_init.php’)); class m170505_142134_undoRbac extends m140506_102106_rbac_init { protected function getAuthManager() {
=> ‘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 \yii\db\Migration
{
public function up()
{
(new m160201_132117_A([‘db’

Агрегация require (Yii::getAlias(‘@some/extension/m160201_132117_A.php’)); require (Yii::getAlias(‘@another/extension/m150301_141133_B.php’)); class m170505_142134_aggregation extends \yii\db\Migration { public function
=> $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 app\migrations;
use some\extension\M160201132117A.php’;
use another\extension\M150301141133B.php;
class M170505142134Aggregation extends \yii\db\Migration
{
public function

Агрегация с пространством имен namespace app\migrations; use some\extension\M160201132117A.php’; use another\extension\M150301141133B.php; class M170505142134Aggregation
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

История при агрегации

История при агрегации

Слайд 30

Независимое использование миграций

use my\extension\M170505142134Foo;
class InstallController extends \yii\console\Controller
{
public function actionInstall()
{
(new

Независимое использование миграций use my\extension\M170505142134Foo; class InstallController extends \yii\console\Controller { public function
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();

Миграции в модульных тестах class BlogPostTest extends TestCase { protected function setUp()
Yii::$app->db->beginTransaction();
(new M170505142134Foo([‘db’ => Yii::$app->db]))->safeUp();
}
protected function tearDown()
{
Yii::$app->db->getTransaction()->rollback();
}
// …
}