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'
Konstantin
ну это правда странноватая фигня, я правильно понимаю, что вы хотите параметром конфигурации бандла переключать имплементацию сервиса внутри бандла?
Konstantin
типа если
foo_bundle:
bar: 1
то заалиасить BarInterface в BarImpl1
а если
foo_bundle:
bar: 2
то заалиасить BarInterface в BarImpl2 ?
Konstantin
типа как в доктрине?
Максим
на сколько я понимаю, манипулировать бандлом можно только через bundle_config.yaml
Konstantin
result_cache_driver:
type: service
id: doctrine.result.redis.cacher
Максим
Максим
Пойду поковыряю исходники доктрины. Спасибо)
Konstantin
наверное, это все же компайлерпассом делается
Konstantin
вот так навскидку не придумаю как еще можно
Vlad
ну в твоем случае в Reference будет значение из ноды, которую спарсила симфуха.
там же что-то типа
$configuration = new Configuration($container->getParameter('kernel.debug'));
$config = $this->processConfiguration($configuration, $configs);
$config[‘foo’][‘bar’] - значение которое взяли из bundle_config.yaml/php/xml итд
Максим
Максим
Работает. Но реализация кажется сомнительной
Vlad
Максим
почему?)
Мне кажется, что как-то не хорошо в коде делать $container->get($alias)
Максим
Или я слишком заморачиваюсь?)
Vlad
Максим
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;
Юра
и всё
Юра
привет
Павел
Павел
Если оба в приватке или оба unset, разве не удалится?
Юра
в пхп рефкаунт
Юра
и обычный сборщик такое не удалит
Konstantin
течет доктрина в основном
она в целом не особо под демоны расчитана - банальный OrmException (когда уник сфейлился, например) хер отрекаверишь, например. и там много такого, гуглится дофига
Konstantin
то есть не обязательно даже в своем коде циклы делать из ссылок, лики из коробки практически есть
Konstantin
от авторов всяких свулей до жопы статей про то как она течет
Юра
Павел
Что-то даже интересно стало, потещу щас)
Павел
horse блин рили память так течет. Ппц. Плюсик в карму
Юра
Ну там вроде есть какие-то механизмы очистки циклов, но в доке написано что утечки всеравно возможны в таких случаях
Павел
Юра
Этими циклами страдают все рефкаунт сборщики. Поэтому обычно в таких языках есть weak references
Юра
Ссылки которые не влияют на счётчик ссылок
Юра
Хм. В пхп оказывается с 5.3 версии прикрутили и сборщик циклических ссылок
Юра
Не знал
Юра
Получается оверхед и на подсчет ссылок, и на циклический сборщик
Юра
https://www.php.net/manual/en/features.gc.collecting-cycles.php
Павел
Вот кстати опять брать доктрину. Там же вечно все друг на друга ссылается. Тот же bidirectional связи. Т.е. на этих цикличных ссылках, наверное тоже может течь, хоть и чистим доктрину. Хотя хз что под капотом еще есть.
Юра
Я почитал и так понял что не должно течь
Юра
Сборщик циклических ссылок вызовется когда заполнится буфер рут объектов либо руками запустить можно
Павел
Павел
Потестил, ага. Течет до определенного момента
Павел
потом стопорится
Юра
Там в доке говорится о том что ты временно в коде можешь отключить сборщик, и тогда есть риск что буфер переполнится и новые руты будут проигнорированы, и тогда будет утечка
Павел