Konstantin
судя по вакансиям
Spider
спасибо за совет попробую
Spider
-
Руслан 🇲🇨
Здравствуйте! Хочу подключить jquery. В app.js добавил: const $ = require('jquery'); global.$ = global.jQuery = $; В 1.js (файл с моим скриптом) добавил: import $ from 'jquery'; console.log($); В webpack.config.js добавил: .addEntry('app', './assets/js/1.js') .autoProvidejQuery() Запустил npm run watch. Я так понимаю в консоли должно было что-то вывести, но ничего не вывело, а значить jquery не подключился.
Юра
По-моему авто провайд джиквери не требует ничего импорироваиь руками
Null
Ага. Он собственно window.$ и объявляет
Null
Но и то. Эт надо если какой-нибудь жиквери плагин ругается на $ undefined. Так-то они часто сами разбираются.
Alexander
Привет) Никто не сталкивался когда в классе Denormalizer нет объекта в контексте по AbstractNormalizer::OBJECT_TO_POPULATE? Вообще есть магия объект беру тот что был из базы, десиализирую передавая его в OBJECT_TO_POPULATE и он увеличивает количество связанных объектов в два, каким то образом не понятным(
Gleb
К вчерашнему вопросу про Entity и DTO, использование дефолтных значений. У меня всё-таки фигня получается. В Entity задано поле, дефолтное значение для него (например булево false) В DTO три метода: - создание DTO из массива через конструктор - создание из сущности - создание из request в конструкторе я все равно вынужден сеттить либо значение, либо дублировать дефолтное значение. Код из Entity #[ORM\Column(type: 'boolean', nullable: false, options: ['defaults' => false])] private bool $isActive = false; Код из DTO (поскипано) public bool $isActive; public function __construct(array $data) { ... $this->isActive = $data['isActive'] ?? false; } не использовать null coalescing оператор, тогда проверять на существование ключа и кидать ошибку надо. null задать не могу, ибо type hinting, да и тоже коряво - сначала null в DTO, потом default в Entity. На первый взгляд не кажется правильным решение. Навесить Assertов, так там тогда в некоторых случаях большое полотно условий писать надо. Да и надо ли ассерты вешать на DTOшку? Хотя пока из всех мыслей это кажется наиболее правильным решением, только не уверен что валидация должна быть в DTO, а не в Entity. Как вообще решается подобная задача?
Nikolay
К вчерашнему вопросу про Entity и DTO, использование дефолтных значений. У меня всё-таки фигня получается. В Entity задано поле, дефолтное значение для него (например булево false) В DTO три метода: - создание DTO из массива через конструктор - создание из сущности - создание из request в конструкторе я все равно вынужден сеттить либо значение, либо дублировать дефолтное значение. Код из Entity #[ORM\Column(type: 'boolean', nullable: false, options: ['defaults' => false])] private bool $isActive = false; Код из DTO (поскипано) public bool $isActive; public function __construct(array $data) { ... $this->isActive = $data['isActive'] ?? false; } не использовать null coalescing оператор, тогда проверять на существование ключа и кидать ошибку надо. null задать не могу, ибо type hinting, да и тоже коряво - сначала null в DTO, потом default в Entity. На первый взгляд не кажется правильным решение. Навесить Assertов, так там тогда в некоторых случаях большое полотно условий писать надо. Да и надо ли ассерты вешать на DTOшку? Хотя пока из всех мыслей это кажется наиболее правильным решением, только не уверен что валидация должна быть в DTO, а не в Entity. Как вообще решается подобная задача?
Валидацию не нужно никогда в entity делать
Gleb
Спасибо, т.е. по факту мысль выкинуть null coalescing отсюда и повесить Asserts на свойства была правильной?
Максим
Всем привет. Вопрос по конфигурации бандлов и DI-контейнеру симфы. В конфиге бандла есть переменная, в которой должен лежать алиас уже собранного сервиса, чтоб можно было его достать в services.yaml основного приложения. Вопрос, как из переменной достать именно сервис а не строковое значение алиаса? Вот таким образом, по понятным причинам, не работает
Konstantin
епт, это очень странное использование контейнера
Konstantin
это надо делать через алиасы сервисов class Foo { public function __construct(private readonly BarInterface $bar) {} } services.yaml: BarInterface: '@Some\Bar\Impl'
Konstantin
если прям хочется в параметр сунуть, ну можно же в параметр сразу сервис положить
Konstantin
типа parameters: foo: '@Some\Bar\Impl'
Максим
если прям хочется в параметр сунуть, ну можно же в параметр сразу сервис положить
Проблема в том, что @Some\Bar\Impl лежит в конфиге бандла. При попытке обратиться к переменной из этого конфига через @, я получаю ошибку о несуществующем сервисе, что логично. Попробую через фабрику сделать
Konstantin
ну это правда странноватая фигня, я правильно понимаю, что вы хотите параметром конфигурации бандла переключать имплементацию сервиса внутри бандла?
Konstantin
типа если foo_bundle: bar: 1 то заалиасить BarInterface в BarImpl1 а если foo_bundle: bar: 2 то заалиасить BarInterface в BarImpl2 ?
Максим
ну это правда странноватая фигня, я правильно понимаю, что вы хотите параметром конфигурации бандла переключать имплементацию сервиса внутри бандла?
Скажем так. В бандле есть класс, который работает с кешем и должен принимать реализацию AdapterInterface. А эта реализация должна определяться на стороне основного приложения и каким-то образом пробрасываться во внутрь бандла
Konstantin
типа как в доктрине?
Максим
на сколько я понимаю, манипулировать бандлом можно только через bundle_config.yaml
Konstantin
result_cache_driver: type: service id: doctrine.result.redis.cacher
Максим
Пойду поковыряю исходники доктрины. Спасибо)
Konstantin
наверное, это все же компайлерпассом делается
Konstantin
вот так навскидку не придумаю как еще можно
Максим
наверное, это все же компайлерпассом делается
видел что-то в доке про это. Почитаю подробнее. Спасибо за помощь
Vlad
видел что-то в доке про это. Почитаю подробнее. Спасибо за помощь
Это айди сервиса, в BundleExtension $clientDefinition = new Definition(KeycloakClient::class, [ new Reference('http_client.keycloak_client'), ]); Закидываются референсы и все
Vlad
ну в твоем случае в Reference будет значение из ноды, которую спарсила симфуха. там же что-то типа $configuration = new Configuration($container->getParameter('kernel.debug')); $config = $this->processConfiguration($configuration, $configs); $config[‘foo’][‘bar’] - значение которое взяли из bundle_config.yaml/php/xml итд
Максим
Работает. Но реализация кажется сомнительной
Максим
почему?)
Мне кажется, что как-то не хорошо в коде делать $container->get($alias)
Максим
Или я слишком заморачиваюсь?)
Vlad
я может не особо въехал в твое сообщение, но конкретно в бандле конфигурация идет в БандлЭкстеншене. Вот чуваки для эластика https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/src/DependencyInjection/FOSElasticaExtension.php конфижат и ничего
Максим
Хорошо. Тогда оставлю как есть)
Vlad
В твоем же случае, у тебя есть некий алиас на класс. Допустим это условный ```session.storage.factory.mock_file``` Для того чтобы в бандле Х затащить в конструктор фактори мок файл ты делаешь $x = new Definition(SuperClass, [new Reference(‘session.storage.factory.mock_file’)])
Vlad
тебе не нужен container->get 🤔
Vlad
https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/src/DependencyInjection/FOSElasticaExtension.php#L151 Вот тут например похоже на то, что тебе надо, по-моему У фос эластики можно всандалить логгер в настройке logger: a.b.c В итоге через референс они сетят тот самый a.b.c алиас
Павел
я демоны просто рестарчу каждые Н итераций :)
Что-то одно с дргугим не складывается :)
Павел
Так проблема не в чистке доктрины же
Как то натыкался на то, что в доктрине логгер норм память жрет и в консюмерах есть смысл вырубать его, если не хотите рестартить. Т.е. IdentityMap почистили а логер там что-то хранит.
Konstantin
рестарчу не потому что течет, а потому что может когда-нибудь потечь в новом коде
Konstantin
запушили изменения, которые неочевидным образом ведут к утечке, либу какую-то обновили
Юра
Я вообще не пойму. Есть профайлеры. Берешь и смотришь что течет если течет
Юра
Хотя в пхп конкретно не пользовался,но в длругих языках вполне себе норм профайлеры и можно увидеть что не убивается
Юра
Кто-то где-то написал циклическию ссылке и все. Только профайлером разбобраться можно
Konstantin
течет доктрина в основном
Юра
$a->foo = $b; $b->bar = $a;
Юра
и всё
Юра
привет
Павел
$a->foo = $b; $b->bar = $a;
А что привет?
Павел
Если оба в приватке или оба unset, разве не удалится?
Юра
в пхп рефкаунт
Юра
и обычный сборщик такое не удалит
Konstantin
течет доктрина в основном
она в целом не особо под демоны расчитана - банальный OrmException (когда уник сфейлился, например) хер отрекаверишь, например. и там много такого, гуглится дофига
Konstantin
то есть не обязательно даже в своем коде циклы делать из ссылок, лики из коробки практически есть
Konstantin
от авторов всяких свулей до жопы статей про то как она течет
Юра
Если оба в приватке или оба unset, разве не удалится?
это если осталась ссылка на котору сделать unset )
Павел
Что-то даже интересно стало, потещу щас)
Павел
horse блин рили память так течет. Ппц. Плюсик в карму
Юра
Ну там вроде есть какие-то механизмы очистки циклов, но в доке написано что утечки всеравно возможны в таких случаях
Павел
это если осталась ссылка на котору сделать unset )
Даже unset обоих переменных не помогает
Юра
Этими циклами страдают все рефкаунт сборщики. Поэтому обычно в таких языках есть weak references
Юра
Ссылки которые не влияют на счётчик ссылок
Павел
Этими циклами страдают все рефкаунт сборщики. Поэтому обычно в таких языках есть weak references
Это да, там вроде даже два механизма есть. В общем принудительный запуск сборщика мусора помогает. unset вообще никак в этом не решает :( Прикольный опыт, спасибо.
Юра
Хм. В пхп оказывается с 5.3 версии прикрутили и сборщик циклических ссылок
Юра
Не знал
Юра
Получается оверхед и на подсчет ссылок, и на циклический сборщик
Юра
https://www.php.net/manual/en/features.gc.collecting-cycles.php
Павел
Вот кстати опять брать доктрину. Там же вечно все друг на друга ссылается. Тот же bidirectional связи. Т.е. на этих цикличных ссылках, наверное тоже может течь, хоть и чистим доктрину. Хотя хз что под капотом еще есть.
Юра
Я почитал и так понял что не должно течь
Юра
Сборщик циклических ссылок вызовется когда заполнится буфер рут объектов либо руками запустить можно
Павел
Потестил, ага. Течет до определенного момента
Павел
потом стопорится
Юра
Там в доке говорится о том что ты временно в коде можешь отключить сборщик, и тогда есть риск что буфер переполнится и новые руты будут проигнорированы, и тогда будет утечка