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

Содержание

Слайд 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

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() {

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 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

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

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

Слайд 13

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

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

Слайд 14

Переключение «migrationPath» $ php yii migrate --migrationPath=@app/migrations $ php yii migrate

Переключение «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)

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

$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;

Рефакторинг

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

Внешняя миграция, ревизия №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

Внешняя миграция, ревизия №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

Раздельная история

$ 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

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

// Без пространства имен:
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

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

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

return 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()

Инверсия

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’ => ‘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

Агрегация

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’ => $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

Агрегация с пространством имен

namespace app\migrations;
use some\extension\M160201132117A.php’;
use another\extension\M150301141133B.php;
class M170505142134Aggregation extends \yii\db\Migration
{
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

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

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

Слайд 30

Независимое использование миграций use my\extension\M170505142134Foo; class InstallController extends \yii\console\Controller { public

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

use my\extension\M170505142134Foo;
class InstallController extends \yii\console\Controller
{
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

Миграции в модульных тестах

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();
}
// …
}