@phpclubru

Страница 247 из 956
Alexey
20.06.2017
08:05:48
экзит прекратит весь скрипт

Roman
20.06.2017
08:05:58
круто

Чёрт. Я уже говорил, что было бы здорово сюда пригласить карма бота? чтобы считал благодарности

Google
Alexey
20.06.2017
08:11:20
главное не благодарности, а качественный и рабочий софт :)

Roman
20.06.2017
08:30:25
Ребята, возникла ситуация, где необходимо данные объекта впихнуть в ассоциативный массив

Вот есть у меня к примеру класс Ticket с его полями (протект переменными): $id_ticket $sender_id $text

Стоит задача сделать элегантно быстро и надёжно в массив вида: $insert['id_ticket'] $insert['sender_id'] $insert['text']

Просто у меня готовый метод, который отправляет в бд запрос update и insert, где не нужно вручную перечислять вводимые поля и их данные, я тупо вставляю туда массив, в котором его ключи - это название поля в бд, а его значение - значение поля в бд

Спасибо

$a = new A(); // Создали некий объект A $a = (array) $a; // Превратили объект в массив Только не говорите, что это было так просто?

главное не благодарности, а качественный и рабочий софт :)
почему все всегда закрывают свойства объектов?

Дописывая к ним отдельно сеттеры и геттеры

Adel
20.06.2017
08:49:09
я вообще делаю только геттеры :)

когда обьект не меняется - все проблемы исчезают

единстенное где надо сеттер - это сущности.

Google
Adel
20.06.2017
08:49:50
но там тоже надо крайне аккуратно. чтобы непонятно кто не менял

Roman
20.06.2017
08:50:01
Наверное, под сущностями вы имели ввиду DTO :)

Adel
20.06.2017
08:50:09
нет. бизнес сущности

DTO должны создасться раз и все

надо новую - создай новую

Roman
20.06.2017
08:51:14
Data Transfer Object?

Adel
20.06.2017
08:51:56
Deployment Transaction Object

Andrey
20.06.2017
09:01:06
Ну с phpconf врядли ;-)
ok, я имел ввиду devconf

Adel
20.06.2017
09:02:30
ok, я имел ввиду devconf
видео записаны. монтаж займет около месяца. не знаю почему так долго. а дальнейшая судьба неизвестна

Roman
20.06.2017
09:06:40
то есть вот прям совсем не надо открывать свойства?

Даже если я тупо создаю объект на один раз

Adel
20.06.2017
09:07:58
ну.. если почитаешь про immutable, то вероятно почерпнешь многое. реактовый главный хранитель данных - redux - хранит неменяемые данные. каждый раз создает новую копию.

Alexandr
20.06.2017
09:08:09
ok, я имел ввиду devconf
https://devconf.ru/ru/members/pay

Adel
20.06.2017
09:08:10
датывремя обьекты.. все переходят на иммутабельные

VO обьекты всегда делают иммутабельными.

Потому что если это адрес - страна, город, улица дом, то поменять в нем даже если дом - то это будет уже ДРУГОЙ адрес.

т.е. должен быть другим обьектом

менять можно свойства обьектов, если это реально по логике.

Roman
20.06.2017
09:09:54
Всегда - это кто? Они не обязаны быть иммутабельными, плюс по бизнес-логике данные могут меняться

Adel
20.06.2017
09:10:03
человек поменял имя - значит можно менять...

Google
Roman
20.06.2017
09:10:27
Иммутабельность подразумевает, что мы не можем свойства менять

Roman
20.06.2017
09:10:30
я создаю объект класса, он ещё с пустыми свойствами. Задача - заполнить свойства данными, а потом заюзать метод save что-то типо: $ticket = New Ticket(); $ticket->id_ticket = 2; $ticket->text = 'sadgdsgsdg'; $ticket->save();

Adel
20.06.2017
09:12:26
ну Ticket то у тебя обьект логики.. там то можно. Но если прям уж чотко по DDD то создавать ты должен както так:

Roman
20.06.2017
09:12:28
И всё, этот объект по сути можно удалять к чертям

Adel
20.06.2017
09:12:40
Ticket::create(2, 'sfsfd');

