Юра
Еще можно использовать сервис сабскрайбер
Юра
И получать сервис который тебе нужен когда он тебе нцжен
Denis
ясно спасибо
Юра
Ну вообще это обычно имеет смысл если сервис действительно тяжёлый
Юра
И если он реально не нужен где-то еще иначе особого смысла нет
Konstantin
проще просто не делать в конструкторе никакой тяжелой работы
Konstantin
типа вместо class HeavyService { public function __construct( private readonly FooService $foo, private readonly BarService $bar, ) { $this->initHeavyCacheForExample(); } public function doTheWork(): void { // work with initialized cache } }
Konstantin
сделать вот так class HeavyService { private bool $cache_initialized = false; public function __construct( private readonly FooService $foo, private readonly BarService $bar, ) { } public function doTheWork(): void { if (!$this->cache_initialized) { $this->initHeavyCacheForExample(); } // work with initialized cache } }
Konstantin
это везде поможет - и не надо будет думать о lazy-сервисах, и тесты будут быстрее проходить и в целом это будет гораздо правильнее
Denis
сделать вот так class HeavyService { private bool $cache_initialized = false; public function __construct( private readonly FooService $foo, private readonly BarService $bar, ) { } public function doTheWork(): void { if (!$this->cache_initialized) { $this->initHeavyCacheForExample(); } // work with initialized cache } }
Изините, но еще раз уточню. То есть в этом случае если initHeavyCacheForExample не будет использовать FooService и BarService ( при cache_initialized = true ), то эти 2 сервиса(FooService,BarService) не будут созданы в памяти?
Konstantin
не, чот плохо у вас всё 🙂
Konstantin
FooService и BarService я вообще просто так туда пихнул, чтобы показать что это мол сервис с зависимостями, а не просто какой-то класс с конструктором мой пойнт в том, что если сделать создание всех сервисов максимально лёгким (то есть не делая в конструкторе никакой работы), то можно не париться о количестве этих сервисов и ссылок на них, они все будут иметь околонулевой оверхед
Konstantin
я чую там от недостатка понимания возникли тревоги, не особо подкрепленные данными
Denis
Писать на пхп и так парится по поводу памяти это конечно риспект
не в памяти дело, а в чистом коде. Возможно не правильно поняли. Понятно что париться о том сколько оперативы у сервера - это не по адресу
Konstantin
в общем, попытайтесь уловить мой посыл с легкой инициализацией, это куда полезнее, чем экономить на спичках ценой усложнения кода
Юра
Если хочется узнать больше, открываешь папку var/cache и там будет скомпилированный контейнер
Юра
Можешь поизучать сразу понятно станет
Denis
Можешь поизучать сразу понятно станет
да, надо углубиться в эту тему
Konstantin
вово
Иван
и значительно проще обосраться, в том числе по производительности, на задачах типа той, что чуть выше рассмотрели на аудите обновления
Konstantin
о, экспертиза пошла
Иван
типа в го нельзя обосраться по производительности?
Иван
причем тут это вообще
а причём тут переход на го по причинам производительности?
Denis
а причём тут переход на го по причинам производительности?
Потому что это одна из основных причин перехода туда с PHP
Юра
В го можно обосраться, а в пхп невозможно не обосраться.
Юра
Чуете разницу
Konstantin
в го драматически проще обосраться - утечь памятью, например
Alexander
в го драматически проще обосраться - утечь памятью, например
Утечь памятью в го? У вас возможно неправильный го)
Konstantin
о, ну расскажите мне про правильный го!
Konstantin
я же вижу как люди, пришедшие из стейтлесс-скриптовых языков (даже не обязательно пхп), в принципе не догоняют что надо следить за дескрипторами, ссылками, локальными кешами. это прям открытие для них. я ежедневно, иногда по несколько раз вижу это в пуллреквестах, что нифигасебе, а файлы-то надо закрывать!
Konstantin
да и у довольно опытных людей случаются утечки, гонки и прочие приколы стейтфул-сервисов (которые не мрут после каждого запроса, очищая весь контекст)
Vlad
Для шторма есть плагин на автоимпорт алиасов для атрибутов как для аннотациЙ?
Юра
Что такое автоимпорт алиасов
Vlad
Что такое автоимпорт алиасов
тоже самое для атрибутов
Юра
Крутая штука не знал )
Юра
Че с аттрибутами не работает?
Alexey
hell o
Alexander
Подскажите подход. (ниже скорее псевдо код - поясняющий что хочу). У Entity есть поле, значение которого берется из enum. Как это связать с доктриной - чтоб хранить int? Имеем enum enum TestEnum: int { case TEST1 = 20; case TEST2 = 40; } Имеем entity class TestEntity { private TestEnum $code = TestEnum::TEST1; public function setCode(TestEnum $code): void { $this->code = $code; } } в xml <field name="code" type="integer"/>
Konstantin
в свежую доктрину завезли EnumType
Alexander
[хм
Konstantin
оно всё за вас сделает. но будьте аккуратнее, иногда бывает, что в базе могут быть неожиданные значения (например, 30 в вашем случае) - кто-то руками оставил, и это сломает гидрацию сущности
Alexander
Это в релизной?
Konstantin
да, вполне в релизной
Alexander
сейчас покурю доку
Konstantin
https://www.doctrine-project.org/2022/01/11/orm-2.11.html
Alexander
Спасибо... Ну проект позволяет. Я пока один разраб... И с нарушителями все будет жостко :)
Konstantin
ну тогда обновляйтесь скорее, там еще пару классных штук завезли (подробности вот по этой ссылке и есть)
Alexander
ага... спасибо
Юра
Что-то я запутался с тайпд проперти. Как проверить что тайпд проперти была установлена?
Юра
private ?string $someProp;
Юра
Как мне проверить что она была установлена. isset($this->someProp) вернет же false если она установлена в null
Dmitry
Что-то я запутался с тайпд проперти. Как проверить что тайпд проперти была установлена?
Всегда делать так, чтобы всё было установлено сразу или в конструкторе
Dmitry
private ?string $some = null;
Юра
Вообщем они как всегда лоханулись. Сделали initialized и null разной семантикой, но isset это не учитывает
Юра
Хочешь учитывать, пиши через рефлексию
Юра
Ещё и завернули PR в котором предлагади добавить фцию is_initialized
Alexander
Что то лыжи не едут. Помогите стронуться с места Есть ValueObject namespace App\Domain\ValueObject; class Attribute { public function __construct( private string $number, private \DateTimeImmutable $date ) { } } Есть Entity <?php namespace App\Domain\Entity; use App\Domain\ValueObject\Attribute; class Example { private ?Attributes $attr = null; public function getAttr(): ?Attribute { return $this->attr; } public function setAttr(?Attribute $attr): void { $this->attr = $attr; } } Пытаюсь для сущности описать *.orm.xml Что то туплю, ни как не могу понять, что не улавливаю я в доке. Сейчас такой вариант (без рутовых узлов) <entity name="App\Domain\Entity\Example" table="example"> <embedded name="attr" class="App\Domain\ValueObject\Attribute"/> </entity> <embeddable name="Attribute"> <field name="number"/> <field name="date" type="date"/> </embeddable> Похоже я не разберусь что писать в class, куда писать emdeddable (при некоторых комбинациях просит Attribute.orm.xml Как правильно?
Alexander
Он есть. И он без неймспейсов - возможно это "мешает"
Alexander
По сути я его и взял оттуда
Alexander
А нет ли у кого на примете гитхаб репы проекта на симфонии с архитектурой, которую можно считать близкой к идеалу?
Dmitriy
таких не бывает
Ibray
Жоский запрос)
Dmitriy
всегда будут компроммисы
Alexander
Ну это понятно... я не то что бы прям вот эталон эталон... ну на который "приятно" посомтреть
Юра
У каждого свое понимание приятного
Юра
Самый приятный проект стандартная установка микросимфы )
Юра
Да и кто держит на гитхабе проекты свои
Alexander
ясно... ок
Dmitry
Вообщем они как всегда лоханулись. Сделали initialized и null разной семантикой, но isset это не учитывает
Они лоханулись в том, что оставили возможность существования непроинициализированных полей для обратной совместимости
Юра
Иногда нужны такие полч
Юра
В том же дарте есть late