The Dragon Code News
260 subscribers
216 photos
7 videos
4 files
237 links
Рассказываем о том, над чем работаем и что может быть полезным разработчикам 🙂

dragon-code.pro
Download Telegram
🔥 Стрим по Laravel 12. Обсуждаем очередную революцию! 😆

Друзья, мы дождались! Laravel 12 выходит 24 февраля, и настоящий геймченж! 🎉

Что нового?
- Чуть-чуть обновили зависимости.
- Чуть-чуть подтянули совместимость с PHP.

Дополнительно. Новые Starter Kits с поддержкой React, Vue и Livewire. Теперь можно сразу получить проект с компонентами Shadcn, а для Livewire – бесплатная версия Flux. Это, конечно, круто, но не совсем про сам Laravel. 🤔

🤨 Пройдёмся по обновлению на стриме
- Кирилл Несмеянов будет искать недостатки в идеальном Laravel! 🕵️‍♂️
- Андрей Хеллдар и Адель Файзрахманов и я будем его защищать! ⚔️
- Возможно, заглянет сам Taylor Otwell! 👀

📅 Когда? 25 февраля в 19:00
📍 Где? На CutCode - https://youtube.com/live/h_DY4gUjncw
Жду вас! А пока можете задавать вопросы! 😅

#Laravel12 #CutCode
👍6
RoadRunner vs OpenSwoole vs FrankenPHP с Laravel Octane

На эту тему было опубликовано множество статей из различного рода источников и у многих заметил тенденцию когда каждая из трёх упомянутых технологий значительно лидирует по сравнению с остальными. Тем более что у многих показаны какие-то дикие результаты в виде 1к запросов в секунду...

И мне захотелось всё проверить своими руками...

https://habr.com/ru/articles/885266/
1👍10🔥1
Красивые иконки для IDE? Легко!

Шаг 1: Устанавливаем библиотеку в глобальную область видимости Composer:

composer global require dragon-code/iconify-ide:*


Шаг 2: Публикуем иконку

cd /to/your/project

iconify


Также возможно разом опубликовать иконки во всех проектах папки (рекурсивный поиск):

iconify --all


И также можно задать конкретный путь:

iconify --path=/../foo/bar/
iconify --path=/../foo/bar/ --all


https://github.com/TheDragonCode/iconify-ide
4👍4🔥2
🚀 Ускорить взаимодействие Laravel приложения с Redis? Легко!

Нюанс

Способ работает лишь в том случае, когда и приложение, и Redis находятся на одном сервере.


Итак, что для этого нужно:

Создаём папку /var/run/redis, если она не создана, а также меняем её права, а также добавляем пользователя, под которым запускается cli и web, в группу "redis":

sudo mkdir -p /var/run/redis/
sudo chown -R redis:redis /var/run/redis
sudo chmod 770 /var/run/redis
sudo usermod -aG redis www-data


Далее открываем файл /etc/redis/redis.conf, находим строку с объявлением unixsocket и раскомментируем их:

unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770


И перезапускаем службу:

systemctl restart redis


Далее в файл конфигурации config/database.php добавляем новый параметр в опции Redis:

'redis' => [
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
'scheme' => env('REDIS_SCHEME', 'tcp'), // этот ключ
],

// ...
],


Значение tcp позволит работать с Redis "как обычно".

После этих манипуляций меняем настройки окружения приложения на сервере:

-REDIS_HOST=redis
-REDIS_PASSWORD=null
-REDIS_PORT=6379
+REDIS_HOST=/var/run/redis/redis-server.sock
+REDIS_PORT=null
+REDIS_SCHEME=unix


Не забудьте перекэшировать конфиги (php artisan optimize) и перезапустить php-fpm или Laravel Octane, в зависимости от того чем пользуетесь. А также очереди в супервизоре - их также нужно перезапустить.

И всё, теперь взаимодействие веб-приложения с Redis будет осуществляться не через TCP, а по сокетам, что даёт прирост скорости взаимодействия примерно в 50%.

https://www.laravel-enlightn.com/docs/performance/redis-single-server-analyzer.html
🔥8👍1
⚡️ Выполнение любых действий в процессе развертывания? Легко!

