Вадим
Не понимаю о чём ты
ну в аргумент результат складывать
Вадим
Не понимаю о чём ты
или что значит "закидыввать контекст в метод". В метод можно закинуть аргумент.. или я не понимаю
Михаил
ну в аргумент результат складывать
Да. Ты создаешь некий dao. Называешь его CalulationContext или CalculationCommand. В нём 3 метода. getA getB (их метод будет использовать для расчётов) и setResult и getResult (setter вызовется внутри метода, а геттер дёрнет вызывающий) Ну и всё.
Михаил
или что значит "закидыввать контекст в метод". В метод можно закинуть аргумент.. или я не понимаю
Всё равно не понимаю что тебе не понятно. Если ты про то что я путаю местами аргументы и параметры, то я рот их ебал. У меня всё аргументами является. Что внутри метода, что снаружи
Вадим
вообще
Вадим
то у тебя три метода, то 4
Вадим
(setter вызовется внутри метода, а геттер дёрнет вызывающий) а об это вообще моск сломал
Михаил
Ща я тебе код накидаю
Вадим
:-*
Павел
привет! Надо посчитать в сервисе несколько значений. как православнее: отдать результат в dto или можно геттерами из сервиса поспрашивать?
Сервис все же про стейтлесс + может лежать в DI единственным экземпляром, так что отдавать что то из сервиса через геттеры, как то странно звучит
Михаил
сори, я нихуя не понял :)
<?php class DivModCommand { public ?int $div = null; public ?float $mod = null; public function __construct(private readonly int $dividend, private readonly int $divisor) { } public function getDiv(): int { return $this->div ?? throw new RuntimeException('Div result is not defined'); } public function getMod(): int { return $this->mod ?? throw new RuntimeException('Mod result is not defined'); } public function getDividend(): int { return $this->dividend; } public function getDivisor(): int { return $this->divisor; } public function setResult(int $div, float $mod): void { if ($this->div !== null || $this->mod !== null) { throw new RuntimeException('Unable to redefine diff re'); } $this->div = $div; $this->mod = $mod; } } class CaluclationService { public function calulateDivMod(DivModCommand $command): void { if ($command->getDivisor() === 0) { throw new DomainException('The divisor cannot be zero'); } $div = intdiv($command->getDividend(), $command->getDivisor()); $mod = fmod($command->getDividend(), $command->getDivisor()); $command->setResult(div: $div, mod: $mod); } } $calculator = new CaluclationService(); $command = new DivModCommand(10, 3); $calculator->calulateDivMod($command); var_dump($command->getDiv(), $command->getMod()); // int(3) int(1)
Михаил
Скрином если версия телеги старая
Юра
Сейчас же модно ФП, чистые фции и все такое
Юра
Ты передаешь какой-то объект из которого читаешь и пишешь в него. Это затрудняет понимание кода. При попытке вызвать фцию с тем же контекстом второй раз могут быть баги (контекст нужно ресетить)
Юра
Фция должна быть защищена от возможных проблем с многопоточностью (в пхп не сильно актуально но а других ЯП актуально)
Павел
Да, в целом профит не особо понятен, зачем делать void и объединять запрос-ответ в один объект
Apxat
да если охота фп то лучше взять фп язык
Apxat
тот же эликсир
Вадим
Ты передаешь какой-то объект из которого читаешь и пишешь в него. Это затрудняет понимание кода. При попытке вызвать фцию с тем же контекстом второй раз могут быть баги (контекст нужно ресетить)
согласен про понимание Я поэтому и спросил про передачу аргумента по ссылке, раньше модно было в функцию передать аргумент по ссылке и туда же сложить часть результата, а ещё часть результата вернуть результатом функции. Чтобы вообще нихуя не понятно было :)
Kirill
Раньше == во времена пхп 4, просто потому что объекты по значению передавались всегда, а не по указателю как сейчас
Kirill
У кого?
Павел
согласен про понимание Я поэтому и спросил про передачу аргумента по ссылке, раньше модно было в функцию передать аргумент по ссылке и туда же сложить часть результата, а ещё часть результата вернуть результатом функции. Чтобы вообще нихуя не понятно было :)
На счет модно хз, но если брать объекты, то в целом рабочая тема, но все же по контексту задачи. Типа : $queryBuilder = new qb(); $this->applyConditon($queryBuilder); $this->applyFilter($queryBuilder); $this->applyPagination($queryBuilder) Хотя если объект имутабельный, уже такое не провернуть
Вадим
у динозавров
Kirill
У тех кто до сих пор на пхп4, да, осталась
Kirill
Благо они гитхаб не осилили, как и композер)
Kirill
Так что вымерли
Вадим
я заехал на 5й пых и в 7м и даже иногда в 8м ещё такое видел
Вадим
ничо они не вымерли
Павел
Можно сделать иммутабельным, не проблема
Сделать то можно, но уже такой код не провернуть ) надо полюбому возврашать результат
Павел
Ну хотя, если передавать через амперсанд объект...
Kirill
Чуваки тормозят gc и добавляют оверхед с созданием нового zval ради непонятно чего
Вадим
На счет модно хз, но если брать объекты, то в целом рабочая тема, но все же по контексту задачи. Типа : $queryBuilder = new qb(); $this->applyConditon($queryBuilder); $this->applyFilter($queryBuilder); $this->applyPagination($queryBuilder) Хотя если объект имутабельный, уже такое не провернуть
тут да, от задачи конечно, все знают что такое $queryBuilder и что если так написано то его конечно мутировали там куда передавали. А если это какой-то кастомный объект то пока не посмотришь чо там с ним делают то нивжисть не узнаешь, потому сам стараюсь так не делать и дтошки у меня все иммутабельные, воизьбежании
Dima
Кто-нибудь значет почему я в форме не могу сохранить <iframe></iframe> но спокойно <a></a> или <p></p>, то есть при iframe передается просто null?
Dima
Пытался через DataTransformerInterface экранировать но и там уже передается null
Dima
точно
The Ant
Или нечто похожее, со списком разрешенных тегов
Dima
purify_html был включен
Михаил
Ты передаешь какой-то объект из которого читаешь и пишешь в него. Это затрудняет понимание кода. При попытке вызвать фцию с тем же контекстом второй раз могут быть баги (контекст нужно ресетить)
Чот на самом деле так и не понял где тут трудность в понимании. С точки зрения клиентского кода вы заполняете команду и получаете ответы (ключевое слово, так как речь шла о кейсе когда несколько значений нужно получить). С точки зрения сервиса тоже всё просто - взял параметры, записал результат.
Михаил
Да, в целом профит не особо понятен, зачем делать void и объединять запрос-ответ в один объект
Потому что результатов по условию задачи может быть несколько. Тем более объединяя всё в единый контекст ты получаешь профит в тех случаях когда запросить результат надо несколько раз, а потом с ним работать. У тебя будет объект из которого ты сразу будешь делать выводы: вот аргументы и вот результат который я получу с ними
Михаил
Сейчас же модно ФП, чистые фции и все такое
Про чистые функции - ну она чистая
Вадим
но опять же почему не два разных :)
Михаил
Зачем плодить ссущих
Павел
Зачем плодить ссущих
чтобы у врачей была работа
Михаил
Спасибо телеграмму
Михаил
я писал ответ, отошёл на 3 минуты дверь открыть - сообщение пропало
Михаил
Это всё из-за ваших - а Чо Бы Не ХрАнИтЬ РеЗуЛьТаТ в ОтДеЛьНоЙ dTo?
#lest
Нормально делать dto из request для сервиса, и чтобы сервис возвращал свой dto для response?
Михаил
Короче я писал про то что можно как угодно делать - важно единообразие. Вцелом фишка с тем что вместо calсulateDivMod($a, $b) делать calсulateDivMod(DivModContext $context) тоже нет особого смысла - но если так решили делать на проекте, то нужно придерживаться
Михаил
Более того делают так, что в контроллер сразу приходит DTO вместо реквеста
Михаил
Фция должна быть защищена от возможных проблем с многопоточностью (в пхп не сильно актуально но а других ЯП актуально)
и про потокобезопасность тоже не понял. Как в моём примере могут появиться сайд эффекты? И почему при возврате dto они ТоЧнО не появятся?
#lest
Где хранить столько dto, если в отдельной папке DTO то их наплодиттся куча, если в папке контроллера то будет каша
#lest
Я храню Action, Validator и Handler который вызывает сервис из di по интерфейсу
Михаил
Я храню Action, Validator и Handler который вызывает сервис из di по интерфейсу
Вот https://symfony.com/blog/new-in-symfony-6-3-mapping-request-data-to-typed-objects
#lest
Это без symfony, slim php +php-di
Михаил
В последней симфе даже появилось
Apxat
как обычно принято сделать нормальную коллекцию объектов чтобы получать объекты и шторм понимал что он получает без всяких phpdoc
Apxat
только через phpdoc ?
The Ant
Да
Apxat
а всякие велосипеды типо add, get не очень правильно ?