Всем доброго времени суток! Удивительно, но упоминание о шаблоне "Спецификация" в контексте php встречается крайне редко. А ведь с его помощью можно не только избежать комбинаторного взрыва методов репозитория, но и улучшить переиспользование кода. Я же в свою очередь хотел бы остановиться на еще одной возможности, предоставляемой данным паттерном. С ее помощью можно решить проблему, которая возникает почти в каждом веб-приложении. И лично мне очень не хватало этого знания еще пару лет назад.
![](http://webcf.waybackmachine.org/web/20210920090929im_/https://habrastorage.org/getpro/habr/hub/d76/d48/02c/d76d4802c9328dc2d23ee0e66e3312e8.png)
Doctrine ORM *
Объектно-реляционный проектор (ORM) для PHP
- Новые
- Лучшие
- Все
- ≥0
- ≥10
- ≥25
- ≥50
- ≥100
Doctrine ResultSetMapping на примерах
![](https://webcf.waybackmachine.org/web/20210920090929im_/https://habrastorage.org/webt/6v/jr/gx/6vjrgxkxjkih5otk5mussb5_cma.png)
Проблемы использования Doctrine ODM в процессах-демонах
Хочу рассказать о своем опыте использования Doctrine ODM в относительно небольшом PHP проекте, в котором основная кодовая база сосредоточена в процессах-демонах. И вообще как мы к Yii2 прикрутили Doctrine ODM. Сразу предупреждаю — рассказ будет очень нудным и скорее всего интересен только тем, кто уже сталкивался с проблемами при работе с Doctrine ODM в процессах-демонах.
Курсоры БД в Doctrine
Используя курсоры, вы сможете порционно получить из БД и обработать большое количество данных, не расходуя при этом память приложения. Уверен, перед каждым веб-разработчиком хотя бы раз вставала подобная задача, передо мной тоже — и не раз. В этой статье я расскажу, в каких задачах курсоры могут быть полезны, и дам готовый код по работе с ними из PHP + Doctrine на примере PostrgeSQL.
Замечательная аннотация Version в JPA
Введение
Итак, начнем! Что же означает аннотация Version в JPA?
Если коротко, то она отвечает за блокировки в JPA. Данная аннотация решает одну из проблем, которые могут возникнуть в результате параллельного выполнения транзакций.
Какие же могут возникнуть проблемы?
- Потерянные обновления могут возникнуть в ситуациях, когда две транзакции, выполняющиеся параллельно, пытаются обновить одни и те же данные.
- Грязные чтения возникают, когда транзакция видит еще не сохранённые изменения, сделанные другой транзакцией. В таких случая может возникнуть проблема из-за отката второй транзакции, но при этом данные уже были прочитаны первой.
- Неповторяемые чтения возникают, когда первая транзакция получила данные, а вторая транзакция внесла в них изменение и успешно закоммитила их, до окончания первой транзакции. Иначе говоря, когда в рамках одной транзакции один и тот же запрос на получение, например всей таблицы, возвращает разные результаты.
- Фантомное чтение — проблема похожая на неповторяемые чтения, за тем исключением, что возвращается разное количество строк.
Коротко о их решениях
- READ UNCOMMITED — решается с помощью аннотации Version в JPA(об этом как раз и статья)
- READ COMMITED — позволяет читать только закоммиченные изменения
- REPEATABLE READ — тут немного посложнее. Наша транзакция «не видит» изменения данных, которые были ею ранее прочитаны, а другие транзакции не могут изменять тех данных, что попали в нашу транзакцию.
- SERIALIZABLE — последовательное выполнение транзакций
Каждый последующий пункт покрывает все предыдущие, иначе говоря может заменить решения, указанные ранее. Таким образом SERIALIZABLE имеет самый высокий уровень изолированности, а READ UNCOMMITED — самый низкий.
Реализация стейтмашины на Zend Framework3+Doctine2
Введение: зачем нужна стейтмашина
В приложениях часто необходимо ограничивать доступ к тем или иным действиям над объектом. Для этого используют RBAC-модули, которые решают задачу ограничения доступа в зависимости от прав пользователя. Остается нерешенной задача управления действиями в зависимости от состояния объекта. Эта задача хорошо решается с помощью конечного автомата или state machine. Удобная стейтмашина позволяет не только собрать в одном месте все правила переходов между состояниями объекта, но и наводит некоторый порядок в коде отделяя правила переходов, проверки условия и обрабочкики и подчиняя их общим правилам.
Хочу поделиться реализацией стейтмашины под Zend Framework 3 с использованием Doctrine 2
для работы с базой данных. Сам проект можно найти по ссылке.
А здесь я хочу поделиться основными заложенными принципами.
Использование событийной модели в Doctrine 2 + Symfony 3
Давайте представим ситуацию: у вас есть заказ в интернет магазине (Entity). Заказ имеет некий статус. При смене статуса заказа необходимо провести кучу сопутствующих действий, например:
- сохранить в заказе дату последнего изменения
- записать в историю по заказу информацию о смене статуса
- отослать письмо / sms клиенту
- вызвать метод API службы доставки / платежной системы / партнера и т.д.
Возникает вопрос как все это правильно организовать с точки зрения программного кода.
Все ниже описанное справедливо для Doctrine 2 и Symfony > 3.1
DDD на практике. Проектирование списка желаний
В интернете довольно много разрозненного материала по DDD. Если не считать синей книги, то в основном это короткие статьи с теорией, надёрганной из этой же книги, и которая мало пересекается с практикой. Возможно, конечно, что я просто плохо искал, но мне давно хотелось найти какой-нибудь цельный пример, что называется, «от и до». И я решил такой пример создать на Symfony 3 и VueJS. Сразу хочу сказать, что я изучаю DDD недавно, поэтому взял довольно простую предметную область — список желаний (wish list).
Джентльменский набор Doctrine 2 для Symfony 3.3.6: Создание сущности, ассоциации и рекурсивные связи
![](https://webcf.waybackmachine.org/web/20210920090929im_/https://habrastorage.org/web/0c8/14d/ea6/0c814dea68094b53be644740de1d3419.jpg)
Доброго дня, читатель!
Что мы будем делать с вами по ходу чтения статьи
- Создадим простые сущности
- Немного поговорим об ORM аннотациях
- Реализуем ассоциации:
- Двунаправленные связи Один к Одному
- Двунаправленные связи Один ко Многим
- Двунаправленные связи Многие ко Многим
- Рекурсивные связи
- Поиграемся этими сущностями с помощью фикстур
Doctrine Specification Pattern или ваш реюзабельный QueryBuilder
Давайте представим себе базовый кейс:
- У нас есть: сущность «Дом», сущность «Квартира в доме», сущность «Застройщик», сущность «Регион».
- У нас есть задача: иметь возможность получить всех застройщиков, иметь возможность получить все занятые регионы застройщиком, уметь возможность получить все дома, которые принадлежат застройщику и все доступные регионы вообще в принципе, где ведутся продажи домов.
- У нас есть правила от бизнеса:
ЧПУ (SEF URLs) в Symfony 3 — автогенерация slug, настройка и маршрутизация
Третьего дня мне понадобилось провести блиц вебинар на тему ЧПУ в Symfony. Вообще время вебинара у меня ограничено двумя часами, при этом я должен был рассказать еще и про автогенерацию CRUD функционала (scaffolding) в той же Symfony, и про простейший способ создать постраничность. Это создало проблему, так как я знаю как сделать ЧПУ «ручками», не прибегая к автоматизированным под эту задачу инструментам, но рассказ получился бы долгий и оказались бы затянутыми в обсуждение лишние темы. Поэтому я пошел спрашивать у Интернета как сделать все проще. И вот я оказался в той редкой ситуации, когда такая популярная платформа как Symfony не имеет банального обучающего материала на тему «ЧПУ в три клика». Смотрел так же и на английском языке, но там тоже пусто (может плохо искал — время было ограничено). В общем я справился с поиском разрозненного материала по данной теме, а так же со сбором его в единое повествование, так что почему бы не поделиться со всеми?
![](https://webcf.waybackmachine.org/web/20210920090929im_/https://habrastorage.org/web/d6e/bb1/461/d6ebb1461cfa408e9b472f0d3486e69b.jpg)
ORM на php для MySQL, реальность (часть первая)
Библиотека по моему видению должна иметь два файла (по крайней мере на начальных этапах):
- файл библиотеки — kitty.php;
- файл объектного изображения модели базы данных — modeldb.php.
Создание блога на Symfony 2.8 lts
Фильтрация данных в Symfony
Всем любителям Symfony известно что в ней нету компонента фильтр.
Есть замечательные и удобные Constraints и даже была попытка создать на подобии их фильтры issue на Github, но никто так и не взялся это сделать.
Когда я в очередной раз столкнулся с задачей фильтрации большого количества данных, полученных от пользователя, я понял что пора решить задачу фильтрации как то более глобально/красиво/удобно.
Symfony2 Voters и Doctrine Filters на страже безопасности
Вклад авторов
-
antoscenco-vladimir 60.0 -
livinbelievin 34.0 -
VeXell 25.0 -
debesha 24.0 -
knplabs 20.0 -
flashyua 18.0 -
RAZZOR 18.0 -
OmeZ 17.0 -
Hett 16.0 -
php_freelancer 15.0