
Symfony *
Свободный фреймворк, написанный на PHP5
PhpStorm 2019.1: Отладка шаблонов Twig и Blade, поиск мертвого кода, улучшенное автодополнение и многое другое

Привет, Хабр!
Рады представить первый мажорный релиз PhpStorm в этом году!
Обзор релиза можно посмотреть на странице “What’s new”. А под катом дополненный перевод этой страницы с демонстрацией самых интересных новых возможностей.
PHP: изменение стуктуры БД в командной разработке

В мире PHP хорошо известны инструменты миграций структуры БД — Doctrine, Phinx от CakePHP, от Laravel, от Yii — это то первое, что пришло в голову. Наверняка, есть еще с десяток. И большинство из них работают с миграциями — командами для внесения инкрементных изменений в схему базы данных.
Я не буду описывать зачем это, на хабре много постов на эту тему. Например:
- Версионная миграция структуры базы данных: основные подходы — хоть и старая статья, но принципы не стареют
- Эволюционный дизайн баз данных — перевод статьи Мартина Фаулера, хорошее описание [инкрементного подхода]
- Опыт 1440 миграций баз данных — практичный пост по работе с PostgesSQL
Далее, развитие моего опыта работы в команде с постоянным изменением структуры БД в разных ветках.
PHP-Дайджест № 150 (11 – 25 февраля 2019)

Свежая подборка со ссылками на новости и материалы. В выпуске: изменены правила голосования за RFC в PHP Internals, стартовал прием заявок на доклады для PHP Russia 2019, новое расширение для реализации параллельного исполнения кода, свежие материалы для обучения, видео, порция полезных инструментов, и многое другое.
Приятного чтения!
Сериализация данных на уровне базы
Привет, Хабр!
Сидел я как-то и пытался отдать фронту JSON с объектами недвижимости, у которых была масса зависимостей. На бэке стояла Symfony 4, knp pagination и JMSSerializer, ну в принципе стандартные вещи, но проблема в том, что когда ты пытаешься отдать объект со всеми вложенными сущностями и коллекциями, то все начинает тормозить на уровне сериализации этих данных.
Сначала нужно сделать запрос в базу, потом сериализатор подтянет постепенно все остальное, потом все это будет обернуто в JSON и только потом все вернется на фронт.
Идея
У меня появилась идея, а почему бы не возвращать на фронт с бэка сразу JSON напрямую из базы, да, надо написать офигительный SQL, но ведь можно сделать инструмент который это сделает за вас. Я принялся за написание идеи, репозиторий на гитхабе, за основу взята модель данных из доктрины, связи OneToOne, ManyToOne, OneToMany и ManyToMany. Так же этот инструмент легко можно прикрутить к Symfony 4 и он сам себя настроит, в итоге вам нужно будет только заинъектить фабрику QueryBuilderFactory и получить оттуда QueryBuilder для нужной таблицы по классу сущности.
Так же мой сериализатор использует группы сериализации которые вы можете задать с помощью аннотации Expose на поле сущности, не забудьте так же на сущность навесить аннотацию Table и указать алиас таблицы, лучше использовать те, которые вы обычно задаете.
Пример генерации SQL
<?php
use \Mash\MysqlJsonSerializer\QueryBuilder\Table\JoinStrategy\FieldStrategy;
use \Mash\MysqlJsonSerializer\Wrapper\FieldWrapper;
use \Mash\MysqlJsonSerializer\QueryBuilder\Table\Table;
use \Mash\MysqlJsonSerializer\Wrapper\Mapping;
use \Mash\MysqlJsonSerializer\QueryBuilder\QueryBuilder;
$oneToManyTable = (new Table('advert_group', 'adg', 'adg_id'))
->addSimpleField('adg_id')
->addSimpleField('adg_name')
;
$table = (new Table('estate', 'est', 'est_id'))
->addSimpleField('est_id')
->addSimpleField('est_name')
->addOneToManyField($oneToManyTable, 'advert_groups', new FieldStrategy('adg_estate'));
$mapping = new Mapping();
$mapping
->addMap($table, 'est_id', 'id')
->addMap($table, 'est_name', 'name')
->addMap($oneToManyTable, 'adg_id', 'id')
->addMap($oneToManyTable, 'adg_name', 'name');
$builder = new QueryBuilder($table, new FieldWrapper($mapping));
$builder
->setOffset(2)
->setLimit(1);
$sql = $builder->jsonArray();В результате будет сгенерирован следующий SQL:
SELECT JSON_ARRAYAGG(JSON_OBJECT('id',est_res.est_id,'name',est_res.est_name,'advert_groups',(SELECT JSON_ARRAYAGG(JSON_OBJECT('id',adg.adg_id,'name',adg.adg_name)) FROM advert_group adg INNER JOIN estate est_2 ON est_2.est_id = adg.adg_estate WHERE est_2.est_id = est_res.est_id))) FROM (SELECT * FROM estate est LIMIT 1 OFFSET 2) est_resРезультат:
[{"id": 3, "name": "Москва, окская улица, 3к1", "advert_groups": [{"id": 10, "name": "avito-1115362430"}]}]PHP-Дайджест № 146 (10 – 24 декабря 2018) + Итоги 2018 года

По традиции подведем итоги уходящего года и вспомним самые значимые события в мире PHP. И конечно, ссылки на свежие новости, полезные инструменты и интересные материалы за последние две недели.
Под катом вас также ждет розыгрыш лицензий на PhpStorm от JetBrains.
Приятного чтения и с наступающим Новым годом!
Ближайшие события
Symfony Bundle для экспорта статистик в формате Prometheus

Работая над разными микро (и не очень) сервисами, написанными с помощью Symfony, я каждый раз сталкивался с необходимостью экспорта метрик для Prometheus. Поначалу мы просто копировали один и тот же код между проектами, но когда их стало больше трёх, я посчитал, что дальше так продолжаться не может (не буду вас тут утомлять объяснениями, почему это неудобно; думаю, каждый это и сам понимает).
Было решено выделить всё это хозяйство в отдельный бандл: ArtprimaPrometheusMetricsBundle.
Вклад авторов
pronskiy 4929.0spasibo_kep 263.2varanio 254.0AlexLeonov 249.0olegsklyarov 165.0Cutcode 158.9icegreenberry 133.0vsh797 99.0nProfessor 92.0frantic 89.0













