You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Это разные объекты со своим состоянием (importMapRegistered, stylesIncluded). Защита от повторного вызова в registerImportMap() / includeStyles() работает на уровне экземпляра.
Проблема
Если в рамках одного запроса страницы будут задействованы оба пути разрешения сервиса, флаги идемпотентности не пересекутся и можно получить:
дублирующийся <script type="importmap"> (браузер учитывает только первую import map — вторая будет проигнорирована/выдаст ошибку);
повторное подключение CSS.
Сейчас это латентно: единственный потребитель — плагин vuecoremanager.php, использующий $modx->services->get(vuetools). Но как только появится код, дёргающий getService(vueTools) / VueTools\Service, проблема проявится.
Предложение
Сделать канонический инстанс один. Варианты:
замыкание в bootstrap.php возвращает \VueTools\Service вместо \VueTools\VueCore; либо
регистрировать ключ контейнера vuetools так, чтобы он и конвенциональное разрешение указывали на один и тот же объект.
Дополнительно (мелочь)
Неконсистентность namespace↔директория: автозагрузчик в bootstrap.php мапит VueTools\* → src/, но Service лежит в model/vuetools/. Работает только потому, что xPDO грузит по явному пути. Стоит оставить комментарий в коде.
Разобраться, кто именно вызывает getService(vueTools) (camelCase) при том, что весь репозиторий использует vuetools (нижний регистр).
@
Контекст
После мёржа #6 класс
VueCoreстал доступен двумя путями:vuetools— замыкание вcore/components/vuetools/bootstrap.php, возвращаетVueTools\VueCore.VueTools\Serviceизmodel/vuetools/Service.php(добавлено в fix(vuetools): add VueTools\Service for MODX service container #6), возвращаетVueTools\Service.Это разные объекты со своим состоянием (
importMapRegistered,stylesIncluded). Защита от повторного вызова вregisterImportMap()/includeStyles()работает на уровне экземпляра.Проблема
Если в рамках одного запроса страницы будут задействованы оба пути разрешения сервиса, флаги идемпотентности не пересекутся и можно получить:
<script type="importmap">(браузер учитывает только первую import map — вторая будет проигнорирована/выдаст ошибку);Сейчас это латентно: единственный потребитель — плагин
vuecoremanager.php, использующий$modx->services->get(vuetools). Но как только появится код, дёргающийgetService(vueTools)/VueTools\Service, проблема проявится.Предложение
Сделать канонический инстанс один. Варианты:
bootstrap.phpвозвращает\VueTools\Serviceвместо\VueTools\VueCore; либоvuetoolsтак, чтобы он и конвенциональное разрешение указывали на один и тот же объект.Дополнительно (мелочь)
bootstrap.phpмапитVueTools\*→src/, ноServiceлежит вmodel/vuetools/. Работает только потому, что xPDO грузит по явному пути. Стоит оставить комментарий в коде.getService(vueTools)(camelCase) при том, что весь репозиторий используетvuetools(нижний регистр).Ссылка: #6
@