Создавайте специальные классы для одноразового или многоразового использования, которые могут выполняться автоматически после каждого развертывания. Идеально подходит для создания и обновления данных, подготовки изображений или других файлов, связи с внешними сервисами, выполнения служебных команд и любых других.

Этот пакет предназначен для вас, если...

- требуется регулярное обновление данных после деплоя;
- часто выполняете какие-либо действия после развертывания;
- иногда забываете выполнить одно конкретное задание, и всё идет наперекосяк;
- код захламлён заданиями, которые больше не используются;
- коллегам постоянно нужно напоминать о необходимости выполнить это одно задание после некоторых изменений в базе данных
вы часто засеваете или обрабатываете данные в файле миграции (что является большим недопущением!)

Просто установите Laravel Deploy Operations и забудьте о боли!

В качестве плюшек доступны опции, среди которых:

- Одноразовое или многоразовое выполнение;
- Запуск команд в два этапа - «до» и «после» какого-то действия;
- Активация транзакций;
- Проверка среды запуска (only или exclude)
- Лёгкое создание файла при помощи плагина Laravel Idea.

Подробнее читайте в документации: https://deploy-operations.dragon-code.pro/getting-started/installation.html
2
🏗 Экспорт данных из таблиц при "схлапывании" миграций? Легко!

Устали экспортировать данные руками или поддерживать выполняющие это действие скрипты? Или не "схлапываете" миграции именно потому что нет простого решения для экспорта данных из определённых таблиц, а в папке скопилось под тысячу файлов миграций, а то и больше?

Решение есть! Встречайте DDD - Database Data Dumper.

Теперь при выполнении консольной команды php artisan schema:dump в файл экспорта также будет экспортировано и содержание выбранных Вами таблиц.

Просто установите зависимость:

composer require dragon-code/laravel-data-dumper


И добавьте в конфигурационный файл config/database.php новый ключ:

return [
// ...
'schema' => [
'tables' => [
// здесь нужно перечислить наименования
],
],
];


Укажите наименование таблиц и/или ссылки на модели и всё, данные будут экспортированы!

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

Нюанс лишь один - при "схлапывании" миграций с передачей параметра --prune, то есть с удалением "схлопнутых" файлов, в Laravel 11.35.2 и ниже, файлы удаляться не будут так как те версии Laravel не содержали эвент отвечающий за факт вызова удаления файлов, а вот начиная с 11.36 эвент есть.

https://github.com/TheDragonCode/laravel-data-dumper
🔥3🤩1
Laravel-Lang теперь поддерживает Laravel Starter Kits 😀

Просто установите библиотеку и обновите локализации! Да, так просто!

Также можно просто установить laravel-lang/common. Переводы для Starter Kits теперь устанавливаются вместе с ним 🥳

https://laravel-lang.com/packages-starter-kits.html
4
📦 Огромный JS файл при компиляции приложения с использованием сборщика Vite? Вызов принят!

Всё что нужно для решения проблемы - это указать что следует "чанковать".

Например, в приложении установлены следующие зависимости:

"devDependencies": {
"@tailwindcss/postcss": "^4.0.6",
"@tailwindcss/vite": "^4.0.6",
"apexcharts": "^4.5.0",
"axios": "^1.7.4",
"concurrently": "^9.0.1",
"laravel-vite-plugin": "^1.0",
"postcss": "^8.5.2",
"sass-embedded": "^1.83.4",
"tailwindcss": "^4.0.6",
"vite": "^6.0",
"vite-plugin-static-copy": "^2.2.0"
}


Вынесем условно системные в один файл и вспомогательные во второй. Для этого в файле vite.config.js нужно добавить конфигурацию, например:

export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
request: ['axios'],
styles: ['tailwindcss'],
charts: ['apexcharts']
}
}
},
cssCodeSplit: true
},
})


И на выходе получаем разделённые файлы.

Нюанса два:

1. Если сам плагин много весит, то его не разбить - можно лишь сами плагины "раскидать по файлам";
2. RollOut разбивает только скриптовые файлы (js, ts) - стили не трогает, поэтому нужно отдельно указывать параметр cssCodeSplit для Vite.

В документации по Vite пишут использовать плагин `splitVendorChunkPlugin`, но в Vite 6.2 он отмечен как `deprecated` и взамен рекомендуется использовать "прямые" опции для `rollup`, конструкция которых приведена в этом посте.


Подробнее можно прочитать здесь:

