Как стать автором
Поиск
Написать публикацию
Обновить
11.6

Symfony *

Свободный фреймворк, написанный на PHP5

Сначала показывать
Порог рейтинга
Уровень сложности

По локоть в легаси: пошагово перезапускаем устаревший портал на PHP

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров14K

PHP — один из самых популярных языков веб-разработки уже около 20 лет, а самому языку скоро стукнет 30. За это время на нем написали огромное количество больших и маленьких проектов. Некоторые сайты, созданные в 90-х, 00-х и 10-х, хранят код еще с тех давних времен. И чем больше времени проходит с начала разработки, тем меньше на рынке специалистов, готовых разбираться в легаси и не самых современных технологиях.

В похожей ситуации оказался портал fishingsib.ru — один из крупнейших в рунете сайтов о рыбалке, который посещают больше 10 000 человек ежедневно. Он создавался в начале 2000-х как форум для рыбаков-любителей и пережил несколько довольно серьезных обновлений кодовой базы. Последнее из них — переезд на CakePHP 2 в 2012 году. На этом фреймворке и PHP 5 сайт жил до 2017 года.

Владелец fishingsib.ru планировал поддерживать и развивать сайт, внедрять новую функциональность, однако столкнулся с техническими проблемами. Любые доработки были очень долгими из-за неудачных архитектурных решений и сильной зависимости от устаревающего и не особенно популярного CakePHP 2. После каждого обновления появлялось множество багов. В то же время не удавалось найти новых разработчиков, потому что большинство специалистов не хотели работать в проекте с неактуальным стеком. Развитие проекта сильно замедлилось и стало понятно, что с технической частью нужно что-то делать.

Читать далее

Использование Symfony / PHP (II)

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров7.1K

Привет! Я, Андрей, Symfony разработчик - мы делаем сайты. Каждый день мы тратим много ресурсов на администрирование и базовые настройки проектов. В этой статье я продолжаю делиться опытом, как можно адаптировать фреймворк Symfony под свои нужды. Сегодня я расскажу как мы работаем с базой данных и Doctrine. Поехали

Читать далее

Типичный Swagger без гмо

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров12K

Кто из нас не был одурманен сказками про свагер? Мол, добавь эту волшебную штуку — да заживешь! Но плата за магию — зеленое болото нотаций. А нельзя ли обойтись только типизацией самого php? (Спойлер: онжом)

Читать далее

Реализация SOLID на примере

Уровень сложностиСложный
Время на прочтение3 мин
Количество просмотров9.1K

Рассмотрим на простом и наглядном примере реализацию SOLID на Symfony. Будет так же ссылка на Github. Допустим, нужно реализовать импорт товаров из внешнего сервиса...

Читать далее

Symfony под капотом: Symfony Messenger и механизм повторной обработки сообщений при ошибках

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров8K

При работе с интеграциями мы часто имеем дело со сбоями в сторонних сервисах, и нам очень важна возможность восстановления после таких ошибок.

В этой статье я расскажу о том, как в Messenger-компоненте Symfony устроен механизм повторной обработки сообщений при ошибках (или по-простому – механизм ретраев), а также поделюсь опытом его использования и некоторыми важными нюансами его работы.

Читать далее

Наводим порядок в наших миграциях

Время на прочтение4 мин
Количество просмотров4.1K

Миграции баз данных — это отличный способ безопасно обновить схему базы данных. Это именно то, что нам нужно в продакшене, ведь терять имеющиеся там данные крайне нежелательно. В этой статье я хочу поделиться с вами советом, который поможет навести порядок в ваших миграциях. Конечно, стоит сразу оговориться, что это представляет проблему в основном для локальной разработки: на продакшене нас не очень волнует, сколько файлов миграции было выполнено в прошлом.

Читать далее

Загрузка ассоциаций по запросу в Symfony

Время на прочтение5 мин
Количество просмотров4.5K

Всех приветствую!

Стандартно Doctrine загружает сущности отложено (Lazy load). Это означает, что данные взаимосвязей фактически не загружаются до тех пор, пока не будет явный вызов свойства. Механизмы Doctrine позволяют изменить поведение и загружать связи во время запроса к родительской сущности (fetch:'EAGER'), однако это не совсем подходит для динамической загрузки ассоциаций по запросу.

