AlkatraZ, да, он имел ввиду 9 строку. Я же пытаюсь понять, зачем КоханийВолодимир в принципе использует классы в своем коде, если его смущает "многословность" при их вызове?
# Delphinum (28.01.2017 / 21:06)
AlkatraZ, да, он имел ввиду 9 строку. Я же пытаюсь понять, зачем КоханийВолодимир в принципе использует классы в своем коде, если его смущает "многословность" при их вызове?
На сегодня РНР внутренне сильно оптимизирован под ООП, выполняет все это очень быстро.
Для примера можно сравнить Джон 6 и Джон 7.
По идее, у 7-ки намного более "тяжелое" ядро, там применены компоненты Zend Framework, все общение идет через DI контейнер. И на первый взгляд все должно работать медленнее.
Однако на практике, все работает как минимум так же, если не быстрее. Просто отжирается больше памяти и все. Но на сегодняшних серверах 1-2 мегабайта памяти не проблема.
В общем, что нужно ORM:
1. Преобразование данных БД -> PHP -> БД
2. Сборка данных из объектов, запись данных в объекты
3. Связи по правилам ООП, а не реляционные
Но обычно для этого нужно реализовать еще:
4. Шаблон UnitOfWork
А зачем нужен именно UoW? Без него разве никак?
Ну т.е понятно зачем он нужен в контексте ORM, однако есть реализации и без него.
Например:
https://github.com/analogueorm/analogue
L!MP, вообще это долгая история, если кратко, то он позволяет отсрочить взаимодействие с БД, это очень важно при использовании модели (DDD на пример).
В остальном, конечно можно без UoW. Для ORM вообще достаточен один шаблон - Hydrator.
# Delphinum (13.02.2017 / 23:39)
L!MP, вообще это долгая история, если кратко, то он позволяет отсрочить взаимодействие с БД, это очень важно при использовании модели (DDD на пример).
В остальном, конечно можно без UoW. Для ORM в
Ну я по сути не вижу особой разницы для кода приложения между:
$entityManager->store($entity); // выполнение транзакции
и
$entityManager->store($entity);
$entityManager->commit(); // выполнение транзакции
Чем второй вариант лучше для DDD?
# L!MP (14.02.2017 / 16:57)
$entityManager->store($entity); // выполнение транзакции
и
$entityManager->store($entity);
$entityManager->commit(); // выполнение транзакции
Тут ты не прав
Транзакция выполняется только в случае $entityManager->commit();
А если по запершении скрипта этой команды не последовало, то должен произойти откат.
то есть
$entityManager->store($entity);
без
$entityManager->commit();
не должен ничего записать в базу.
Иными словами:
$entityManager->store($entity); // Начало транзакции
...
...
// Дофига чего еще может произойти
...
$entityManager->commit(); // Именно тут ВЫПОЛНЕНИЕ транзакции и запись в базу
AlkatraZ, я описал два варианта развития событий, с UoW и без (первый).
В первом варианте данные отправляются в хранилище сразу же при вызове метода не дожидаясь коммита.
# L!MP (14.02.2017 / 23:03)
AlkatraZ, я описал два варианта развития событий, с UoW и без (первый).
В первом варианте данные отправляются в хранилище сразу же при вызове метода не дожидаясь коммита.
Тогда нельзя называть это действие "транзакцией".
С точки зрения базы - это разные понятия.
# AlkatraZ (14.02.2017 / 23:04)
Тогда нельзя называть это действие "транзакцией".
С точки зрения базы - это разные понятия.
Олег, там то же запрос идёт через транзакцию, так как есть же каскадное сохранение связанных сущностей и если что-то пойдет не так, то нужно откатить все изменения.
Разница между двумя вариантами только в том, что в варианте с UoW, всё складывается и сортируется и отправляется в хранилище одной единственной транзакцией при вызове коммит.