- https://v3.vitejs.dev/guide/build.html#chunking-strategy
- https://rollupjs.org/configuration-options/#output-manualchunks
👍6🔥4👏1🤝1
Убедиться в том, что все запросы, отправленные через Http клиент, были замоканы во время выполнения тестов, можно используя метод Http::preventStrayRequests().

После его объявления все запросы, не имеющие перехвата через Http::fake(), будут выбрасывать ошибку вместо отправки реального запроса.

https://laravel.com/docs/12.x/http-client#preventing-stray-requests
👍6🔥31
JetBrains выпустили свежий релиз Writerside 2025.03.8312 для документации

Киллер-фича в отказе от продаж. Изначально Writerside разрабатывался как платный проект в стадии EAP, а с 11-го марта 2025-го официально прекратил претендовать на платную роль. Но и вместе с тем Брейнсы отказались поддерживать отдельную IDE на её базе в пользу плагина.

Что нового:

- Теперь можно в рамках одного репозитория создавать несколько документаций благодаря новой фичи множественной сборки;

- Добавлена возможность экспорта контента документации в текстовые файлы для использования с LLM;

- Добавили новый формат карточек;

- Добавили новые иконки соцсетей в футер;

- Улучшили ссылки, вебхуки, пути, типы, примеры и другие улучшения и фиксы

https://www.jetbrains.com/help/writerside/8312.html
🔥3
🚀 Полезные плагины для PhpStorm

- Laravel Idea - незаменимый помощник для работы с Laravel.

- CodeGlance Pro - отображение скроллера "как у sublime".

- Developer Tools - набор полезных хелперов для разработки. Есть также "быстрый запуск" в правом боковом меню.

- Elasticsearch - работа с Эластиком.

- Json Parser - парсер json строк.

- Mermaid - построение графиков и функций Mermaid.

- PHP Annontations - улучшение работы с аннотациями.

- PHP Expections - расширенный аудит PHP кода с возможностью быстрого применения хот-фиксов влияющих на быстродействие.

- String Manipulation - работа со строками - смена case, фильтрация, сортировка и другое.

- Translation - быстрый перевод текста по хоткею

- Writerside - плагин для работы с документацией Writerside
👍113❤‍🔥1
Отвлечёмся немного 🙂
😁15😐1🗿1
Полезное расширение .gitattributes support для PhpStorm

7-го марта нв маркетплейсе JetBrains появилось новое расширение для работы с файлами .gitattributes.

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

Единственное чего не хватает на момент написания этого поста, это подсказок при добавлении файлов и папок. Но, скорее всего, рано или поздно, он появится.

https://plugins.jetbrains.com/plugin/26477--gitattributes-support
👍6
Мой набор команд для обновления контейнера WSL в Windows

wsl --install -d Ubuntu-24.04
wsl --set-default -d Ubuntu-24.04
wsl --unregister -d Ubuntu-22.04
wsl --update
wsl

sudo su

apt update && apt upgrade -y
apt install -y lsb-release ca-certificates apt-transport-https software-properties-common postgresql-client imagemagick

add-apt-repository ppa:ondrej/php

apt update && apt install -y php8.4 php8.4-curl php8.4-mbstring php8.4-xml php8.4-zip php8.4-bcmath php8.4-intl php8.4-readline php8.4-redis php8.4-sqlite3 php8.4-opcache php8.4-pdo php8.4-mysql php8.4-pgsql php8.4-imagick

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php && php -r "unlink('composer-setup.php');" && mv composer.phar /usr/local/bin/composer

composer global require ergebnis/composer-normalize

apt update && apt upgrade -y && apt autoremove --purge -y && apt autoclean -y && apt clean -y

Конечно, кроме этого нужно также создать ssh ключ, запретить парольную аутентификацию и закрыть снаружи все порты кроме 80 и 443 для начала.
👍64🔥2🤔2
Laravel-Zero - это микро-фреймворк для консольных приложений на базе Laravel Framework, позволяющий легко и быстро разрабатывать функционал работающий без веба. Но инициатором этой статьи стал кейс при использовании Laravel Prompts с несколькими часами потраченного времени.

Для экономии Вашего времени при столкновении с этой ошибкой или вовсе преждевременным её устранением, добро пожаловать в пост:

