dicr/yii2-json МодСль Π΄Π°Π½Π½Ρ‹Ρ… Json для Yii2

МодСль Π΄Π°Π½Π½Ρ‹Ρ… JSON-структур для Yii2. ΒΆ

ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ структурами 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);
0 0
1 follower
711 downloads
Yii Version: 2.0
License: MIT
Category: Validation
Tags: JSON, model
Developed by: Igor Tarasov Igor Tarasov
Created on: Nov 19, 2020
Last updated: (not set)
Packagist Profile
Code Repository

Related Extensions