Мотивация
В разработке на PHP часто требуется преобразовать один вид модели в другой. Традиционный подход заключается в написании двух методов: transformToB
и setFromB
. Однако во многих случаях логика этих методов оказывается одинаковой, за исключением того, что один метод создаёт объект, а другой извлекает информацию из объекта.
Так появилась эта библиотека, которая позволяет определить преобразование модели один раз и использовать его в обоих направлениях.
Использование
require_once 'magic_transformer.php';
use MagicTransform\M as M;
Mapper — это экземпляр класса, который реализует интерфейс MagicTransform\iBidirectionTrans
.
interface iBidirectionTrans {
public function forward_map($left_val); //прямое отображение
public function reverse_map($right_val, &$left_obj); //обратное отображение
}
//Определение отношений отображения
$trans = M::make_mapper(
[
'abc' => M::$self[0], // значение ключа 'abc' равно $left[0]
'ccc' => M::make_chain( // при прямом отображении значение первого mapper передаётся второму; при обратном отображении происходит наоборот
M::$self[1], // make_chain получает $left как $left[1]
[
'yyy' => M::$self // self всегда отображает себя на себя
]
),
'ddd' => M::self['eee']['fff'], // прямое отображение $left['eee']['fff']; обратное отображение устанавливает $left['eee']['fff']
'eee' => M::make_chain(
M::$self[2], // теперь make_list_mapper принимает $left от $left[2]
M::make_list_mapper( // применяет mapper к каждому элементу $left, при обратном отображении сначала получает каждый элемент, затем создаёт массив
M::make_func_mapper( // пользовательский mapper!
function($left_val) { // прямое
return $left_val + 1;
},
function ($right_val, &$left_obj) { // обратное
$left_obj = $right_val - 1;
}
)
)
)
]
);
$left = ['0th', '1st', [1,2,3], 'eee' => ['fff' => 4]];
$right = $trans->forward_map($left); // прямое отображение
print_r($right);
/*
* Array
(
[abc] => 0th
[ccc] => Array
(
[yyy] => 1st
)
[ddd] => 4
[eee] => Array
(
[0] => 2
(
[1] => 3
[2] => 4
)
*/
// Изменяем $right
$right['abc'] = '0th0th';
$right['ccc']['yyy'] = ['1st1st'];
$right['ddd'] = 100;
$right['eee'][1] = 7;
$left = array(); // здесь вы можете передать свой собственный объект ORM
$trans->reverse_map($right, $left);
print_r($left);
/*
Array
(
[0] => 0th0th
[1] => Array
(
[0] => 1st1st
)
[eee] => Array
(
[fff] => 100
)
[2] => Array
(
[0] => 1
[1] => 6
[2] => 3
)
)
*/
API
Все API определены в пространстве имён MagicTransform
.
interface iBidirectionTrans {
public function forward_map($left_val);
public function reverse_map($right_val, &$left_obj);
}
Все mappers должны реализовывать этот интерфейс.
Все они определены в классе M
.
Отображает $left[$key1][$key2]...
M::make_key_mapper('abc', 'def'); //$left['abc']['def']
Псевдонимы для make_key_mapper(0)
, ..., make_key_mapper(3)
.
Всегда отображает на себя. Переопределяет магический метод []
, эффект аналогичен make_key_mapper
.
Аргумент — mapper.
При прямом отображении значения последовательно отображаются в порядке Arg1, Arg2, ..., ArgN, с выводом предыдущего как ввода следующего. При обратном отображении порядок обратный.
M::make_chain(M::$__0, M::$__1); // $left[0][1], эквивалентно make_key_mapper(0, 1)
Применяет mapper к каждому элементу массива $left
.
M::make_list_mapper(M::$__0); //[$left[0][0], $left[1][0], ...]
Пользовательский mapper, первый параметр — прямое отображение, второй — обратное.
M::make_func_mapper( // Пользовательский
function($left_val) { // Прямое
return $left_val + 1;
},
function ($right_val, &$left_obj) {
$left_obj = $right_val - 1;
}
); // $left + 1
Автоматически преобразует объект/массив в mapper.
make_mapper(
[
'aaa' => M::$__0
]
);
Apache License.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )