PHPackages                             andy87/lazy-load-trait - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. andy87/lazy-load-trait

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

andy87/lazy-load-trait
======================

PHP library for lazy load - developed by and\_y87

148PHP

Since Apr 6Pushed 1y ago1 watchersCompare

[ Source](https://github.com/andy87/lazy-load-trait)[ Packagist](https://packagist.org/packages/andy87/lazy-load-trait)[ RSS](/packages/andy87-lazy-load-trait/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)DependenciesVersions (1)Used By (0)

Вот такая реализация пришла в голову.

Инициализация свойства класса только в момент вызова(обращения к ним). P.S. Знаю что в PHP c версии 8.4 появилась поддержка lazyLoad из коробки, но это ещё не завезли в Yii2.

Установка.

Composer:

```
composer require andy87/lazy-load-trait
```

Использование. Порядок дейсвий.
-------------------------------

[](#использование-порядок-дейсвий)

### 1. Аннотации

[](#1-аннотации)

Указать свойство в аннотации класса

```
/**
 * SomeClass
 *
 * @property-read SomeComponent $someComponent // native
 * @property-read OtherComponent $_otherComponent // singleton
 *
 * @package yii2\controllers
 */
class SomeClass
{
    //...
}
```

### 2. Добавление use

[](#2-добавление-use)

Для подключения трейта в классе имеется 2 варианта Trait'ов:

- `andy87\lazy_load\yii2\LazyLoadTrait` - для использования в фреймворке Yii2 с применением метода `Yii::createObject()`
- `andy87\lazy_load\LazyLoadTrait` - для использования вне фреймворка Yii2

### 3. Конфигурация свойств

[](#3-конфигурация-свойств)

указать конфигурацию в свойстве `$lazyLoadConfig`

Структура конфигурации.

- для использования свойства как экземпляр класса (без настроек), доступно 2 варианта:

```
    public array $lazyLoadConfig = [
        'someComponent' => SomeComponent::class, // быстрый способ ( меньше проверок )
        'otherComponent' => [
            'class' => OtherComponent::class,  // способ поедленней ( больше проверок )
        ],
    ]
```

- с назначением публичных свойств класса

```
    public array $lazyLoadConfig = [
      'otherComponent' => [
            'class' => OtherComponent::class,
            'public_property_1' => 'value_1',
            'public_property_2' => 'value_2',
        ],
    ]
```

- с передачей параметров в аргументы функции `__construct()`

```
    public array $lazyLoadConfig = [
       'thirdComponent' => [
            'class' => [ ThirdComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
        ],
    ]
```

- комбинирование назначения публичных свойств и передача параметров в аргументы функции `__construct()`

```
    public array $lazyLoadConfig = [
         'nextComponent' => [
            'class' => [ NextComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
            'public_property_1' => 'value_1',
            'public_property_2' => 'value_2',
        ],
    ]
```

- добавление объекта в `cache` с последующим переиспользованием закешированой версии **добавление к имени своства префикса(нижнее подчеркивание `_`)**

```
    public array $lazyLoadConfig = [
        '_nextComponent' => [ // данное своство при первом обращении будет закешировано, и при последующих обращениях будет использоваться закешированная версия
            'class' => [ NextComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
            'public_property_1' => 'value_1',
            'public_property_2' => 'value_2',
        ],
    ]
```

### 4.Использование

[](#4использование)

Обращаться к свойствам как к обычным свойствам класса

```
