Shurik, ну типо того, кто первый прочитал сущность, у того права её редактировать, а все остальные получать блокировку. Конечно вы должны исключить обходные пути, если такие у вас имеются.
Не, в доктрине всё оборачивается в одну транзакцию при выполнение flush. И вот внутри неё, доктрина не всегда сможет правильно разрулить её и вызвать исключение от самой БД (если конечно вы позаботились, чтобы ваши данные были всегда консистентные).
Например не правильный порядок удаление данных из разных таблиц, вызовет исключение по внешнему ключу.
Такие проблемы решаются либо разбиением на несколько транзакций (два и более flush), что в общем не правильно, либо ручками пишется транзакция.
А вот то, доктрина позаботиться о порядке операций, это верно лишь на 90%, 10% баги, когда доктрина не понимает порядок и нужно ручками делать. Обычно доктрина не может справиться с очередностью, если нужно в определённом порядке изменить одну и туже сущность
Encoders, ну так пихаете в DTO и в валидатор, дальше всё сделает симфони.
Не может быть данных без типов, максимум массивы, но и их можно провалидировать на нужные типы.
sgidlev, contains срабатывает только в 1 случае, - когда известен первичный ключ.
А он может быть известен только при 2 условиях
1. Вы сами генерируете ключ
2. Вы используете ManyToMany или композитный ключ.
Ваша переменная $roomOwnerExist, что сейчас, что до этого ($renterExists) делает лишнее действие.
Вам она не нужна, вы можете в foreachв if сразу выполнять что нужно и потом вызывать return.
Вообще-то JS - это плохой выбор среди языков программирования - самое дно.
Если вам кто-то посоветует идти в JS - плюньте ему в лицо. Я не знаю другого языка, в котором было бы столько фреймворков и библиотек на решение одной и той же задачи.
Если в php всего 3 основных фрейморвка (на самом деле 2, yii уже почти сдал все позиции, только легаси), то в любой другом языке смело умножайте это значение на 3, а в JS вообще на все 5 или даже 10.