Skip to content

Commit 79ce4cf

Browse files
Реализация компонента
0 parents  commit 79ce4cf

8 files changed

+666
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/vendor/

LICENSE

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2021 Maxim N Epikhin
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# php-sql-migration
2+
3+
Компонент для работы с SQL миграциями.
4+
5+
В компоненте реализован основной класс `SqlMigration`, который выполняет базовые операции по работе с миграциями.
6+
Большинство методов возвращает наборы данных или логические значения. Данный подход позволит написать практически любую
7+
обертку для собственных нужд.
8+
9+
Как пример реализации обертки был реализован класс `ConsoleSqlMigration`, которые наследуется от `SqlMigration` и
10+
переопределяет его методы. Переопределение первоначально вызывает `parent::` после чего реализует дополнительную логику
11+
в выводе сообщений в консоль (терминал).
12+
13+
Для реализации компонента необходимо передать класс реализующий интерфейс `DatabaseInterface` и массив настроек.
14+
Обязательными параметрами в настройках являются:
15+
16+
- **schema** - схема в базе данных для миграций
17+
- **table** - таблица в базе данных для миграций
18+
- **path** - путь в файловой структуре для папки с миграциями
19+
20+
Компонент самостоятельно проверяет и создает необходимые (указанные) схемы, таблицы и папки при наличии заранее
21+
определенных разрешений (прав). Для корректной работы с базой данных необходимо заранее установить соединение с ней.
22+
23+
# Структура
24+
25+
```
26+
src/
27+
--- exceptions/
28+
--- interfaces/
29+
--- SqlMigration.php
30+
--- ConsoleSqlMigration.php
31+
```
32+
33+
В директории `exceptions` хранятся специальные исключения компонента: `SqlMigrationException`.
34+
35+
В директории `interfaces` хранятся необходимые интерфейсы, которые необходимо имплементировать в при реализации
36+
собственного класса `SqlMigration`.
37+
38+
Класс `SqlMigration` реализует интерфейс `SqlMigrationInterface` для управления SQL миграциями.
39+
40+
# Доступные методы
41+
42+
| Метод | Аргументы | Возвращаемые данные | Исключения | Описание |
43+
|-------------------------------------------------------------------|------------------------------------------------------------------------------------------------|---------------------|-----------------------------------------|-----------------------------------------------------------------------------|
44+
| public function up(int $count = 0) | $count Количество миграция (0 - относительно всех) | array | SqlMigrationException | Применяет указанное количество миграций |
45+
| public function down(int $count = 0) | $count Количество миграция (0 - относительно всех) | array | SqlMigrationException | Отменяет указанное количество миграций |
46+
| public function history(int $limit = 0) | $limit Ограничение длины списка (null - полный список) | array | | Возвращает список сообщений о примененных миграций |
47+
| public function create(string $name) | $name Название миграции | bool | RuntimeException\|SqlMigrationException | Создает новую миграцию и возвращает сообщение об успешном создании миграции |
48+
| __construct(DatabaseInterface $database, array $settings) | $database Компонент работы с базой данных; array $settings Массив настроек | | SqlMigrationException | Конструктор класса |
49+
| public function initSchemaAndTable() | | bool | SqlMigrationException | Создает схему и таблицу в случае их отсутствия |
50+
| public function __destruct() | | | | Деструктор класса |
51+
| protected function getNotAppliedList() | | array | | Возвращает список не примененных миграций |
52+
| protected function getHistoryList(int $limit = 0) | $limit Ограничение длины списка (null - полный список) | array | | Возвращает список примененных миграций |
53+
| protected function execute(array $list, int $count, string $type) | $list Массив миграций; $count Количество миграций для применения; $type Тип миграции (up/down) | array | RuntimeException | Выполняет миграции |
54+
| protected function addHistory(string $name) | $name Наименование миграции | bool | SqlMigrationException | Добавляет запись в таблицу миграций |
55+
| protected function removeHistory(string $name) | $name Наименование миграции | bool | SqlMigrationException | Удаляет миграцию из таблицы миграций |
56+
| protected function validateName(string $name) | $name Название миграции | void | SqlMigrationException | Проверяет имя миграции на корректность |
57+
| protected function generateName(string $name) | string $name Название миграции | string | | Создает имя миграции по шаблону: m{дата в формате Ymd_His}_name |
58+
59+
# Контакты
60+
61+
Вы можете связаться со мной в социальной сети ВКонтакте: [ВКонтакте: Максим Епихин](https://vk.com/maximepihin)
62+
63+
Если удобно писать на почту, то можете воспользоваться этим адресом: mepihindeveloper@gmail.com
64+
65+
Мой канал на YouTube, который посвящен разработке веб и игровых
66+
проектов: [YouTube: Максим Епихин](https://www.youtube.com/channel/UCKusRcoHUy6T4sei-rVzCqQ)
67+
68+
Поддержать меня можно переводом на Яндекс.Деньги: [Денежный перевод](https://yoomoney.ru/to/410012382226565)

composer.json

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"name": "mepihindeveloper/php-sql-migration",
3+
"description": "Component for working with SQL migrations",
4+
"type": "library",
5+
"license": "MIT",
6+
"keywords": [
7+
"component",
8+
"class",
9+
"php",
10+
"sql",
11+
"migration"
12+
],
13+
"authors": [
14+
{
15+
"name": "mepihindeveloper",
16+
"email": "mepihindeveloper@gmail.com"
17+
}
18+
],
19+
"require": {
20+
"php": ">=7.4",
21+
"mepihindeveloper/php-database": ">=1.0",
22+
"mepihindeveloper/php-console": ">=1.0"
23+
},
24+
"autoload": {
25+
"psr-4": {
26+
"mepihindeveloper\\components\\": "src/"
27+
}
28+
},
29+
"minimum-stability": "dev",
30+
"prefer-stable": true
31+
}

src/ConsoleSqlMigration.php

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
<?php
2+
3+
declare(strict_types = 1);
4+
5+
namespace mepihindeveloper\components;
6+
7+
use mepihindeveloper\components\exceptions\SqlMigrationException;
8+
use mepihindeveloper\components\interfaces\DatabaseInterface;
9+
use RuntimeException;
10+
11+
/**
12+
* Class ConsoleSqlMigration
13+
*
14+
* Класс предназначен для работы с SQL миграциями с выводом сообщений в консоль (терминал)
15+
*
16+
* @package mepihindeveloper\components
17+
*/
18+
class ConsoleSqlMigration extends SqlMigration {
19+
20+
public function __construct(DatabaseInterface $database, array $settings) {
21+
parent::__construct($database, $settings);
22+
23+
try {
24+
$this->initSchemaAndTable();
25+
26+
Console::writeLine('Схема и таблица для миграции были успешно созданы', Console::FG_GREEN);
27+
} catch (SqlMigrationException $exception) {
28+
Console::writeLine($exception->getMessage(), Console::FG_RED);
29+
30+
exit;
31+
}
32+
}
33+
34+
public function up(int $count = 0): array {
35+
$migrations = parent::up($count);
36+
37+
if (empty($migrations)) {
38+
Console::writeLine("Нет миграций для применения");
39+
40+
exit;
41+
}
42+
43+
foreach ($migrations['success'] as $successMigration) {
44+
Console::writeLine("Миграция {$successMigration['name']} успешно применена", Console::FG_GREEN);
45+
}
46+
47+
if (array_key_exists('error', $migrations)) {
48+
foreach ($migrations['error'] as $errorMigration) {
49+
Console::writeLine("Ошибка применения миграции {$errorMigration['name']}", Console::FG_RED);
50+
}
51+
52+
exit;
53+
}
54+
55+
return $migrations;
56+
}
57+
58+
public function down(int $count = 0): array {
59+
$migrations = parent::down($count);
60+
61+
if (empty($migrations)) {
62+
Console::writeLine("Нет миграций для отмены");
63+
64+
exit;
65+
}
66+
67+
foreach ($migrations['success'] as $successMigration) {
68+
Console::writeLine("Миграция {$successMigration['name']} успешно отменена", Console::FG_GREEN);
69+
}
70+
71+
if (array_key_exists('error', $migrations)) {
72+
foreach ($migrations['error'] as $errorMigration) {
73+
Console::writeLine("Ошибка отмены миграции {$errorMigration['name']}", Console::FG_RED);
74+
}
75+
76+
exit;
77+
}
78+
79+
return $migrations;
80+
}
81+
82+
public function create(string $name): bool {
83+
try {
84+
parent::create($name);
85+
86+
Console::writeLine("Миграция {$name} успешно создана");
87+
} catch (RuntimeException | SqlMigrationException $exception) {
88+
Console::writeLine($exception->getMessage(), Console::FG_RED);
89+
90+
return false;
91+
}
92+
93+
return true;
94+
}
95+
96+
public function history(int $limit = 0): array {
97+
$historyList = parent::history($limit);
98+
99+
foreach ($historyList as $historyRow) {
100+
Console::writeLine($historyRow);
101+
}
102+
103+
return $historyList;
104+
}
105+
}

0 commit comments

Comments
 (0)