1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/htfy96-MagicTransformer.php

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Двунаправленная модель отображения в PHP

Мотивация

В разработке на 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.

Интерфейс

iBidirectionTrans

interface iBidirectionTrans {
    public function forward_map($left_val);
    public function reverse_map($right_val, &$left_obj);
}

Все mappers должны реализовывать этот интерфейс.

Mapper и вспомогательные функции для создания mapper

Все они определены в классе M.

make_key_mapper

Отображает $left[$key1][$key2]...

M::make_key_mapper('abc', 'def'); //$left['abc']['def']

__0/__1/__2/__3

Псевдонимы для make_key_mapper(0), ..., make_key_mapper(3).

self

Всегда отображает на себя. Переопределяет магический метод [], эффект аналогичен make_key_mapper.

make_chain

Аргумент — mapper.

При прямом отображении значения последовательно отображаются в порядке Arg1, Arg2, ..., ArgN, с выводом предыдущего как ввода следующего. При обратном отображении порядок обратный.

M::make_chain(M::$__0, M::$__1); // $left[0][1], эквивалентно make_key_mapper(0, 1)

make_list_mapper

Применяет mapper к каждому элементу массива $left.

M::make_list_mapper(M::$__0); //[$left[0][0], $left[1][0], ...]

make__func_mapper

Пользовательский mapper, первый параметр — прямое отображение, второй — обратное.

M::make_func_mapper( // Пользовательский
                    function($left_val) { // Прямое
                        return $left_val + 1;
                    },
                    function ($right_val, &$left_obj) {
                        $left_obj = $right_val - 1;
                    }
                ); // $left + 1

make_mapper

Автоматически преобразует объект/массив в mapper.

make_mapper(
            [
                'aaa' => M::$__0
            ]
        );

Лицензия

Apache License.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
PHP
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/htfy96-MagicTransformer.php.git
git@api.gitlife.ru:oschina-mirror/htfy96-MagicTransformer.php.git
oschina-mirror
htfy96-MagicTransformer.php
htfy96-MagicTransformer.php
cn