Привет Хабр! Это мой первый пост, и я просто хотелось спросить, стоит ли уходить в Go? У меня есть небольшая база в программировании, делал сайты на реакт и ларавел, реализовывал бэкенд с Солид и паттернами, писал на нативном пхп файловые обменники и апи. Не много знаю базы данных соответственно, гит, докер. Сейчас засматриваюсь на Go, где то вычитал что мол крутая штука для бигтехов в России, а сам я студент и пока сижу на шее у родителей, но в следующем году я окончу к курс, и хочу где то месяца за 4-5 изучить все нужное в го и во всех других сопутствующих технологиях для разработки высоконагруженных приложений и микросервисов и всякого подобного. Стоит ли сворачивать на этот путь, или добить стек ларавел плюс вью? Немного боюсь, так как слышал что в го нужны уже 25 летние синьоры со стажем работы минимум в 20 лет, но и не хочется проторчать всю жизнь в челябинской галере на фуллстеке за 70 деревянных на руки.

Laravel *
Бесплатный веб-фреймворк с открытым кодом
Multipart Upload в Laravel: загрузка больших файлов в S3
Что такое Multipart Upload и зачем он нужен?
Multipart Upload - это метод загрузки больших файлов в S3, при котором файл разбивается на части (чанки) и загружается параллельно. Это решает несколько ключевых проблем:
Надёжность - при обрыве соединения можно перезагрузить только failed-часть
Производительность - параллельная загрузка частей ускоряет процесс
Обход ограничений - позволяет загружать файлы больше 5 ГБ (максимальный размер для простой загрузки)
Как реализовать Multipart Upload в Laravel
1. Установка зависимостей
Убедитесь, что у вас установлен AWS SDK (обычно идёт с Laravel): composer require aws/aws-sdk-php
2. Пример реализации
use Illuminate\Http\UploadedFile;
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;
private function uploadFileToS3(UploadedFile $file, string $fileName): string
{
// Получаем клиент S3 из Storage фасада
$client = Storage::disk('s3')->getClient();
// Путь для сохранения в S3 (можно добавить подпапки по дате и т.д.)
$s3Path = $this->s3path.'/'.$fileName;
// Настройки загрузчика
$uploader = new MultipartUploader($client, $file->getPathname(), [
'bucket' => config('filesystems.disks.s3.bucket'),
'key' => $s3Path,
'part_size' => 5 * 1024 * 1024, // 5 MB за часть чанка
'concurrency' => 3, // Количество параллельных загрузок
'before_initiate' => function ($command) {
// Можно добавить метаданные или ACL
$command['ACL'] = 'public-read';
},
'before_upload' => function ($command) {
// Логирование перед загрузкой каждой части
Log::info('Uploading part', [
'part_number' => $command['PartNumber'],
'upload_id' => $command['UploadId']
);
},
]);
try {
// Запускаем процесс загрузки
$result = $uploader->upload();
// Возвращаем полный путь к файлу в S3
return $s3Path;
} catch (MultipartUploadException $e) {
// Логируем ошибку
Log::error('Multipart upload failed', [
'file' => $fileName,
'error' => $e->getMessage(),
'upload_id' => $e->getUploadId()
]);
// Можно попробовать возобновить загрузку
// $this->resumeUpload($e->getUploadId(), $s3Path);
throw new \Exception('File upload failed: '.$e->getMessage());
}
}
3. Дополнительные методы для работы с Multipart Upload
Возобновление прерванной загрузки
private function resumeUpload(string $uploadId, string $s3Path): string
{
$client = Storage::disk('s3')->getClient()
$uploader = new MultipartUploader($client, null, [
'bucket' => config('filesystems.disks.s3.bucket'),
'key' => $s3Path,
'upload_id' => $uploadId,
'part_size' => 5 * 1024 * 1024,
]);
try {
$result = $uploader->upload();
return $s3Path;
} catch (MultipartUploadException $e) {
throw new \Exception('Resume upload failed: '.$e->getMessage());
}
}
Когда использовать Multipart Upload
Файлы больше 100 МБ - для меньших файлов обычная загрузка может быть эффективнее
Ненадёжные соединения - где возможны обрывы
Критичные по времени загрузки - когда нужно максимально ускорить процесс
Оптимизация параметров
part_size:
5-10 MB - хороший баланс для большинства случаев
Увеличивайте для очень больших файлов (>1 GB)
concurrency:
3-5 - оптимально для большинства случаев
Можно увеличить для очень быстрых соединениях
Что ждёт в следующих статьях?
🔹 Ограничения PHP при работе с файлами (максимальный размер загрузки, timeout-ы, memory_limit)
🔹 Глубокий разбор S3 — Versioning, Lifecycle Policies, Cross-Region Replication
🔹 Продвинутое потоковое чтение/запись — обработка гигабайтных логов, CSV и медиа без нагрузки на память
🔹 CDN-оптимизация — Geo-DNS, кеширование, пресеты для изображений
🔹 Секретные фишки — Signed URLs, временные доступы, обработка через очереди
Остались вопросы или есть темы, которые хотите разобрать подробнее? Пишите в комментариях — ваши пожелания станут основой для следующих статей!
Лучший кейс по MoonShine: время голосовать! 🗳
Привет, друзья! 👋
Наш конкурс кейсов использования MoonShine (админ-панели для Laravel) вышел на финишную прямую. Пришло время выбрать лучшего из лучших! 🏆
Оформлены кейсы:
Теперь слово за вами! 🚀 Голосуйте за самый интересный кейс. Победитель получит PHP-слоника 🐘. И звание "Герой MoonShine 2024"! 😜 Голосуем тут:
https://t.me/moonshine_ru/5/15535
📅 Голоса принимаются до 31 декабря в 12:00 (мск)!
Давайте вместе выберем самого креативного и талантливого автора-разработчика в нашем комьюнити!
🎉 Релиз MoonShine v3 админ панели для Laravel! 🎉
Друзья, у нас праздник!
10 декабря наконец-то зарелизили MoonShine v3 (open-source панели администратора для проектов на Laravel).
Кто не вкурсе, вот статьи:
Это было непросто. Пришлось отложить дату релиза, но зато успел всё сделать что запланировано. 🔥
Что было на стриме:
🕰 Краткая история создания MoonShine — от первых шагов до сегодняшнего дня.
🚀 Релиз на GitHub, деплой новой версии лендинга и документации.
🛍 Демонстрация маркетплейса приложений для MoonShine
Обязательно посмотрите запись стрима! Вы не только узнаете больше о MoonShine, но и вдохновитесь на свои проекты.
Немного выдохну, и сделаю подробный разбор по возможностям MoonShine v3.
Сайт проекта - https://moonshine-laravel.com/
Чат в телеграм - https://t.me/moonshine_ru
#MoonShine #релиз #CutCode

Вводные
В современном мире разработка корпоративных приложений требует высокой скорости, гибкости и использования проверенных решений. Проект Enterprise Skeleton был создан, чтобы помочь разработчикам сосредоточиться на бизнес-логике, а не на рутинных задачах настройки инфраструктуры. Этот шаблон включает современные инструменты, лучшие практики и интеграции для построения масштабируемых приложений.
Особенность проекта в его модульной архитектуре, которая поддерживает популярные PHP-фреймворки (Symfony и Laravel), и в возможности быстро адаптировать его под нужды конкретной команды или компании.
Если вы заинтересовались, начните с установки: GitHub репозиторий
Установка
Начать работу с проектом очень просто, даже если вы не являетесь экспертом в настройке инфраструктуры. Для установки выполните следующие шаги:
1) Клонируем проект:
git@github.com:dykyi-roman/enterprise-skeleton.git
2) Копируем базовую конфигурацию:
make copy-config
3) Выбираем нужные нам сервисы:
server=nginx # Web Server: nginx, apache
database=postgres # Database Service: postgres, mysql
;nosql=mongodb # NoSQL Database Service: mongodb, cassandra
cache=redis # Cache Service: redis, memcached
;search=elasticsearch # Search: elasticsearch, solr
;message=kafka # Message Broker: rabbitmq, kafka
docs=swagger # API Documentation: swagger
;mailer=mailhog # Mail Sandbox: mailhog, papercut
;monitoring=grafana # Monitoring: grafana, zabbix
;logs=kibana # Log Management: kibana, graylog
;job=cron # Scheduling Jobs: cron
4) Для смены фреймворка используйте команду (symfony по умолчанию):
make framework laravel
5) Устанавливаем зависимости и запустите проект:
make install
Основные возможности
Поддержка современных PHP-фреймворков (Symfony, Laravel).
Возможность работы с SQL и NoSQL базами данных (PostgreSQL, MySQL, MongoDB, Cassandra).
Интеграция с брокерами сообщений (RabbitMQ, Kafka).
Мониторинг с использованием Zabbix и Grafana.
Кеширование через Redis и Memcached.
Логирование и аналитика с использованием ELK-стека (Elasticsearch, Logstash, Kibana) или Graylog.
Автоматическое тестирование API через Postman.
Удобный запуск и настройка крон-задач через Docker.
и другие...
Каждая из этих функций адаптируется под ваш проект, что делает Enterprise Skeleton универсальным инструментом для разработки.
Помимо описанных возможностей, проект интересен своей структурой. Например, благодаря доменно-ориентированной архитектуре можно эффективно разделять логику приложения. Это особенно полезно для больших команд, где разработчики работают над отдельными доменами.
Кроме того, я бы рекомендовал использовать Enterprise Skeleton как для вашего нового проекта так и для обучения junior-разработчиков. Он помогает изучить современные подходы в разработке, такие как DDD (Domain-Driven Design), автоматизация тестирования и CI/CD.
Нам нужны контрибьюторы
Проект активно развивается, и мы всегда рады новым участникам. Если вы хотите присоединиться, вот направления, где особенно нужна помощь:
Интеграция Sentry: реализация мониторинга и отслеживания ошибок.
Подключение RoadRunner: добавление высокопроизводительного PHP-сервера.
Интеграция других фреймворков: добавление поддержки Yii, Slim и других популярных PHP-фреймворков.
Чтобы начать, просто форкните репозиторий, создайте новую ветку, внесите изменения и отправьте Pull Request. Мы ждем ваши идеи и улучшения!
Выводы
Enterprise Skeleton — это мощный инструмент для быстрой разработки и масштабирования корпоративных приложений. Он подходит как для небольших стартапов, так и для крупных компаний, которым нужна стабильная основа для приложений.
Пробуйте, участвуйте в разработке и делитесь своим опытом. Вместе мы можем сделать проект еще лучше!
Привет, друзья! 👋
Наткнулся на интересное видео со сравнением Filament и нашего MoonShine! 🎥
https://www.youtube.com/watch?v=HOQZi8E_ED8
Всегда интересно посмотреть на свой продукт глазами других разработчиков. Особенно когда это честное сравнение, без попытки кого-то выделить или принизить. Автор очень детально разобрал оба пакета, и что меня особенно порадовало — отметил именно те моменты, на которые мы делали упор при разработке MoonShine.
Главный вывод автора — ключевое различие между пакетами в использовании Livewire. И тут я полностью согласен! Мы специально отказались от Livewire в MoonShine, чтобы добиться максимальной производительности. Например, при работе с модальными окнами мы делаем всего один запрос при первом открытии, а дальше работаем с кешированными данными.
Кстати, автор также отметил нашу встроенную систему импорта/экспорта и отдельную таблицу для администраторов — это действительно важные фичи, которые мы добавили исходя из реального опыта разработки админок.
Приятно видеть, что наши архитектурные решения замечают и ценят. Хотя, конечно, выбор между Filament и MoonShine всегда будет зависеть от конкретного проекта и предпочтений команды.
Есть специалисты по Filamet? Давайте обсудим 💬

