dicr / yii2-json
Модель данных Json для Yii2
Installs: 675
Dependents: 18
Suggesters: 0
Security: 0
Stars: 0
Forks: 0
Type:yii2-extension
pkg:composer/dicr/yii2-json
Requires
- php: ~8.0
- ext-json: *
- dicr/yii2-validate: ~3.0
- yiisoft/yii2: ~2.0
Requires (Dev)
- phpunit/phpunit: ~9.5
- roave/security-advisories: dev-latest
README
Позволяет конвертировать между вложенными структурами JSON-данных в модели Yii2.
- позволяет сопоставлять названия аттрибутов с названиями полей в JSON
- позволяет создавать вложенные объекты
- позволяет определить пользовательские функции для конвертирования значений аттрибутов из/в JSON
Пример:
/**
 * Пример модели телефона
 */
class Phone extends dicr\json\JsonEntity 
{
    /** @var ?int номер телефона */
    public $number;
    /**
     * {@inheritDoc}
     * Пользовательские функции для конвертирования некоторых аттрибутов в JSON
     */
    public function attributesToJson() : array
    {
        return [        
            // конвертируем в формат +X (XXX) XXX-XX-XX при выводе в JSON
            'number' => function($val) : ?string {
                return empty($val) ? null : Formatter::asPhone($val); // null не выводится в JSON
            }
        ];
    }
    /**
     * {@inheritDoc}
     * Пользовательские функции для конвертирования некоторых аттрибутов из JSON.
     */
    public function attributesFromJson() : array
    {
        return [
            // конвертируем телефон в int
            'number' => function($val) : ?int
            {
                return empty($val) ? null : (int)$val;
            }  
        ];   
    }
}
/**
 * Пример модели пользователя.
 */
class Customer extends dicr\json\JsonEntity
{
    /** @var ?string */
    public $fio;
    /** @var ?Phone один мобильный телефон */
    public $cellular;
    /** @var Phone[]|null рабочие телефоны */
    public $workPhones;
    /**
     * {@inheritDoc}
     * Пример переопределения названий аттрибутов и полей JSON
     */
    public function attributeFields() : array
    {
        return [
            'fio'   => 'name',
            'workPhones' => 'work_phones'
        ];    
    }
    /**
     * {@inheritDoc}
     * Пример определения типов моделей вложенных аттрибутов.
     */ 
    public function attributeEntities() : array
    {
        return [
            'cellular' => Phone::class,     // одна модель
            'workPhones' => [Phone::class]  // массив моделей
        ];
    }
    /**
     * {@inheritDoc}
     * Пример валидации вложенных аттрибутов
     */
    public function rules() : array
    {
        return [
            ['cellular', 'default'],
            ['cellular', EntityValidator::class, 'class' => Phone::class],
            // пример валидации массива вложенных объектов
            ['workPhones', 'default'],
            ['workPhones', EntityValidator::class, 'class' => [Phone::class]],
        ];    
    }
}
Пример JSON для модели:
{
    "name": "Иван Васильевич",            // будет загружен в fio
    "cellular": {                         // будет конвертирован в Phone
        "number": "+7 (123) 456-78-93"    // будет конвертирован в int
    },
    "work_phones": [                      // будет загружен в workPhones[2]
        {
            "number": ""                  // пустое значение null
        },
        {
            "number": "123-45-67"         // будет конвертирован в (int)1234567
        }
    ]
}
Пример использования:
// создаем модель и загружаем из JSON
$customer = new Customer([
    'json' => Json::decode($string)
]);
// выводим в JSON
echo Json::encode($customer->json);