В статье я бы хотел поговорить о том, как реализовать функционал загрузки ассоциаций по запросу средствами Symfony, на примере (не)выдуманной задачи.

Читать далее

Вы вообще нормальн… нормализованный??

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров5.6K

Сказ о том, нормализация данных завела производительность many-to-many в postgres в тупик, как это зло было повержено, и как тут нам помог Clickhouse.

Порой бывают ситуации, когда стоит посмотреть на задачу будто с нуля и отбросить предыдущий опыт и best practices. Подумать на несколько шагов вперёд. И лучше до того, когда уже вышли из SLA или нахватали негатива от клиентов или бизнеса. Об одной такой задаче и стандартном решении, которое пришлось больно редизайнить, хочется и поделиться с сообществом в этой статье.

Читать далее

Как мы планировали повысить версию PHP за месяц, а потратили на это год

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров27K

Как и множество больших сервисов, Яндекс Еда основана на микросервисной архитектуре. В общей сложности у нас чуть больше 200 микросервисов. Но есть один сервис, который совсем не микро – легаси-монолит.

Он написан на PHP 7.2 разработчиками разного уровня и в разное время. Мы подумали, что так больше нельзя, и решили навести порядок. В ходе разбирательств выяснилось, что версия языка, на котором всё написано, устарела и уже не поддерживается, что ведёт к рискам безопасности. Делать нечего — мы приняли решение обновиться до 8-й версии.

В этой статье я расскажу, чего стоило нам проапгрейдить монолит, сколько тестов мы сломали и как в этом проекте поучаствовали почти все PHP-разработчики Яндекс Еды. Это интересный и уникальный опыт, которым я хотел бы с вами поделиться. В конце дам несколько советов тем, кто тоже захочет ввязаться в подобную авантюру.

Читать далее

EasyAdmin и Mercure: реальный юзкейс

Время на прочтение8 мин
Количество просмотров4.3K

EasyAdmin — один из самых популярных генераторов административных панелей, доступных для Symfony-приложений. Поскольку для аутентификации пользователей он использует стандартный компонент безопасности Symfony, он позволяет входить в систему и изменять данные множеству пользователей одновременно. Но есть одна проблема…

Читать далее

Symfony Json RPC API Bundle — простое API со всем необходимым

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров3.1K

Как легко и быстро развернуть API на фреймворке Symfony с уже встроенной валидацией и авторизацией по токену?

Можно воспользоваться бандлом для Symfony 6+

Посмотреть на packagist

Посмотреть на gitflick

Читать далее

Гайд 2023 Xdebug в PHPSTORM + Virtual server + Docker для macOS с пробросом портов

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров6.2K

Предварительно необходимо убедиться, чтобы в контейнере под php-fpm у вас был пакет Xdebug. Нужно либо установить в ручную, либо зашить в Dockerfile - конечно же второе будет лучше, т.к не придется при перезапуске делать одно и то же действие с установкой.

Мой DockerFile пример с командами установщика

Читать далее

Как написанный на Symfony Kbin покоряет Threadiverse

Время на прочтение7 мин
Количество просмотров1.8K

Из-за недавнего скандала с Reddit и его недальновидным CEO опенсорсные альтернативы сейчас переживают настоящий бум. И kbin — это как раз такая Fediverse-платформа, созданная с применением Symfony, API Platform и Schema Generator 3 Эрнестом Вишневски (Ernest Wiśniewski). Это именно то, на что вам нужно обратить свое внимание в первую очередь, если вы больше не хотите поддерживать самодуров, управляющих Reddit.

Читать далее

Ближайшие события

Использование ICU Message Format в PHP

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров3.8K

Недавно я узнал про довольно интересный инструмент, встроенный в РНР. Оказывается, в языке нативно поддерживается универсальный формат шаблонов для сообщений, ICU Message Format. В частности, он используется в Symfony Translation Component и в системе интернационализации фреймворка Yii 2. Однако этот функционал доступен и сам по себе, в чистом РНР. И может использоваться не только для создания многоязычных сайтов, но и в качестве простенького шаблонизатора, например для email-рассылок.

Я решил разобраться с ним поподробнее

Делюсь опытом участия в хакатоне от Совкомбанка

Время на прочтение12 мин
Количество просмотров4K