Привет, друзья!
Так как YouTube в последнее время не радует скоростью соединения, сегодняшний стрим по MoonShine решил провести на Twitch в 19:00 МСК:
twitch.tv/cutcoderu
Предлагаем заранее зарегистрироваться на Twitch, чтобы у вас была возможность комментировать и задавать вопросы в реальном времени.
На стриме обсудим последние нововведения в MoonShine, покажу как идёт работа над MoonShine v3.
До встречи на стриме! 🚀

Всех приветствую! Вышел релиз MoonShine 2.18.0 (админ-панелm для Laravel) с кодовым названием “Mango Tango”. 🌙
Подробности в статье.
Давайте кратко расскажу что нового:
@dissnik добавил режим sticky для таблиц ресурса.
class PostResource extends ModelResource {
// ...
protected bool $stickyTable = true;
// ...
}
Появилась возможность заменить шаблонную заглушку аватара профиля на свою
Profile::make()->defaultAvatar("https://ui-avatars.com/api/?name=$name")
Большие улучшения для импорта и экспорта Просто взгляните на пример трансформации enum в строку при экспорте и обратно при импорте
Enum::make('Enum')
->attach(ColorEnum::class)
->useOnImport(fromRaw: static fn(string $raw, Enum $ctx) => ColorEnum::tryFrom($raw))
->showOnExport(modifyRawValue: static fn(ColorEnum $raw, Enum $ctx) => $raw->value)
@djnew добавил режим поиска для компонента Dropdown
Dropdown::make()->searchable()->searchPlaceholder('Search...')
asyncSearch с флагом для замены query builder
Чтобы asyncSearchQuery полностью заменял билдер
asyncSearch(asyncSearchQuery: fn($q) => $q->where(..., ...), replaceQuery: true)
Рубрика BugBusters 🐛
Метрики на небольших экранах
Скролл в сайдбаре
Метод onBoot
Новости MoonShine 3.0
Ядро уже почти готово
Прошли тесты на реальном проекте с пакетом tenancy (с выходом 3 версии нас ждет новая демка)
Сейчас идут тесты интеграции MoonShine в Symfony
После Symfony переходим на фичи 3.0, документацию и всякое вкусное к релизу