https://habr.com/ru/articles/892010/
50🔥4👍2
Laravel-Lang: 6 миллионов скачиваний — присоединяйтесь к успешным проектам!

🎉 Наш проект Laravel-Lang: Lang достиг важной вехи — 6 миллионов скачиваний на Packagist! 🎉

С момента своего перехода в 2020 году из местечкового caouecs/laravel-lang, проект вырос до 24 репозиториев и объединил 32 талантливых специалиста. Мы гордимся тем, что наше решение помогает тысячам разработчиков по всему миру.

Почему выбирают Laravel-Lang?

- Простота использования.
- Регулярные обновления.
- Поддержка большого и дружного сообщества.

Не упустите возможность локализовать свои проекты с помощью Laravel-Lang. Присоединяйтесь к нам и убедитесь, насколько легко и удобно работать с нашим продуктом!

👉 Посетите наш сайт и узнайте больше: https://laravel-lang.com
7🎉1
Коротко о том как работает метод "Cache::flexible()" в Laravel

Метод Cache::remember "запоминает" данные на определённый промежуток времени, по истечении которого, следующий за ним запрос будет вынужден ожидать вычислений с последующей записью в кэш.

Например, какой-то код выполняется 10 секунд. Таким образом, первый запросивший будет ждать 10 секунд прежде чем получит ответ в случае отсутствия кэшированных данных.

Именно эту проблему и призван решить метод "Cache::flexible()".

Вторым параметром метода указывается массив из двух значений, например, [480, 600], где:

- 600 - это то самое время (TTL) жизни кэша в целом;
- 480 - время, через которое ключ можно считать устаревающим.

В данном примере мы запоминаем значение сроком на 10 минут, а устаревшими данными считаются по истечении 8-ми минут.

Что это значит и как это работает? А работает это довольно просто благодаря функционала Concurrency, работающим с процессами PHP без блокировки ответа.

Другими словами, кэш живёт 10 минут и при постоянном обращении к нему в ответ будет всегда выводиться результат кэширования. В итоге получаем отсутствие ожидания времени выполнения в 10 секунд при "протухшем" кэше ибо протухание "самоустраняется", так сказать.

Допустим, результат запрашивается каждую минуту. При самом первом запросе пользователь будет ждать 10 секунд пока выполнятся какие-то действия, после чего результат будет записан в кэш. При ежеминутных запросах Cache::flexible() "увидит" что наступило время истечения срока годности токена и создаёт не блокирующий процесс на его обновление. Таким образом, при запросе на 9-й минуте пользователь всё также быстро получит результат кэша потому как он был записан, а фоновый процесс выполнит то самое действие и обновит этот самый кэш.

Вот и получаем что при постоянных запросах код становится, так сказать, "самопрогреваемым".

Если прямо "на пальцах", то при вызове Cache::flexible() создаётся два ключа - один с данными на 600 секунд, а второй на 480 как метка времени.
При повторном вызове метода проверяется наличие того самого второго ключа и, пока он жив, данные считаются актуальными.
Как только тот второй пропадает, запускается функция механизм Concurrency, создающий фоновый процесс для обновления данных, а ответ из запроса по-прежнему возвращается из кэша.
Фоновый процесс, закончив выполнение, кладёт свежие данные в кэш и создаёт новый вспомогательный ключ сроком на 480 секунд.
И так по кругу.

Минус у этого способа один - если эти данные будут запрашиваться, скажем, раз в 20 минут, тогда при каждом запросе нужно будет ожидать 10 секунд, так как в кэше этих данных уже не будет. Решить эту проблему можно двумя способами в зависимости от нужд приложения - либо создать крон-команду с "прогревом", т.е. когда команда раз в N времени будет просто запрашивать этот механизм, таким образом создавая прецендент на срабатывание, либо увеличить срок жизни кэша.

https://laravel.com/docs/12.x/cache#swr
👍4🔥4
Синий «экран смерти» УМЕР: Microsoft перекрасили культовый экран. Теперь при ошибке будет виднеться плашка с зелёным или чёрным фоном.

Самый ор это причина апдейта — страх нового поколения юзеров, которые впервые сталкиваются с «экраном смерти». По этой причине убрали QR-код и смайлик.

Ушла эпоха 🫡

GPT News | ChatGPT BOT
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😢2😭1👻1