Сегодня, я хочу поделиться опытом и рассказать про участие в хакатоне от совкомбанка. Подробнее про хакатон можно почитать тут. Для лл я вкратце опишу задачу — командой до 5 человек сделать внутренний сервис для подбора персонала и ведения HR деятельности.

Читать далее

Как мы разрабатывали сервис расчета стоимости доставки для ритейлера

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров2.8K

Представьте: вы – крупный производитель и ритейлер товаров для дома, который обрабатывает в сутки тысячи заказов по всей стране. Но при этом у вас нет единого алгоритма расчета стоимости доставки – из-за этого суммы почти всегда разные, иногда завышенные.

Меня зовут Артём Кияшко, я руковожу группой аналитиков в крупной ИТ-компании. В этой статье расскажу о том, как мы разработали и внедрили сервис расчёта стоимости доставки. 

Читать далее

Попрощайтесь с проверками на null и исключениями: использование монады Maybe в Symfony

Время на прочтение3 мин
Количество просмотров7.9K

Функциональное программирование появилось не вчера. Но оно так и не приобрело какой-либо дикой популярности, и, вероятно, не просто так. Иногда оно может быть довольно сложным с точки зрения понимания и использования. Но у него есть много преимуществ. Одним из них является возможность избежать проверок на null и исключений.

В этой статье мы рассмотрим монаду Maybe и то, как ее можно использовать в Symfony.

Читать далее

Чистая архитектура на практике

Уровень сложностиСложный
Время на прочтение7 мин
Количество просмотров15K

Для начала хотелось бы затронуть так называемую «микросервисную архитектуру», которая стала довольно популярной. Но называть её архитектурой не совсем корректно, как заметил Роберт Мартин в своей книге «Чистая архитектура». Микросервис — это один из способов представления компонента общего приложения. Но архитектура, взаимодействие между компонентами, при этом может остаться такой же. Под компонентом понимается наименьшая единица развёртывания — пакет, библиотека или отдельное приложение, сервис, микросервис. В книге критикуется данная «микросервисная архитектура», а точнее, неправильное и неуместное её применение, которое есть во многих случаях и влечёт за собой негативные или крайне негативные последствия для проекта, и происходит «благодаря» низкой компетентности разработчиков или управляющих, которые хотят найти несуществующую здесь «серебряную пулю».

В книге «Чистая архитектура» выделяется два основных слоя: инфраструктура и бизнес-логика. В различной литературе выделяют и другие слои, но какой-то относительно чёткой информации об этом я не встречал. Под инфраструктурой будем понимать логику более характерную для многих приложений, не только для данного, какие-то конкретные интеграции со сторонними компонентами, а также подготовку данных для бизнес-логики. Под бизнес-логикой — логику более характерную для данного приложения она и представляет наибольшую ценность, её нужно стараться выделять, делать более независимой от инфраструктуры. Во-первых, чтобы было проще её читать, тестировать, модифицировать, а во-вторых, чтобы была возможность с наименьшими затратами заменить инфраструктуру или её части, если потребуется.

Читать далее

Автоматическое масштабирование потребителей Symfony в Kubernetes [Практическое руководство]

Время на прочтение6 мин
Количество просмотров1.7K

Мы в Debricked уже достаточно давно используем Symfony на нашем веб-сервере. За все это время он очень хорошо послужил нам, и когда разработчики Symfony анонсировали компонент Messenger в Symfony 4.1, мы уже с нетерпением ждали, когда сможем опробовать его. С тех пор мы использовали этот компонент для отправки электронных писем в асинхронную очередь.

Однако недавно у нас возникла необходимость вынести обработку событий GitHub, которые мы получаем из нашей интеграции с GitHub, из нашего веб-сервера в отдельный микросервис (чтобы повысить производительность). Мы решили прибегнуть к паттерну производитель/потребитель (producer/consumer), который предоставляет компонент Messenger, поскольку он позволит нам асинхронно отправлять различные события в очередь, а затем немедленно подтверждать их прием в GitHub.

Читать далее

Symfony + Filebeat + Elasticsearch

Время на прочтение3 мин
Количество просмотров4.7K

Observability (и, как следствие, сбор логов) — это важная составляющая наших материальных средств, без которой было бы очень трудно исследовать баги или обнаруживать брутфорс-атаки. Обычно приложение выводит логи в специальный файл журнала или стандартный вывод системы (stdout). Это, конечно, уже что-то, но отсюда вытекает несколько проблем:

Читать далее