Релиз админ-панели для Laravel MoonShine v.2.16
Вышел новый с кодовым именем "Mystical Wildfire"! Давайте взглянем на самое интересное в этом обновлении!
Фокус скрытых элементов формы
Благодаря @DissNik проблема скрытых элементов формы с атрибутами валидации required,min,max,email,pattern канула в лету.
Слайдер изображений
Благодря @djnew был добавлен новый компонент Carousel:
Carousel::make() ->items(['/images/image_2.jpg','/images/image_1.jpg']);
Также добавлена поддержка слайдера изображений для компонентов Card, CardsBuilder.
Команда publish с аргументом типа
Возможность указать сразу тип публикации через команду:
php artisan moonshine:publish assets
Доступные типы:
assets - ассеты MoonShine
assets-template - шаблон для генерации собственной темы
layout - основной layout MoonShine
favicons - blade view с favicons
resources - системные ресурсы (MoonShineUserResource, MoonShineUserRoleResource)
Режим onlyLink для BelongsToMany
Рубрика BugBusters 🐛
https://github.com/moonshine-software/moonshine/compare/2.15.0...2.16.0
Приветствую вас, муншайнеры!?
Сегодня мы зарелизили важный патч. Давайте поговорим о том что изменилось
HasMany оптимизирован и теперь страницы где он присутствуют будут работать на 200% быстрее (к сожалению был не очень приятный артефакт из-за которого мы хранили в памяти все формы элементов)
Важно мы добавили экранирование для поля Text и всех его дочерних полей, поэтому теперь все значения при сохранении и выводе будут экранироваться, но логику можно отключить методом unescaped
Важно Number больше не наследует Text но его поведение не поменялось, тоже самое касается Date и Range
Важно Сегодня в 19-00 по мск будет стрим по нашему любимому MoonShine! Всех жду: https://youtube.com/live/ssxmIDdFv8Y?feature=share
По традиции поговорим про 3 версию MoonShine и я покажу новую структуру проекта, а также взглянем и обсудим последние релизы и патчи.
Также расскажу про курс API который давно ждут, объясню с чем связана задержка и будет ли он.
Привет всем! ?
Сегодня в 19:00 (мск) у нас запланирован стрим по Moonshine. Обсудим обновления и изменения за последний месяц, а также покажу как проходит работа по MoonShine v3.
Если у вас есть какие-либо вопросы или комментарии по MoonShine, можете задать их сейчас.
Заходите - https://www.youtube.com/watch?v=bM-rgGFnO88 . Будет интересно!
? Вышел релиз MoonShine v.2.13.0 с кодовым именем "Red Velvet"!?
Напомню, что MoonShine это open-source админ-панель для проектов на Laravel.
Давайте взглянем на самое интересное в этом обновлении!

