andy87/yii2-lazy-load-trait 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

andy87/yii2-lazy-load-trait

Composer 安装命令:

composer require andy87/yii2-lazy-load-trait

包简介

PHP library for lazy load - developed by and_y87

README 文档

README

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

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

Установка.

Composer:

composer require andy87/lazy-load-trait

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

1. Аннотации

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

/**
 * 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 варианта:
    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.Использование

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

<?php

namespace some\path;

use andy87\lazy_load\LazyLoadTrait;

/**
 * SomeClass
 *
 * @property-read SomeComponent $someComponent
 * @property-read OtherComponent $otherComponent
 * @property-read ThirdComponent $thirdComponent
 * 
 * @package yii2\controllers
 */
class SomeClass
{
    use LazyLoadTrait;


    /** @var array  */
    public array $lazyLoadConfig = [
        'someComponent' => 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

namespace some\path;

use andy87\lazy_load\LazyLoadTrait;

/**
 * SomeClass
 *
 * @property-read SomeComponent $someComponent
 * @property-read DymanicConfigComponent $dynamicConfigCmponent
 * 
 * @package yii2\controllers
 */
class SomeClass
{
    use LazyLoadTrait;


    /** @var array  */
    public array $lazyLoadConfig = [
        'someComponent' => [
            '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),
        }
    }
}

P.S. в Yii2 имеется.

регистрация класса и вызов его через контейнер:

Yii::$container->set('someComponent', SomeComponent::class);

Yii::$container->get('someComponent')

Ленивая загрузка компоненов приложения:

// config/web.php | (frontend|backend|common)/config/main.php
'components' => [
    'someComponent' => [
        'class' => 'some\path\SomeComponent',
        'property' => 'value',
    ],
],


//use
$component = Yii::$app->someComponent; // Создается только при обращении

Home: https://github.com/andy87/lazy-load-trait

andy87/yii2-lazy-load-trait 适用场景与选型建议

andy87/yii2-lazy-load-trait 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 3 次下载、GitHub Stars 达 1, 最近一次更新时间为 2025 年 03 月 08 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「traits」 「loading」 「yii2」 「construct」 「lazyload」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 andy87/yii2-lazy-load-trait 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 andy87/yii2-lazy-load-trait 我们能提供哪些服务?
定制开发 / 二次开发

基于 andy87/yii2-lazy-load-trait 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 3
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 16
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: CC-BY-SA-4.0
  • 更新时间: 2025-03-08