Юра
Еще можно использовать сервис сабскрайбер
Юра
И получать сервис который тебе нужен когда он тебе нцжен
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
Konstantin
не, чот плохо у вас всё 🙂
Konstantin
FooService и BarService я вообще просто так туда пихнул, чтобы показать что это мол сервис с зависимостями, а не просто какой-то класс с конструктором
мой пойнт в том, что если сделать создание всех сервисов максимально лёгким (то есть не делая в конструкторе никакой работы), то можно не париться о количестве этих сервисов и ссылок на них, они все будут иметь околонулевой оверхед
Юра
Konstantin
я чую там от недостатка понимания возникли тревоги, не особо подкрепленные данными
Denis
Konstantin
в общем, попытайтесь уловить мой посыл с легкой инициализацией, это куда полезнее, чем экономить на спичках ценой усложнения кода
Юра
Если хочется узнать больше, открываешь папку var/cache и там будет скомпилированный контейнер
Юра
Можешь поизучать сразу понятно станет
Denis
Иван
Konstantin
вово
Иван
и значительно проще обосраться, в том числе по производительности, на задачах типа той, что чуть выше рассмотрели
на аудите обновления
Denis
Konstantin
о, экспертиза пошла
Иван
типа в го нельзя обосраться по производительности?
Denis
Юра
В го можно обосраться, а в пхп невозможно не обосраться.
Юра
Чуете разницу
Konstantin
в го драматически проще обосраться - утечь памятью, например
Alexander
Konstantin
о, ну расскажите мне про правильный го!
Konstantin
я же вижу как люди, пришедшие из стейтлесс-скриптовых языков (даже не обязательно пхп), в принципе не догоняют что надо следить за дескрипторами, ссылками, локальными кешами. это прям открытие для них. я ежедневно, иногда по несколько раз вижу это в пуллреквестах, что нифигасебе, а файлы-то надо закрывать!
Konstantin
да и у довольно опытных людей случаются утечки, гонки и прочие приколы стейтфул-сервисов (которые не мрут после каждого запроса, очищая весь контекст)
Vlad
Для шторма есть плагин на автоимпорт алиасов для атрибутов как для аннотациЙ?
Юра
Что такое автоимпорт алиасов
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
Nikolay
Alexander
Он есть. И он без неймспейсов - возможно это "мешает"
Alexander
По сути я его и взял оттуда
Alexander
А нет ли у кого на примете гитхаб репы проекта на симфонии с архитектурой, которую можно считать близкой к идеалу?
Dmitriy
таких не бывает
Ibray
Жоский запрос)
Dmitriy
всегда будут компроммисы
Alexander
Ну это понятно... я не то что бы прям вот эталон эталон... ну на который "приятно" посомтреть
Юра
У каждого свое понимание приятного
Юра
Самый приятный проект стандартная установка микросимфы )
Юра
Да и кто держит на гитхабе проекты свои
Alexander
ясно... ок
Игорь
Игорь
Юра
Иногда нужны такие полч
Юра
В том же дарте есть late