потому что пока ты сделал только new и свойства не заполнил, у тебя какойто невалидный тикет..

Roman
20.06.2017
09:13:05
Это значит, что я долеж описать метод create

и там в параметрах указывать по порядку поля?

public function create(id, text)

Adel
20.06.2017
09:13:35
да. но если их много, то хзначит надо создавать некие валуе обьекты :)

static*

Roman
20.06.2017
09:13:54
да, static упустил

Просто хочется сделать так, чтобы в случае изменения свойств вообще

логики

может быть в будущем надо будет убрать свойство text

а добавить два свойства oikakbolnojit и nadonyshke

То чтобы минимизировать изменение кода

впрочем, это всё равно только хуже станет, я уже понял

Google
Adel
20.06.2017
09:20:30
так то да. Но до save - этот обьект невалидный

Roman
20.06.2017
09:20:31
То есть до этого момента всё равно никакого толка с объекта. А вот в момент save происходит запись в бд, вот там и можно сделать проверку валидности

Adel
20.06.2017
09:20:37
он может попасть в другие функции.. и там юзаться...

есть такая теоретическая возможность

Roman
20.06.2017
09:20:59
Adel
20.06.2017
09:21:04
он может попасть тужда через год.. когда логику ктото поменяет :)

Roman
20.06.2017
09:21:07
я где-то что-то забыл и впихнул... неосторожно

этим кто-то по идее буду только я

раньше я просто с контроллера паковал всё в массив $insert['text'] = 'sdgdsg';

Admin
ERROR: S client not available

Roman
20.06.2017
09:22:44
2 хороших статьи по теме: https://habrahabr.ru/post/268371/ https://habrahabr.ru/post/275599/

Roman
20.06.2017
09:22:58
и процедурно вызывал Ticket::save($insert)

но процедурное использование класса - не зашквар ли это?

Рассудите, бывалые

Adel
20.06.2017
09:23:32
ну смотри

Roman
20.06.2017
09:23:33
Что такое "процедурное использование класса"?

Roman
20.06.2017
09:23:48
Adel
20.06.2017
09:23:54
если ты сумеешь сделать так, чтобы этот обьект был всегда валидным, то его сохранение в базу можно вынести

$ticketRepository->save($ticket);

Roman
20.06.2017
09:24:59
Понял

Google
Roman
20.06.2017
09:25:18
сеттеры юзают для того, чтобы не просто установить значение, а ещё и проверить валидность данных

$ticket-id_ticket = 'lol ty lolka'

Adel
20.06.2017
09:25:36
да. но это такой.. уже DDD стиль..

Roman
20.06.2017
09:25:49
раньше я просто с контроллера паковал всё в массив $insert['text'] = 'sdgdsg';
Суть всяких DTO, Entity и прочих POCO как раз в том, чтобы не использовать такие массивы вроде insert. Ты везде в коде использвуешь дата-object, и только при передаче/сохранении/получении сериализуешь их во что-то еще

Roman
20.06.2017
09:25:50
и всё, у меня там, где должен быть число, стоит текст

а в сеттере можно сразу и вывод ругательства сделать

Roman
20.06.2017
09:26:18
Содержать логику в сеттере нежелательно

У тебя может быть невалидный data-object

$object = DataObject::parse($data); $validator->validate($object);

Adel
20.06.2017
09:27:08
да. эти правила для DTO.

но мы говорим об Entity

это немного другой мир

Roman
20.06.2017
09:27:20
Я не про DTO, я про POCO в целом

Entity отличается от DTO только тем, что содержит идентификатор и может содержать логику

Roman
20.06.2017
09:28:36
а я ещё и намутил тут воды

Roman
20.06.2017
09:28:43
Но если следовать принципам SOLID, то логику в Entity стоит свести к необходимомму для работы с данными минимуму или вынести вообще

Roman
20.06.2017
09:28:45
если например не установить свойство id_ticket

то метод save добавит в БД запись

а если указать, то обновит по иду

Roman
20.06.2017
09:29:27
Ну ActiveRecord - удобный паттерн, когда у тебя мало кода, но нарушает принципы SOLID

Roman
20.06.2017
09:30:06
Есть какая-нибудь дельная литература?

По тому, что вы перечислили

Страница 247 из 956