Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.5K subscribers
1.75K photos
30 videos
29 files
4.56K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/M561SQ

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
🤩 PhpStorm + Laravel: меньше прыжков между окнами

В PhpStorm появился отдельный Laravel Tool Window, который собирает несколько вещей, ради которых раньше приходилось открывать терминал, логи и браузер.

🤩 запуск Artisan-команд прямо из IDE
🤩 просмотр локальных и Sentry-логов
🤩 разбор ошибок с AI
🤩 управление Laravel Cloud deployments и env-переменными

🤩 Особенно интересен сценарий с ошибкой: открыл лог → нашёл exception → разобрал его через AI, не копируя stack trace вручную.

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
11😁4🥱1
🤩 webmozart/assert: guard-условия без простыней if/throw

Вместо:


if (!is_string($name) || $name === '') {
throw new InvalidArgumentException(
'Name must be a non-empty string'
);
}


можно написать:


use Webmozart\Assert\Assert;

Assert::stringNotEmpty($name);
Assert::email($email);
Assert::range($age, 18, 99);
Assert::allInstanceOf(User::class, $users);


🤩 Библиотека берёт на себя проверку условия и выбрасывает исключение с понятным сообщением, если оно нарушено. Особенно удобно использовать такие проверки на границах приложения — например, в конструкторах Value Object или сервисов.

Установка:


composer require webmozart/assert


📌 В итоге вместо десятков однотипных if/throw получаем компактные и единообразные guard-условия.

🔗 Документация

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20
🤩 5 PHP-приёмов, которые стоит держать в арсенале

Без библиотек — всё уже есть в языке:


// Быстро собрать список/словарь
$emails = array_column($users, 'email');
$map = array_column($users, 'email', 'id');

// Присвоить только если значения ещё нет
$config['timeout'] ??= 30;

// Объединить массивы с переопределением
$query = [...$defaults, 'limit' => 50];

// Проверить, является ли массив списком
array_is_list([1, 2, 3]); // true

// Передать метод напрямую как callable
$ids = array_map(User::getId(...), $users);


Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
🤖 PhpStorm научился управлять skills для coding agents

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

В PhpStorm 2026.2 появился отдельный Skills Manager:

🤩 устанавливать skills из каталога
🤩 подключать внешние registry, включая GitHub
🤩 импортировать skills из Claude Code и Codex
🤩 управлять ими прямо из IDE

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

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101🥱1
🤩 symfony/uid: UUIDv7 вместо автоинкремента

Автоинкремент удобен, но плохо подходит для распределённых систем. UUIDv4 решает проблему уникальности, зато случайные значения могут хуже работать с B-tree индексами.

🔘 UUIDv7 — компромисс: содержит timestamp и случайную часть, поэтому идентификаторы генерируются примерно в хронологическом порядке.


use Symfony\Component\Uid\Uuid;

$id = Uuid::v7();

echo $id->toRfc4122();
// 0192f8a1-...

echo $id->getDateTime();
// время, закодированное в UUID


🔘 А если нужен более компактный идентификатор для URL:


$id->toBase58();


🔘 Symfony UID можно использовать отдельно от Symfony:


composer require symfony/uid


Особенно интересно для распределённых сервисов, где ID нужно генерировать независимо от БД.

📍 Ссылка на документацию

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
10
🤩 Wave — стартер-пак для разработки SaaS-приложений

Библиотека написана на Laravel и включает все необходимое:

— аутентификация,
— профили пользователей,
— биллинг,
— подписка,
— роли и права доступа,
— уведомления и административная панель.


Инструмент упрощает создание SaaS-приложений, предоставляя необходимые базовые компоненты и гибкие возможности для дальнейшей настройки

🔗 GitHub

Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102😁1
🧬 Вы кешируете запросы в Redis, но забыли про OPcache?

PHP компилирует каждый .php-файл в байткод при каждом запросе — если не настроен OPcache. Это означает лишние CPU-циклы на парсинг даже самого тривиального хелпера.

🟡 Минимальный конфиг для прода:


; включаем
opcache.enable=1
opcache.enable_cli=1

; кол-во кешируемых файлов (>= числа файлов в проекте)
opcache.max_accelerated_files=20000

; размер разделяемой памяти (MB)
opcache.memory_consumption=256

; кешируем строки — экономим RAM
opcache.interned_strings_buffer=16

; в продакшне: 0 (не проверять изменения файлов)
opcache.validate_timestamps=0


Почему validate\_timestamps=0 в проде

При каждом запросе PHP проверяет mtime файла на диске. На высоких RPS — это сотни лишних stat()-syscall'ов в секунду. Инвалидируйте кеш вручную через opcache_reset() или перезапуск PHP-FPM при деплое.

💡 Хотите проверить, что лежит в кеше и сколько памяти занято? Используйте opcache_get_status() — или поставьте opcache-gui для визуального мониторинга.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
🔎 Как быстро увидеть, что вы изменили в php.ini

В PHP 8.5 появилась малоизвестная CLI-опция:


php --ini=diff


Она показывает только настройки, которые отличаются от стандартной конфигурации PHP.

Полезно, когда нужно:

— разобраться, чем production отличается от дефолта;
— проверить Docker-образ;
— перенести конфигурацию на новый сервер.

Особенно удобно вместо ручного сравнения огромного php.ini.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥3
🤩 PHP и атрибуты: #[Override]

В PHP 8.3 появился атрибут #[Override], который помогает ловить ошибки при переопределении методов.

Если метода find() нет в родительском классе или интерфейсе, PHP сообщит об ошибке.


Полезно при рефакторинге: переименовал метод в базовом классе — наследники не останутся с «тихо сломанным» override.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🧠 spatie/laravel-data: типизированные DTO для Laravel

Вместо массивов вроде:


$email = $data['email'];
$quantity = $data['quantity’];


🔘 можно описать структуру данных отдельным классом:


class OrderData extends Data
{
public function __construct(
public string $email,
public int $quantity,
public ?string $promoCode = null,
) {}
}


🔘 И создать объект из входных данных:


$order = OrderData::from($request->all());

echo $order->email;


Дальше работают обычные типы PHP и автодополнение IDE, а laravel-data добавляет маппинг, валидацию, вложенные DTO и преобразование обратно в массив или JSON.

Удобный вариант, когда DTO в Laravel становится больше, чем просто набором полей.

🔗 ⁠Документация

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11😁3
💥 Именованные аргументы вместо загадочных true/false

Такой вызов приходится расшифровывать:


createUser('Аня', true, false, true);


🔴 Что означает каждый bool?

С PHP 8.0 можно передать аргументы по имени:


createUser(
name: 'Аня',
isAdmin: true,
sendEmail: false,
verified: true,
);


Сигнатуру метода менять не нужно — именованные аргументы работают прямо с существующими параметрами.

🔴 А ещё можно пропускать необязательные параметры и передавать только нужные:


createUser(
name: 'Аня',
verified: true,
);


Никаких зависимостей — просто вызов, который сам объясняет, что именно происходит.

🔗 PHP Docs — Named Arguments

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱11👍8