Возможноcть изменить query builder у HasMany
HasMany::make()->modifyBuilder(fn(Builder $q) => $q->where('active', 1));
Улучшения для BelongsTo/BelongsToMany полей
Получение значений для BelongsTo/BelongsToMany полей приведено к единому виду и теперь для них всегда доступен valuesQuery и при большом запросе вы сможете самостоятельно его оптимизировать
BelongsTo::make(
__('moonshine::ui.resource.role'),
'moonshineUserRole',
formatted: static fn (MoonshineUserRole $model) => $model->name,
resource: MoonShineUserRoleResource::class,
)
->valuesQuery(fn(Builder $q) => $q->select(['id', 'name']))
Обновилось поле MoonShine Layouts
Исправлена проблема ререндера предыдущих шаблонов
Исправлена проблема исключения декораций
Еще ряд изменений:
Логотип на 404 странице теперь выводится из конфига и если есть желание вывести на 404 логотип отличающийся от дефолтного, то воспользуйтесь ключом logo404
Исправили реактивность внутри HasOne/HasMany
Исправили morphMap для морф полей
Исправили удаление файла при замене и удалении
Сайт MoonShine - https://moonshine-laravel.com
Почему FilamentPHP — это хорошее решение для создания CMS
FilamentPHP — набор Fullstack-компонентов для Laravel. Последнее время мы в AGIMA часто используем его для построения админок. И вот почему:
1. Он красивый
Особенно в сравнении с Bootstrap. Filament же использует компоненты, стилизованные с помощью Tailwind CSS:

