Привет, друзья!🙌
Наша команда давно хотела делиться мыслями вслух — и вот он, подкаст IT-тоLк🎙
Наш системный аналитик Олег и мобильный разработчик Андрей расскажут о самом актуальном: тренды, мифы, больные точки айтишной жизни и всё, что нас вдохновляет или беспокоит☝️
Пилотный выпуск уже здесь 👉 clck.ru/3KD7Fv
Скорей смотри, делись с друзьями, оставляй комментарии!⚡️
Наша команда давно хотела делиться мыслями вслух — и вот он, подкаст IT-тоLк🎙
Наш системный аналитик Олег и мобильный разработчик Андрей расскажут о самом актуальном: тренды, мифы, больные точки айтишной жизни и всё, что нас вдохновляет или беспокоит☝️
Пилотный выпуск уже здесь 👉 clck.ru/3KD7Fv
Скорей смотри, делись с друзьями, оставляй комментарии!⚡️
🔥6👍2❤1❤🔥1
🎉Друзья, момент, которого мы так ждали, настал! Теперь не только аналитики, но и разработчики смогут прокачать свои навыки на наших вебинарах.
И на первом вебинаре для разработчиков поговорим на тему: "WebSocket: Как подружиться с real-time".
WebSocket – не просто технология, а ключевой инструмент для приложений, где важна скорость и двусторонняя связь.
О чем поговорим:
🟢 Посмотрим на историю возникновения технологий
🟢 Разберёмся с проблемами, которые возникали на пути построения реал-тайм приложений
🟢 Посмотрим на основные части технологии WebSocket, её характеристики и преимущества.
🟢 Попробуем понять преимущества архитектур, управляемых событиями, с помощью WebSockets.
🟢 Разберём инженерные проблемы, с которыми придется столкнуться при создании масштабируемых систем с помощью WebSockets.
📅 17 апреля | 🕡 18:30 (МСК)
🎤 Спикер: программист Роман Бушняков
🔗 Регистрация: https://clck.ru/3L33LX
И на первом вебинаре для разработчиков поговорим на тему: "WebSocket: Как подружиться с real-time".
WebSocket – не просто технология, а ключевой инструмент для приложений, где важна скорость и двусторонняя связь.
О чем поговорим:
🟢 Посмотрим на историю возникновения технологий
🟢 Разберёмся с проблемами, которые возникали на пути построения реал-тайм приложений
🟢 Посмотрим на основные части технологии WebSocket, её характеристики и преимущества.
🟢 Попробуем понять преимущества архитектур, управляемых событиями, с помощью WebSockets.
🟢 Разберём инженерные проблемы, с которыми придется столкнуться при создании масштабируемых систем с помощью WebSockets.
📅 17 апреля | 🕡 18:30 (МСК)
🎤 Спикер: программист Роман Бушняков
🔗 Регистрация: https://clck.ru/3L33LX
🔥15
🔥 XIII Крупнейшая IT-конференция «Стачка» — твой билет в мир технологий!
🚀 2500+ айтишников, 250+ докладов, 45 секций по самым горячим направлениям:
▸ Разработка
▸ Управление
▸ Digital-маркетинг
▸ Дизайн и контент
💡 А еще:
✅ Нетворкинг с лидерами индустрии
✅ Практические мастер-классы
✅ Экспертная зона и мастермайнды
✅ Зажигательное афтепати!
И да, мы тоже готовим доклад — следите за анонсом!
📅 18–19 апреля 2025 | 🏛 УлГПУ, Ульяновск
📌 Программа и билеты: ul25.nastachku.ru/
🎁 А специально для наших подписчиков — скидка по промокоду EvApps
P.S. Количество билетов со скидкой ограничено — успевай!
🚀 2500+ айтишников, 250+ докладов, 45 секций по самым горячим направлениям:
▸ Разработка
▸ Управление
▸ Digital-маркетинг
▸ Дизайн и контент
💡 А еще:
✅ Нетворкинг с лидерами индустрии
✅ Практические мастер-классы
✅ Экспертная зона и мастермайнды
✅ Зажигательное афтепати!
И да, мы тоже готовим доклад — следите за анонсом!
📅 18–19 апреля 2025 | 🏛 УлГПУ, Ульяновск
📌 Программа и билеты: ul25.nastachku.ru/
🎁 А специально для наших подписчиков — скидка по промокоду EvApps
P.S. Количество билетов со скидкой ограничено — успевай!
🔥8❤1
Ищи нас на конференции «Стачка» 18 апреля! 🎤
В 17:20 приходи в секцию разработки, чтобы узнать всё о применении NextCloud в коммерческих проектах. Именно об этом расскажет наш PHP-разработчик Татьяна Драбовская.
Что обсудим?
🟢 Зачем выбирать Open Source для облачного хранилища и как подобрать основу для коммерческой разработки
🟢 NextCloud: архитектура, структура и кастомизация
🟢 Успешный кейс: интеграция NextCloud + LDAP
🟢 Сложности в разработке и внедрении
🟢 Работа с Open Source: на что обратить внимание?
🟢 Выводы: NextCloud как база для масштабных проектов
⚡️ Времени до конференции всё меньше!
🔗 Регистрируйся: clck.ru/3LRiZo
🎁 Промокод EvApps даёт скидку 20%
Это нужно тебе, твоему другу — это нужно всем! 😉
До встречи на «Стачке»! 💚
В 17:20 приходи в секцию разработки, чтобы узнать всё о применении NextCloud в коммерческих проектах. Именно об этом расскажет наш PHP-разработчик Татьяна Драбовская.
Что обсудим?
🟢 Зачем выбирать Open Source для облачного хранилища и как подобрать основу для коммерческой разработки
🟢 NextCloud: архитектура, структура и кастомизация
🟢 Успешный кейс: интеграция NextCloud + LDAP
🟢 Сложности в разработке и внедрении
🟢 Работа с Open Source: на что обратить внимание?
🟢 Выводы: NextCloud как база для масштабных проектов
⚡️ Времени до конференции всё меньше!
🔗 Регистрируйся: clck.ru/3LRiZo
🎁 Промокод EvApps даёт скидку 20%
Это нужно тебе, твоему другу — это нужно всем! 😉
До встречи на «Стачке»! 💚
🔥8👍1
🖐🏻Привет, друзья! Уже сегодня состоится наш первый вебинар для разработчиков "WebSocket: Как подружиться с real-time".
WebSocket – ключевой инструмент для real-time приложений.
На вебинаре поговорим о том, как WebSocket решает проблемы двусторонней связи, рассмотрим проблемы, которые возникали на пути построения реал-тайм приложений, попробуем понять преимущества архитектур, управляемых событиями, с помощью WebSockets, а так же разберем сложности масштабирования.
⏰ Сегодня в 18:30 (Мск)
🎤 Спикер: программист Роман Бушняков
Всех ждем на вебинаре!!🤗
Регистрация 👉🏻 https://clck.ru/3LVK9n
WebSocket – ключевой инструмент для real-time приложений.
На вебинаре поговорим о том, как WebSocket решает проблемы двусторонней связи, рассмотрим проблемы, которые возникали на пути построения реал-тайм приложений, попробуем понять преимущества архитектур, управляемых событиями, с помощью WebSockets, а так же разберем сложности масштабирования.
⏰ Сегодня в 18:30 (Мск)
🎤 Спикер: программист Роман Бушняков
Всех ждем на вебинаре!!🤗
Регистрация 👉🏻 https://clck.ru/3LVK9n
👍7🔥2
Привет, Стачка! 🫶🏻
Наша делегация уже в Ульяновске и настроена на максимум — покорять, вдохновлять и делиться опытом на конференции!
Мы счастливы быть в числе спикеров, поэтому подготовили для вас классный розыгрыш! 🎁
Победитель получит посылку с тёплым приветом из Тулы 😍
Что нужно сделать?
1. Перейти в бота — тык сюда
2. Ответить на пару простых вопросов
3. Получить свой персональный номер участника 🎟
📅 Итоги объявим 24 апреля в этом Telegram-канале — не пропусти!
Удачи! 🍀
Наша делегация уже в Ульяновске и настроена на максимум — покорять, вдохновлять и делиться опытом на конференции!
Мы счастливы быть в числе спикеров, поэтому подготовили для вас классный розыгрыш! 🎁
Победитель получит посылку с тёплым приветом из Тулы 😍
Что нужно сделать?
1. Перейти в бота — тык сюда
2. Ответить на пару простых вопросов
3. Получить свой персональный номер участника 🎟
📅 Итоги объявим 24 апреля в этом Telegram-канале — не пропусти!
Удачи! 🍀
🔥7👍5❤2
🚀Ребята, всем привет! Видео вебинара для разработчиков "WebSocket: Как подружиться с real-time" уже доступно по ссылке https://clck.ru/3Laabz
Приятного просмотра!
Приятного просмотра!
🔥6❤2👍1
Media is too big
VIEW IN TELEGRAM
🎙 Запись второго выпуска нашего Подкаста IT-тоLк уже доступна!
💡 В этом выпуске наш системный аналитик Олег и мобильный разработчик Андрей делятся личным опытом как войти в IT , с чего начать и как выбрать направление, где и как учиться и как получить первую стажировку и работу, поделятся практическими советами и лайфхаками для новичков.
Найти Подкаст можно тут 👉 https://clck.ru/3Lv5x6
💡 В этом выпуске наш системный аналитик Олег и мобильный разработчик Андрей делятся личным опытом как войти в IT , с чего начать и как выбрать направление, где и как учиться и как получить первую стажировку и работу, поделятся практическими советами и лайфхаками для новичков.
Найти Подкаст можно тут 👉 https://clck.ru/3Lv5x6
🔥6❤1
🖐🏻Привет всем! Приглашаем на наш вебинар "Методы планирования – как успевать больше без стресса", который будет полезен для всех!
Мы поделимся проверенными методами планирования, которые помогут вам организовать свое время и увеличить продуктивность!
🔑 Что узнаете на вебинаре?
• Как метод «Съешь лягушку» поможет вам справиться с самыми сложными задачами.
• Правило 1-3-5, как правильно расставлять приоритеты.
• Timeboxing и метод Pomodoro для эффективного управления временем.
🚀 Вы научитесь избегать основных ошибок в планировании:
• Переоценка своих сил
• Отсутствие приоритетов
• Прокрастинация и «пожиратели времени»
📅 29 мая
🕒 18:30 (Мск)
👩🏻🦱 Виктория Павлюкова- системный аналитик
🔗 Регистрация на вебинар
Мы поделимся проверенными методами планирования, которые помогут вам организовать свое время и увеличить продуктивность!
🔑 Что узнаете на вебинаре?
• Как метод «Съешь лягушку» поможет вам справиться с самыми сложными задачами.
• Правило 1-3-5, как правильно расставлять приоритеты.
• Timeboxing и метод Pomodoro для эффективного управления временем.
🚀 Вы научитесь избегать основных ошибок в планировании:
• Переоценка своих сил
• Отсутствие приоритетов
• Прокрастинация и «пожиратели времени»
📅 29 мая
🕒 18:30 (Мск)
👩🏻🦱 Виктория Павлюкова- системный аналитик
🔗 Регистрация на вебинар
🔥5❤2
Бета-релиз Laravel-плагина для VS Code
Команда Laravel представила официальное расширение для Visual Studio Code, и в его описании есть любопытная деталь:
> This extension will occasionally boot your app in the background to collect information about your app for use in autocompletion, linking, hovering, and diagnostics
Расширение периодически запускает Laravel-приложение в фоновом режиме, чтобы глубже понять проект и улучшить автокомплит, навигацию, подсказки и диагностику.
Традиционные инструменты, такие как PhpStorm, Laravel Idea и другие IDE, полагаются на статический анализ, который не всегда справляется с «магией» PHP. Например, плагин MetaStorm требует явно описывать динамику и конвенции в специальном синтаксисе.
Может ли runtime-анализ (динамический запуск приложения) помочь редактору лучше понять код по сравнению со статическим подходом? Интуитивно — да!
Мы считаем, что динамический анализ, в теории, имеет огромный потенциал. Особенно для сложных проектов, где статический анализ не всегда дает точную картину. Но, как это бывает с большинством новых технологий, важно подождать, пока плагин выйдет из бета-версии, станет более стабильным и легким в настройке. В идеале, если бы плагин интегрировал динамический и статический подходы, это было бы отличным решением для улучшения работы с Laravel-проектами.
А как считаете вы?
Поэтому следим за его развитием и ждем стабильного релиза, прежде чем интегрировать его в повседневную разработку.
🔗 Подробнее на Marketplace
#evapps_news
Команда Laravel представила официальное расширение для Visual Studio Code, и в его описании есть любопытная деталь:
> This extension will occasionally boot your app in the background to collect information about your app for use in autocompletion, linking, hovering, and diagnostics
Расширение периодически запускает Laravel-приложение в фоновом режиме, чтобы глубже понять проект и улучшить автокомплит, навигацию, подсказки и диагностику.
Традиционные инструменты, такие как PhpStorm, Laravel Idea и другие IDE, полагаются на статический анализ, который не всегда справляется с «магией» PHP. Например, плагин MetaStorm требует явно описывать динамику и конвенции в специальном синтаксисе.
Может ли runtime-анализ (динамический запуск приложения) помочь редактору лучше понять код по сравнению со статическим подходом? Интуитивно — да!
Мы считаем, что динамический анализ, в теории, имеет огромный потенциал. Особенно для сложных проектов, где статический анализ не всегда дает точную картину. Но, как это бывает с большинством новых технологий, важно подождать, пока плагин выйдет из бета-версии, станет более стабильным и легким в настройке. В идеале, если бы плагин интегрировал динамический и статический подходы, это было бы отличным решением для улучшения работы с Laravel-проектами.
А как считаете вы?
Поэтому следим за его развитием и ждем стабильного релиза, прежде чем интегрировать его в повседневную разработку.
🔗 Подробнее на Marketplace
#evapps_news
🔥4
🙌🏻Привет! На связи Юра, разработчик компании EvApps. На днях прочитал книгу Роберта Мартина "Идеальная работа" (или "Чистое мастерство") — пятую в серии "Чистое программирование".
Вот несколько важных моментов, которые точно стоит учесть:
📚 Мастерство: В будущем программисты не смогут просто списывать свои ошибки на неопытность. Бизнес и общество будут требовать от нас качественного кода, и работать в этой индустрии будут только настоящие мастера.
🧪 TDD и тестирование: TDD (разработка через тестирование) — это основа. Мартин подробно рассказывает, как с помощью тестов и маленьких итераций можно писать реально рабочий код. Тесты здесь — это почти как документация, только лучше.
🔄 Рефакторинг: Рефакторинг — это не просто улучшение кода, а его улучшение без изменения поведения. Мартин советует быть смелым: не бойтесь переименовывать переменные и делать код понятным. Если код не читается как книга, это уже проблема.
🎨Дизайн и принципы: Не нужно делать лишнего. Следите, чтобы код был тестируемым и минимизируйте дублирование. Мартин советует придерживаться принципа YAGNI (You Aren’t Gonna Need It) — не добавляйте то, что вам не нужно.
👥Совместное программирование: Работать в паре — круто. Это помогает улучшать качество кода, особенно если оба разработчика опытные и готовы учиться друг у друга.
⚖️Этика программиста: Не забывайте про свою ответственность за код. Если вы не берете ответственность за возможные ошибки в программе, значит, вы не профессионал. Важно всегда быть честным и не бояться признаться, что что-то не знаете.
📈Качество и производительность: Качество — это не что-то, что можно достичь за один раз. Оно требует постоянного улучшения, а производительность должна быть стабильной. Не забывайте учиться и не стесняйтесь просить помощи, когда нужно.
📖 Советую прочесть всем, кто хочет расти как профессионал! А если уже читали — давайте обсудим в комментах. 👇
#evapps_польза
Вот несколько важных моментов, которые точно стоит учесть:
📚 Мастерство: В будущем программисты не смогут просто списывать свои ошибки на неопытность. Бизнес и общество будут требовать от нас качественного кода, и работать в этой индустрии будут только настоящие мастера.
🧪 TDD и тестирование: TDD (разработка через тестирование) — это основа. Мартин подробно рассказывает, как с помощью тестов и маленьких итераций можно писать реально рабочий код. Тесты здесь — это почти как документация, только лучше.
🔄 Рефакторинг: Рефакторинг — это не просто улучшение кода, а его улучшение без изменения поведения. Мартин советует быть смелым: не бойтесь переименовывать переменные и делать код понятным. Если код не читается как книга, это уже проблема.
🎨Дизайн и принципы: Не нужно делать лишнего. Следите, чтобы код был тестируемым и минимизируйте дублирование. Мартин советует придерживаться принципа YAGNI (You Aren’t Gonna Need It) — не добавляйте то, что вам не нужно.
👥Совместное программирование: Работать в паре — круто. Это помогает улучшать качество кода, особенно если оба разработчика опытные и готовы учиться друг у друга.
⚖️Этика программиста: Не забывайте про свою ответственность за код. Если вы не берете ответственность за возможные ошибки в программе, значит, вы не профессионал. Важно всегда быть честным и не бояться признаться, что что-то не знаете.
📈Качество и производительность: Качество — это не что-то, что можно достичь за один раз. Оно требует постоянного улучшения, а производительность должна быть стабильной. Не забывайте учиться и не стесняйтесь просить помощи, когда нужно.
📖 Советую прочесть всем, кто хочет расти как профессионал! А если уже читали — давайте обсудим в комментах. 👇
#evapps_польза
🔥8👍1
😊Привет, я Таня Драбовская, PHP-разработчик Evapps. Сегодня поговорим про технические аспекты кастомизации и масштабирования платформы Nextcloud!
🚀 Nextcloud представляет собой модульную клиент-серверную платформу, ориентированную на развёртывание приватных облачных решений.
Базовая функциональность включает:
- файловое хранилище,
- контроль доступа,
- веб-интерфейс,
- систему авторизации.
Архитектура построена на PHP с использованием собственного App Framework. Фронтенд реализован на Vue.js .
Серверная часть поддерживает интеграцию с MariaDB, PostgreSQL , Redis , S3-хранилищами, внешними файловыми системами и кеширующими решениями (OPcache, file-based cache).
Платформа поддерживает гибкую кастомизацию за счёт API, системы событий и разработки собственных модулей.
☝️Рассмотрим два основных кейса:
1️. Автоматическая сортировка файлов на основе MIME-типов
В рамках проекта была реализована логика автоматической сортировки загружаемых файлов на основе MIME-типов. Решение оформлено в виде отдельного приложения, использующего хук postWrite файловой подсистемы. При загрузке файл классифицируется и перемещается в предопределённую директорию (/Documents , /Images , /Videos ). UI-часть реализована на Vue.js ; конфигурация осуществляется через API и административную панель.
2️. Оптимизация полнотекстового поиска с использованием Elasticsearch
Для повышения удобства работы с хранилищами большого объёма был внедрён механизм полнотекстового поиска на базе Elasticsearch.
🔎 Ключевые технологии полнотекстового поиска:
• fulltextsearch — модуль Nextcloud, управляющий процессами индексации и поиска;
• fulltextsearch_elasticsearch — компонент для интеграции с Elasticsearch;
• Elasticsearch — внешний высокопроизводительный поисковый движок.
⚠️Проблемы стандартной реализации, с которыми мы столкнулись при работе:
• продолжительное время индексации при больших объёмах файлов (сотни тысяч документов)
• высокая нагрузка на центральный процессор сервера
• потенциальная деградация производительности и доступности сервиса для конечных пользователей
🛠Для минимизации задержек и снижения деградации производительности мы провели оптимизацию:
✔️ Распараллелили процесс индексации:
• внедрили асинхронный HTTP-клиент для отправки данных в Elasticsearch
• реализовали пакетную отправку данных (batch-запросы) по 500–1000 документов
• добавили обработку ошибок и механизм повторных попыток (retry)
✔️ Оптимизировали взаимодействие с базой данных Nextcloud:
• перешли с одиночных SQL-запросов на bulk INSERT
• использовали постоянные соединения к базе данных (persistent connections)
✔️ Донастроили Elasticsearch:
• отключили неиспользуемые в индексе поля для уменьшения объёма
• применили ngram-анализатор для ускоренного поиска коротких фрагментов текста
🎯 Комплексная оптимизация процессов индексации и поиска в Nextcloud позволила существенно повысить эффективность работы системы и снизить нагрузку на серверные ресурсы. Это обеспечило стабильную производительность при масштабной эксплуатации.
Готова ответить на ваши вопросы! 😊
🚀 Nextcloud представляет собой модульную клиент-серверную платформу, ориентированную на развёртывание приватных облачных решений.
Базовая функциональность включает:
- файловое хранилище,
- контроль доступа,
- веб-интерфейс,
- систему авторизации.
Архитектура построена на PHP с использованием собственного App Framework. Фронтенд реализован на Vue.js .
Серверная часть поддерживает интеграцию с MariaDB, PostgreSQL , Redis , S3-хранилищами, внешними файловыми системами и кеширующими решениями (OPcache, file-based cache).
Платформа поддерживает гибкую кастомизацию за счёт API, системы событий и разработки собственных модулей.
☝️Рассмотрим два основных кейса:
1️. Автоматическая сортировка файлов на основе MIME-типов
В рамках проекта была реализована логика автоматической сортировки загружаемых файлов на основе MIME-типов. Решение оформлено в виде отдельного приложения, использующего хук postWrite файловой подсистемы. При загрузке файл классифицируется и перемещается в предопределённую директорию (/Documents , /Images , /Videos ). UI-часть реализована на Vue.js ; конфигурация осуществляется через API и административную панель.
2️. Оптимизация полнотекстового поиска с использованием Elasticsearch
Для повышения удобства работы с хранилищами большого объёма был внедрён механизм полнотекстового поиска на базе Elasticsearch.
🔎 Ключевые технологии полнотекстового поиска:
• fulltextsearch — модуль Nextcloud, управляющий процессами индексации и поиска;
• fulltextsearch_elasticsearch — компонент для интеграции с Elasticsearch;
• Elasticsearch — внешний высокопроизводительный поисковый движок.
⚠️Проблемы стандартной реализации, с которыми мы столкнулись при работе:
• продолжительное время индексации при больших объёмах файлов (сотни тысяч документов)
• высокая нагрузка на центральный процессор сервера
• потенциальная деградация производительности и доступности сервиса для конечных пользователей
🛠Для минимизации задержек и снижения деградации производительности мы провели оптимизацию:
✔️ Распараллелили процесс индексации:
• внедрили асинхронный HTTP-клиент для отправки данных в Elasticsearch
• реализовали пакетную отправку данных (batch-запросы) по 500–1000 документов
• добавили обработку ошибок и механизм повторных попыток (retry)
✔️ Оптимизировали взаимодействие с базой данных Nextcloud:
• перешли с одиночных SQL-запросов на bulk INSERT
• использовали постоянные соединения к базе данных (persistent connections)
✔️ Донастроили Elasticsearch:
• отключили неиспользуемые в индексе поля для уменьшения объёма
• применили ngram-анализатор для ускоренного поиска коротких фрагментов текста
🎯 Комплексная оптимизация процессов индексации и поиска в Nextcloud позволила существенно повысить эффективность работы системы и снизить нагрузку на серверные ресурсы. Это обеспечило стабильную производительность при масштабной эксплуатации.
Готова ответить на ваши вопросы! 😊
❤4🔥4
Готов третий эпизод нашего подкаста - на этот раз обсудили "боли" рекрутеров, "художества" в резюме и отличие "мясных" резюме от тех, которые сочинил ChatGPT, с нашим руководителем отдела по работе с персоналом Александрой Радиной 💪
👀 Смотрим в нашем сообществе в ВК: https://vk.com/video-78780379_456239279
👀 Смотрим в нашем сообществе в ВК: https://vk.com/video-78780379_456239279
VK Видео
IT ТОLК by Evapps. Рекрутинг в IT: ложь, боль и искусственный интеллект
Руководитель наших HR-ов Александра Радина о "творчестве" в резюме, "мясных" кандидатах, разработчиках уровня "чайка" - и немного о конях:) Обещанные ссылочки: - статья о резюме здорового человека: https://clck.ru/3N4ZEo - чат для системных аналитиков: …
🔥10❤1
Всем привет!
На связи снова разработчики EvApps💪
Сегодня поговорим про DTO (Data Transfer Objects), а именно разберем, зачем и как использовать его в Laravel.
⭕️ DTO (Объект Передачи Данных) - это шаблон проектирования, используемый для передачи данных между уровнями в программной архитектуре. Основная цель DTO - отделить различные уровни или компоненты приложения, позволяя им взаимодействовать друг с другом, не вникая в детали реализации друг друга.
Итак, DTO - это простой объект передачи данных, который помогает отделить и изолировать компоненты друг от друга.
Если мы знаем структуру данных используемую в конкретном участке кода, то нам легко его поддерживать и изменять, тут нам и помогает DTO.
❇️ Например, код контроллера сохранения статьи:
В данном примере мы не знаем, что вернет метод $request->all().
Мы можем создать свой класс CreateArticleRequest и, при необходимости, смотреть, что он возвращает. Но теперь валидация данных связана с HTTP Request, и если нам нужно вызвать метод createArticle в другом месте кода, то нужно будет вручную передавать объект CreateArticleRequest. К тому же, класс CreateArticleRequest вернёт массив полей и мы не можем принудительно указать тип данных передаваемых в метод createArticle.
Используя DTO мы решим проблемы описанные выше.
⭕️ Как использовать?
Как мы сказали выше, DTO - это простой объект для сопоставления свойств.
❇️ Создадим класс DTO:
В объявлении класса DTO используем ключевые слова final readonly, то есть запрещаем наследовать класс DTO и переопределять свойства объекта, поэтому после создания класса DTO его контекст нельзя будет изменить, и мы можем быть уверены, что получим на вход именно нашу DTO, которую указали в контракте метода createArticle. Эти действия позволят нам использовать контекстный объект и добавить безопасность типов.
Контроллер теперь выглядит вот так:
Благодаря именованным аргументам в PHP8 мы легко создаем экземпляр CreateArticleDTO, используя конструкцию new CreateArticleDTO (...$request->all())
Такой подход использования DTO позволяет решить проблемы:
✅ Мы всегда знаем какие данные получит метод;
✅ Мы явно указываем тип переданных данных;
✅ Мы не привязаны к объекту CreateArticleRequest и можем вызвать createArticle в любом месте нашего кода.
Теперь код стал более качественным и поддерживаемым👍
❓А вы в своих Laravel-проектах используете DTO или работаете напрямую с массивами/Request?
#PHP #Laravel #DTO #backend #паттерны_проектирования #чистый_код #туториал
На связи снова разработчики EvApps💪
Сегодня поговорим про DTO (Data Transfer Objects), а именно разберем, зачем и как использовать его в Laravel.
⭕️ DTO (Объект Передачи Данных) - это шаблон проектирования, используемый для передачи данных между уровнями в программной архитектуре. Основная цель DTO - отделить различные уровни или компоненты приложения, позволяя им взаимодействовать друг с другом, не вникая в детали реализации друг друга.
Итак, DTO - это простой объект передачи данных, который помогает отделить и изолировать компоненты друг от друга.
Если мы знаем структуру данных используемую в конкретном участке кода, то нам легко его поддерживать и изменять, тут нам и помогает DTO.
❇️ Например, код контроллера сохранения статьи:
public function store(Request $request): JsonResponse
{
return response()->json([
$this->service->createArticle($request->all()),
Response::HTTP_CREATED
]);
}
В данном примере мы не знаем, что вернет метод $request->all().
Мы можем создать свой класс CreateArticleRequest и, при необходимости, смотреть, что он возвращает. Но теперь валидация данных связана с HTTP Request, и если нам нужно вызвать метод createArticle в другом месте кода, то нужно будет вручную передавать объект CreateArticleRequest. К тому же, класс CreateArticleRequest вернёт массив полей и мы не можем принудительно указать тип данных передаваемых в метод createArticle.
Используя DTO мы решим проблемы описанные выше.
⭕️ Как использовать?
Как мы сказали выше, DTO - это простой объект для сопоставления свойств.
❇️ Создадим класс DTO:
final readonly class CreateArticleDTO
{
public function __construct(
public string $noscript,
public string $denoscription,
public string $body,
) {}
}
В объявлении класса DTO используем ключевые слова final readonly, то есть запрещаем наследовать класс DTO и переопределять свойства объекта, поэтому после создания класса DTO его контекст нельзя будет изменить, и мы можем быть уверены, что получим на вход именно нашу DTO, которую указали в контракте метода createArticle. Эти действия позволят нам использовать контекстный объект и добавить безопасность типов.
Контроллер теперь выглядит вот так:
public function store(Request $request): JsonResponse
{
return response()->json([
$this->service->createArticle(new CreateArticleDTO(...$request->all())),
Response::HTTP_CREATED
]);
}
Благодаря именованным аргументам в PHP8 мы легко создаем экземпляр CreateArticleDTO, используя конструкцию new CreateArticleDTO (...$request->all())
Такой подход использования DTO позволяет решить проблемы:
✅ Мы всегда знаем какие данные получит метод;
✅ Мы явно указываем тип переданных данных;
✅ Мы не привязаны к объекту CreateArticleRequest и можем вызвать createArticle в любом месте нашего кода.
Теперь код стал более качественным и поддерживаемым👍
❓А вы в своих Laravel-проектах используете DTO или работаете напрямую с массивами/Request?
#PHP #Laravel #DTO #backend #паттерны_проектирования #чистый_код #туториал
🔥3🤔1
👋 Всем привет!
В прошлых постах мы говорили про различные системы и инструменты, которые помогают решать задачи разработчика.
А сегодня поговорим о том, как в Bitrix можно организовать компонент не просто для отображения, а как полноценный контроллер с CRUD-операциями.
Обработчик запросов в классе компонента (файл class.php) позволяет:
✅ Инкапсулировать весь код в одном классе
✅ Повторно использовать методы, данные и параметры компонента
✅ Использовать языковые фразы, шаблоны компонента
✅ Переопределять в компонентах-потомках стандартное поведение
Чтобы класс компонента мог обрабатывать запросы, необходимо:
▶️ Реализовать интерфейс \Bitrix\Main\Engine\Contract\Controllerable
▶️ Определить методы-действия с суффиксом Action
▶️ Реализовать метод configureActions (обычно возвращает пустой массив — конфигурацию по умолчанию)
▶️ Если нужно добавлять, обрабатывать ошибки, то стоит реализовать \Bitrix\Main\Errorable
При выполнении компонента в аяксовом режиме выполняются последовательно:
1️⃣ CBitrixComponent::onIncludeComponentLang
2️⃣ CBitrixComponent::onPrepareComponentParams
Запуск действия с фильтрами:
В прошлых постах мы говорили про различные системы и инструменты, которые помогают решать задачи разработчика.
А сегодня поговорим о том, как в Bitrix можно организовать компонент не просто для отображения, а как полноценный контроллер с CRUD-операциями.
Обработчик запросов в классе компонента (файл class.php) позволяет:
✅ Инкапсулировать весь код в одном классе
✅ Повторно использовать методы, данные и параметры компонента
✅ Использовать языковые фразы, шаблоны компонента
✅ Переопределять в компонентах-потомках стандартное поведение
Чтобы класс компонента мог обрабатывать запросы, необходимо:
▶️ Реализовать интерфейс \Bitrix\Main\Engine\Contract\Controllerable
▶️ Определить методы-действия с суффиксом Action
▶️ Реализовать метод configureActions (обычно возвращает пустой массив — конфигурацию по умолчанию)
▶️ Если нужно добавлять, обрабатывать ошибки, то стоит реализовать \Bitrix\Main\Errorable
При выполнении компонента в аяксовом режиме выполняются последовательно:
Запуск действия с фильтрами:
<?php
namespace local\components\vendor\example;
use CBitrixComponent;
use Bitrix\Main\Error;
use Bitrix\Main\Engine\Contract\Controllerable;
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
class ExampleComponent extends CBitrixComponent implements Controllerable
{
public function executeComponent()
{
// этот код не будет выполняться при запуске ajax-действий
}
public function configureActions()
{
return [];
}
public function onPrepareComponentParams($arParams)
{
// подготовка параметров
}
public function createAction(array $fields): ?array
{
$example = Example::add($fields);
if (!$example) {
$this->addError(new Error('Could not create example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
public function viewAction(int $id): ?array
{
$example = Example::getById($id);
if (!$example) {
$this->addError(new Error('Could not find example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
public function listAction(array $fields): ?array
{
$examples = Example::getList($fields);
return array_map(static fn ($example) => $example->toArray(), $examples);
}
public function updateAction(int $id, array $fields): ?array
{
$example = Example::update($id, $fields);
if (!$example) {
$this->addError(new Error('Could not update example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
public function deleteAction(int $id): ?array
{
$example = Example::delete($id);
if (!$example) {
$this->addError(new Error('Could not delete example.', {код_ошибки}));
return null;
}
return $example->toArray();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1
👋 Всем привет
Сегодня мы поговорим про CSS и как правильно настроить загрузку шрифтов с помощью дескриптора
Этот дескриптор важен для управления тем, как будет отображаться текст до того, как шрифт будет загружен.
🔑 Параметры для
* auto — поведение по умолчанию, зависит от браузера.
* block — текст скрыт до 3 секунд; если шрифт не загрузился, показывается запасной, потом текст перерисовывается. Плюс: текст с нужным шрифтом без «скачка». Минус: может быть невидимым, может сильно ухудшить UX и LCP.
* swap — сразу показывается запасной шрифт, после загрузки шрифта происходит замена. Плюс: текст виден, улучшает UX и SEO. Минус: возможен визуальный «скачок».
* fallback — скрытие 100 мс, потом запасной шрифт; если основной не загрузился через 3 с, остаётся запасной. Замена на загруженный шрифт без перезагрузки не произойдёт.
* optional — скрытие 100 мс, затем запасной шрифт; замена на основной возможна только после обновления страницы.
✨ Рекомендация: чаще всего используйте
Материалы:
MDN Web Docs — font-display
W3C — CSS Fonts Module Level 4
❓ Как вы настраиваете `font-display` в своих проектах?
#frontend #CSS #UIUX #WebDev
Сегодня мы поговорим про CSS и как правильно настроить загрузку шрифтов с помощью дескриптора
font-display в @font-face.Этот дескриптор важен для управления тем, как будет отображаться текст до того, как шрифт будет загружен.
@font-face {
font-display: auto;
font-display: block;
font-display: swap;
font-display: fallback;
font-display: optional;
}🔑 Параметры для
font-display:* auto — поведение по умолчанию, зависит от браузера.
* block — текст скрыт до 3 секунд; если шрифт не загрузился, показывается запасной, потом текст перерисовывается. Плюс: текст с нужным шрифтом без «скачка». Минус: может быть невидимым, может сильно ухудшить UX и LCP.
* swap — сразу показывается запасной шрифт, после загрузки шрифта происходит замена. Плюс: текст виден, улучшает UX и SEO. Минус: возможен визуальный «скачок».
* fallback — скрытие 100 мс, потом запасной шрифт; если основной не загрузился через 3 с, остаётся запасной. Замена на загруженный шрифт без перезагрузки не произойдёт.
* optional — скрытие 100 мс, затем запасной шрифт; замена на основной возможна только после обновления страницы.
✨ Рекомендация: чаще всего используйте
swap (он стоит по умолчанию в Google Fonts), а если необходимо избежать мелькания текста, выбирайте optional.Материалы:
MDN Web Docs — font-display
W3C — CSS Fonts Module Level 4
❓ Как вы настраиваете `font-display` в своих проектах?
#frontend #CSS #UIUX #WebDev
MDN Web Docs
font-display - CSS | MDN
The font-display denoscriptor for the @font-face at-rule determines how a font face is displayed based on whether and when it is downloaded and ready to use.
🔥4
Привет всем!
🚀 Сегодня запускаем серию постов, в которых будем подробно разбирать паттерны интеграции ограниченных контекстов. Для начала поговорим о трех подходах, которые играют ключевую роль в организации взаимодействия между командами и контекстами.
Cooperation 🌐
Этот паттерн идеально подходит для команд с устоявшимися коммуникациями. Это может быть одна команда или несколько команд с взаимозависимыми целями, когда успех одной зависит от успеха другой. Главное здесь — это качественная взаимодействие между участниками процесса.
Partnership 🤝
В этом случае команды работают совместно, без диктата одной команды над другой. Если нужно внести изменения в контракты, команды договариваются и оперативно внедряют изменения, что позволяет получить быструю обратную связь. Однако для распределённых команд этот паттерн может стать проблемой из-за сложности в коммуникации.
Shared Kernel 🧩
Иногда модели, ограниченные контекстом, частично реализованы в разных контекстах. Однако важно, чтобы общее ядро удовлетворяло требованиям обоих контекстов и оставалось минималистичным, чтобы избежать каскадных изменений. В идеале, общее ядро должно содержать только те элементы, которые необходимы для интеграции, и изменения требуют обязательных тестов в обоих контекстах.
В следующем посте продолжим рассматривать, когда и как применять Shared Kernel и перейдем к другим паттернам интеграции!
#development #паттерны #boundedcontext #cooperation #sharedkernel #Partnership
🚀 Сегодня запускаем серию постов, в которых будем подробно разбирать паттерны интеграции ограниченных контекстов. Для начала поговорим о трех подходах, которые играют ключевую роль в организации взаимодействия между командами и контекстами.
Cooperation 🌐
Этот паттерн идеально подходит для команд с устоявшимися коммуникациями. Это может быть одна команда или несколько команд с взаимозависимыми целями, когда успех одной зависит от успеха другой. Главное здесь — это качественная взаимодействие между участниками процесса.
Partnership 🤝
В этом случае команды работают совместно, без диктата одной команды над другой. Если нужно внести изменения в контракты, команды договариваются и оперативно внедряют изменения, что позволяет получить быструю обратную связь. Однако для распределённых команд этот паттерн может стать проблемой из-за сложности в коммуникации.
Shared Kernel 🧩
Иногда модели, ограниченные контекстом, частично реализованы в разных контекстах. Однако важно, чтобы общее ядро удовлетворяло требованиям обоих контекстов и оставалось минималистичным, чтобы избежать каскадных изменений. В идеале, общее ядро должно содержать только те элементы, которые необходимы для интеграции, и изменения требуют обязательных тестов в обоих контекстах.
В следующем посте продолжим рассматривать, когда и как применять Shared Kernel и перейдем к другим паттернам интеграции!
#development #паттерны #boundedcontext #cooperation #sharedkernel #Partnership
❤1