https://github.com/andy87/lazy-load-trait
Yii2 Trait загрузки классов по запросу
https://github.com/andy87/lazy-load-trait
Last synced: 9 months ago
JSON representation
Yii2 Trait загрузки классов по запросу
- Host: GitHub
- URL: https://github.com/andy87/lazy-load-trait
- Owner: andy87
- Created: 2025-01-24T22:06:51.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2025-03-08T08:21:17.000Z (10 months ago)
- Last Synced: 2025-03-08T09:27:32.653Z (10 months ago)
- Language: PHP
- Homepage:
- Size: 28.3 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Вот такая реализация пришла в голову.
Инициализация свойства класса только в момент вызова(обращения к ним).
P.S. Знаю что в PHP c версии 8.4 появилась поддержка lazyLoad из коробки, но это ещё не завезли в Yii2.
Установка.
Composer:
```bash
composer require andy87/lazy-load-trait
```
## Использование. Порядок дейсвий.
### 1. Аннотации
Указать свойство в аннотации класса
```php
/**
* SomeClass
*
* @property-read SomeComponent $someComponent // native
* @property-read OtherComponent $_otherComponent // singleton
*
* @package yii2\controllers
*/
class SomeClass
{
//...
}
```
### 2. Добавление use
Для подключения трейта в классе имеется 2 варианта Trait'ов:
* `andy87\lazy_load\yii2\LazyLoadTrait` - для использования в фреймворке Yii2 с применением метода `Yii::createObject()`
* `andy87\lazy_load\LazyLoadTrait` - для использования вне фреймворка Yii2
### 3. Конфигурация свойств
указать конфигурацию в свойстве `$lazyLoadConfig`
Структура конфигурации.
* для использования свойства как экземпляр класса (без настроек), доступно 2 варианта:
```php
public array $lazyLoadConfig = [
'someComponent' => SomeComponent::class, // быстрый способ ( меньше проверок )
'otherComponent' => [
'class' => OtherComponent::class, // способ поедленней ( больше проверок )
],
]
```
* с назначением публичных свойств класса
```php
public array $lazyLoadConfig = [
'otherComponent' => [
'class' => OtherComponent::class,
'public_property_1' => 'value_1',
'public_property_2' => 'value_2',
],
]
```
* с передачей параметров в аргументы функции `__construct()`
```php
public array $lazyLoadConfig = [
'thirdComponent' => [
'class' => [ ThirdComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
],
]
```
* комбинирование назначения публичных свойств и передача параметров в аргументы функции `__construct()`
```php
public array $lazyLoadConfig = [
'nextComponent' => [
'class' => [ NextComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
'public_property_1' => 'value_1',
'public_property_2' => 'value_2',
],
]
```
* добавление объекта в `cache` с последующим переиспользованием закешированой версии
__добавление к имени своства префикса(нижнее подчеркивание `_`)__
```php
public array $lazyLoadConfig = [
'_nextComponent' => [ // данное своство при первом обращении будет закешировано, и при последующих обращениях будет использоваться закешированная версия
'class' => [ NextComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
'public_property_1' => 'value_1',
'public_property_2' => 'value_2',
],
]
```
### 4.Использование
Обращаться к свойствам как к обычным свойствам класса
```php
SomeComponent::class,
'otherComponent' => [
'class' => OtherComponent::class,
'public_property' => 'some value'
],
'_thirdComponent' => [
'class' => [ ThirdComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
],
'_nextComponent' => [
'class' => [ NextComponent::class, ['construct_argument_1', 'construct_argument_2'] ],
'public_property' => 'some value'
],
];
/**
* @return string
*/
public function actionView(): string
{
// Apply LazyLoad
$text = $this->someComponent->insideSomeComponent->test();
if (Yii::$app->request->isPost) {
return $this->otherComponent->someMethod();
}
if (Yii::$app->request->isAjax) {
$text = $this->_thirdComponent->mextMethod();
}
if (Yii::$app->request->isDelete) {
$text = $this->_nextComponent->mextMethod();
}
return $this->render('view', ['text' => $text]);
}
}
```
### Для динамической настройки, с получением своств из метода, надо перезаписать метод `findLazyLoadConfig()`
```php
[
'class' => SomeComponent::class,
'public_property' => 'some value'
],
'dynamicConfigCmponent' => DymanicConfigComponent::class,
];
/**
* @return string
*/
public function actionView(): string
{
$message = $this->otherComponent->insideSomeComponent->test();
return $this->dynamicConfigCmponent->insideSomeComponent->test();
}
protected function findLazyLoadConfig(string $name): ?object
{
return match ($name)
{
'dynamicConfigCmponent' => [
'class' => [SomeComponent::class, $this->getArguments() ],
],
default => parent::findCachedObject($name),
}
}
}
```
Home: https://github.com/andy87/lazy-load-trait