Живую демку можно посмотреть и потрогать по этой ссылке.
2. Он доступный
Документация местами бывает так себе, но при наличии живой демки и её исходников можно быстро найти подходящий фрагмент и адаптировать его под себя.
А здесь найдете пример кода для создания формы авторизации.
3. Использует стек TALL (TailwindCSS, AlpineJS, Laravel, Livewire)
Livewire позволяет создавать приложение динамическим. Не нужно писать тонны кода на JQuery, как этого требует тот же Voyager. И, коли уж это Laravel, нам всегда доступны все его возможности.
4. Есть библиотека плагинов
И они закрыли уже почти все насущные проблемы.
Но и минусы у этого решения тоже есть:
Стек TALL можно отнести и к минусам тоже, потому что Livewire иногда кажется достаточно сомнительной затеей.
Filament достаточно прожорливый и требует OPCache и кеширования всего, что можно. И с включенным laravel-debugbar всё начинает тормозить.
Часть плагинов платные.
Код форм порой бывает достаточно… монструозным. Но это решается грамотным переиспользованием кода и разнесением его по разным местам.
Это краткий пересказ статьи Егора Черненка, PHP-разработчика AGIMA — полную версию читайте тут.
Ближайшие события

Привет, поклонники Laravel!
Недавно состоялось обновление админ-панели для Laravel MoonShine v2.11.0 с кодовым названием “Minimal Twist”.
Основа релиза - минималистичный дизайн админки. Часто просили сделать альтернативный вариант дизайна, и как только появилась возможность - реализовали. Выглядит стильно, сам попробовал и, видимо, буду использовать эту тему.
Инструкции по использованию - в PR.
Также в плейлист с гайдами по применению MoonShine добавлено несколько видео из серии tips&tricks.
Сейчас работаем над переводом документации и видеоуроков на английский язык.
В последнее время в MoonShine появилось много нововведений. 11 апреля в 19:00(мск) проведу прямой эфир по MoonShine на канале CutCode. Программа:
установка компактной темы,
обзор новых пакетов для MoonShine,
планы на MoonShine 3,
демонстрация нового концепта организации шаблонов,
еще пара интересных новостей, о которых узнаете на стриме .
Ссылка на эфир - https://www.youtube.com/watch?v=QK_79ct1m1w
Если есть вопросы - можете задать здесь.
Привет, коллеги!
Готовьтесь к необычному испытанию знаний и заряду хорошим настроением! В 19:00 (мск) 13 марта на YouTube‑канале CutCode будет проходить игра‑викторина в стиле «Своей игры».
Будут захватывающие раунды, юмор и увлекательные задания, которые проверят ваши знания о PHP!
В легендарной битве выдающихся PHP умов сойдутся — Адель Файзрахманов, Александр Макаров и Кирилл Несмеянов! Сергей Пантелеев приготовил самые каверзные вопросы и будет в роли ведущего управлять этим мероприятием.
Всех приглашаем поболеть за коллег и самим проверить свои знания. Ну, а чтобы процесс эфира сделать еще интереснее — предлагаем задать сейчас вопросы участникам викторины. Самые интересные вопросы будут разобраны на игре, а их авторы получат возможность участвовать в следующей игре и получить мерч!

?Привет, коллеги! ?
Сегодня релиз MoonShine v2.3.0 с кодовым именем "Bloody Boyarskiy" ?! В релизе ActionButton в режиме async, ColorManager и многое другое. Подробности релиза с примерами кода в статье - https://cutcode.dev/articles/moonshine-23
ВАЖНО - изменились views, favicon вынесены в отдельный blade
? Ура, коллеги!
Рад сообщить, что наконец-то вышла вторая версия MoonShine! Полгода ежедневной активной работы и этот день наконец-то настал! Пришлось немного перенести дату релиза, но это было необходимо для того? чтобы вы могли пользоваться админкой с удовольствием!
Вторая версия MoonShine обладает другой архитектурой и подходом, который я сравниваю с конструктором. Один раз разобравшись с MoonShine можно быстро разворачивать как админки, так и сами сайты на Laravel (уже начал снимать гайд где мы сделаем сайт целиком на MoonShine). Вчера набросал сервис с админкой за 40 минут.
Вышел действительно отличный продукт, который должен попробовать каждый поклонник Laravel!
Вторая версия MoonShine переезжает на новый домен - https://moonshine-laravel.com . Сочный дизайн и новые фишки.

Чек-лист: как понять, что компании нужен карьерный сайт
Пересказываем большую статью в маленьком посте.
Ребята из нашего PHP-направления разработали универсальный бэкенд для карьерных сайтов на Laravel. Наша «коробка» — это пять ключевых фич, они покрывают 90% потребностей рекрутеров. Остальное — кастомные решения. Вот эти фичи:
интеграция с Хантфлоу;
админка с функционалом под создание лендингов;
интеграция с поисковой системой Elasticsearch с синонимичным поиском;
факультативный блок с новостями;
рендеринг картинок для шеринга.
Но как понять, что компании нужен карьерный сайт? Мы составили простой чек-лист на основе нашего опыта. В этом году мы уже сделали шесть подобных проектов, в работе еще два. У большинства заказчиков одни и те же особенности:
✔️ вы много и интенсивно нанимаете, в постоянной работе у вас от 100–150 вакансий;
✔️ вам не хватает возможностей HH и подобных площадок, чтобы показать преимущества компании;
✔️ вам нужна подробная аналитика по каждой позиции.
В статьях по теме иногда предлагают еще два пункта, но они факультативные:
✔️ вам сложно закрывать отдельные позиции, их нужно активнее продвигать;
✔️ у вас сложные тестовые задания, их условия нужно подробно описывать.
Если у вас совпали хотя бы два пункта из этого перечня — пора задуматься о своем карьерном сайте. А если остались сомнения, можно 30 ноября сходить на митап по карьерным сайтам. Там расставим все точки над i.
Больше о «коробке», карьерных сайтах и подборе IT-специалистов — в нашем блоге.
Вклад авторов
pronskiy 4986.0Cutcode 492.6AlexLeonov 249.0snowmage 214.2spasibo_kep 184.1Helldar 153.7dusterio 150.0EproTM 88.0MaxRokatansky 84.4genkovich 75.0