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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
🔐 Sqids в Laravel: короткие публичные ID

Автоинкрементные ID удобны в базе, но не всегда подходят для публичных URL.

Sqids превращают их в короткие строки:


637 → 4nxk2a


При этом внутри Laravel остаются обычные integer-ключи, связи Eloquent и индексы.

В статье показано, как встроить Sqids в:

🟡 route model binding;
🟡 API Resources;
🟡 foreign keys;
🟡 входящие запросы.

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

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4😢1
This media is not supported in your browser
VIEW IN TELEGRAM
🌸 Вселенная намекает: пора уже начать этот курс

С 14 сентября цены в Proglib Academy вырастут на 20% 👀

Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц 😏

📍 Выбрать курс
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🌚3
🌞 PayZephyr: единый API для платежей в Laravel

Stripe, PayPal, Paystack и другие платёжные системы — через один интерфейс. PayZephyr объединяет работу с 8 провайдерами и предлагает:

— единый API для платежей;
— переключение между провайдерами и failover;
— защиту от повторного списания;
— проверку подписей вебхуков;
— возвраты и подписки.


🔘 Пример:

Payment::amount(100)
->currency('USD')
->pay();


🔘 Возврат:


Payment::refund($paymentId);


🔘 Установка:

composer require payzephyr/laravel


📌 Подойдёт, если приложение работает с несколькими платёжными системами и хочется не писать отдельную интеграцию для каждой.

🔗 ⁠GitHub

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍4
😭 Как не потратить недельный лимит AI-кодинга за три дня?

Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.

🔘 Поговорим о том:

— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.

✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.

⬇️ 17 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок

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

🔗 Зарегистрироваться на вебинар⁠
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3🥱1
💰 Версионирование бизнес-правил в Laravel

Бизнес-правила меняются, но старые решения должны оставаться объяснимыми. Например, цена для одного и того же автомобиля может отличаться в зависимости от даты счёта.

Пакет Laravel Rulebook помогает:

🤩 хранить правила в отдельных PHP-классах;
🤩 задавать периоды действия;
🤩 выбирать правило по приоритету;
🤩 объяснять, почему оно победило;
🤩 сохранять результат решения в snapshot.


Пример:


$decision = $rulebook->resolveAt(
subject: $vehicle,
at: $invoice->issued_at,
context: $pricingContext,
);
$price = $decision->outcome();
$reason = $decision->winningResult()->reason();


Подходит для pricing, billing, eligibility и других сценариев, где важна история решений.

🔗 ⁠Laravel Rulebook на Packagist

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3
⚡️ Symfony 8.2: команды Console теперь можно вызывать через пробелы

В Symfony команды обычно записываются через ::


php bin/console tenant:users:import customers.csv


➡️ В Symfony 8.2 появился альтернативный синтаксис:


php bin/console tenant users import customers.csv


Оба варианта запускают одну и ту же команду.

Главное отличие — в spaced-синтаксисе каждый уровень может обрабатывать собственные опции:


php bin/console tenant --name=acme users import customers.csv --dry-run


Здесь:

🔘 tenant получает опцию --name;
🔘 users — промежуточный уровень;
🔘 import запускает конечную команду;
🔘 --dry-run передаётся последней команде.


Для доступа к параметрам родительских команд появился CommandChain:


public function __invoke(
CommandChain $chain,
#[Argument] string $file,
): int {
$tenantName = $chain
->getInput('tenant')
?->getOption('name');

// ...
}


Также Symfony 8.2 позволяет описывать целые группы команд в одном классе через #[AsCommand].

📌 Особенно полезно для CLI-приложений с многоуровневой структурой — например, docker compose, git или административных инструментов.

🔗 ⁠Читать подробнее

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😢2
🛠 `str_contains` и семья: проверяем строки без ловушек

Проверка через strpos годами путала новичков:


if (strpos($url, 'https') !== false) {
// ...
}


➡️ Почему нужен именно `!== false`?
Потому что совпадение в начале строки возвращает позицию 0, а 0 в PHP может трактоваться как false.

С PHP 8.0 есть три функции, которые сразу возвращают `bool`:


str_contains($email, '@'); // содержит подстроку
str_starts_with($url, 'https://'); // начинается с
str_ends_with($file, '.pdf'); // заканчивается на


Код читается проще — без проверки позиции и !== false.

📌 strpos всё ещё нужен, если требуется узнать позицию совпадения.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱4🔥2
А вы уже забрали свой подарок ко Дню программиста?

К вашему профессиональному празднику Tproger, Proglib, Столото, Центральный университет и SmartApe собрали целую коробку подарков. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/ZX3b

Реклама. ИП Михайлишина Гузель Фаниловна, erid: 2W5zFJrVGHw
👍2🥱1
🌞 В Symfony 8.2 появилось 29 новых Bundle — теперь компоненты вроде Mailer, Messenger и Cache сами поставляют конфигурацию и сервисы.

Было:


framework:
mailer:
dsn: '%env(MAILER_DSN)%’


Стало:


mailer:
dsn: '%env(MAILER_DSN)%’


Старый framework.* при этом продолжает работать — существующие проекты менять не нужно.

➡️ Ещё одно изменение: Forms больше не включает Validation автоматически. Для него теперь нужен symfony/validator.

🔗 Источник

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
❓ Какие существуют проблемы в многопоточной среде?

Основные проблемы многопоточности:

1️⃣ Race Condition — когда результат работы зависит от порядка выполнения потоков. Например, два потока одновременно изменяют одну переменную без синхронизации.

2️⃣ Deadlock — взаимная блокировка, когда потоки ждут друг друга. Классика: поток А держит ресурс 1 и ждёт ресурс 2, а поток Б держит ресурс 2 и ждёт ресурс 1.

2️⃣ Livelock — потоки активны, но не могут продолжить работу, постоянно реагируя на действия друг друга. Например, как два человека в коридоре, которые одновременно пытаются уступить дорогу.

4️⃣ Starvation — поток никогда не получает доступ к ресурсу из-за того, что другие потоки постоянно его перехватывают.

5️⃣ Memory Visibility — изменения, сделанные одним потоком, могут быть не видны другим из-за кэширования в CPU

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤3👾2
⚡️ PHP 8.6 выйдет 19 ноября 2026 года. Сейчас версия находится в beta.

Самые заметные изменения:

🔴 Partial Function Application

Можно зафиксировать часть аргументов функции:


$makeSlug = str_replace(' ', '-', ?);

$makeSlug('Hello World');
// Hello-World


🔴 clamp()

Наконец отдельная функция для ограничения значения:


clamp(101, min: 0, max: 100);
// 100


🔴 Time\Duration

Тип для представления длительности с наносекундной точностью:


$delay = Duration::fromMilliseconds(100)
->multiplyBy(2 ** $attempt);


🔴 Readonly-свойства с default value


public string $name = 'migration’;


И ещё: для новых установок PHP меняет defaults native sessions — strict_mode и HttpOnly включаются, а SameSite становится Lax.

📌 Feature freeze — 22 сентября, первый RC — 24 сентября.

🔗 Подробнее

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍7🥱4
🚀 Свежий релиз Laravel 13 с набором улучшений и исправлений

✅ добавлена поддержка valkey:// и valkeys://;
✅ улучшена работа tagged cache и memoized cache;
✅ появились createQuietly() и createManyQuietly() для BelongsToMany;
✅ worker теперь можно настроить так, чтобы не завершать его при timeout job;
✅ добавлены server options для PostgreSQL;
✅ улучшены retries для Cloud jobs;
✅ inplace() для DDL-операций с индексами и foreign keys;
✅ улучшена работа Eloquent Collection::duplicates();
✅ обновлена поддержка brick/math 0.20 & 1.0.

Плюс десятки фиксов для очередей, Redis, SQLite, Cloud, Artisan, routing и Eloquent.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🎉5🥱1
🛠 Symfony 8.2 научился автоматически генерировать JSON Schema для конфигурации приложения

При сборке контейнера в debug-режиме появляется:


config/schema.json


➡️ Схема объединяет настройки всех установленных bundle и позволяет IDE:

— подсказывать доступные параметры;
— показывать описания и значения по умолчанию;
— подсвечивать неизвестные и deprecated-опции;
— проверять типы значений.


➡️ А lint:yaml теперь может использовать эту же схему для проверки конфигурации в CI:


php bin/console lint:yaml config/packages/ --check-schema=config/schema.json


Получается довольно практичное улучшение: ошибки в YAML-конфигурации можно поймать ещё до запуска приложения.

🔗 Источник

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
👍 5 способов встроить AI в Laravel

Laravel AI SDK позволяет добавлять AI-функции прямо в приложение — без отдельного Python-сервиса и ручной работы с API.

В гайде разобраны практические сценарии:

— автоматический разбор и приоритизация тикетов;
— AI-ассистент с доступом к данным через tools;
— семантический поиск и RAG;
— действия с обязательным подтверждением человека;
— транскрибация голосовых сообщений.


Отдельно показано, как работать со structured output, очередями, фейками для тестов и fallback между провайдерами.

🔗 Доступно по ссылке

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
🌞 PHP умеет искать в массиве без foreach

В PHP 8.4 появились array_find(), array_find_key(), array_any() и array_all().

Вместо:


foreach ($users as $user) {
if ($user->isAdmin()) {
$admin = $user;
break;
}
}


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


$admin = array_find($users, fn($user) => $user->isAdmin());


Мелочь, но код сразу читается как то, что именно мы хотим найти, а не как инструкция для обхода массива.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👏3🤔2👾2❤1
🤔 Что выведет код?

❤️ — 1
🔥 — 2
👍 — 12
👾 — Fatal error

👇 Правильный ответ (нажми, чтобы прочитать):

🔥 2 — finally выполняется даже после return из try.

Причём return внутри finally перезаписывает результат, который должен был вернуть try.

⚠️ Ловушка на собесе: если убрать return 2 из finally, функция вернёт 1.


🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥35❤8👍5🤔4
🔐 ramsey/uuid — UUID без самописного кода

Библиотека помогает генерировать, парсить и валидировать UUID, а также работать с ними как с объектами.


use Ramsey\Uuid\Uuid;

$id = Uuid::uuid4();

echo $id->toString();


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

🔗 GitHub

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🌚3❤1🔥1
💡 Laravel-фича, которая спасает тесты от случайных запросов

Http::preventStrayRequests() запрещает тестам обращаться к реальным API.

Например:


Http::preventStrayRequests();

Http::fake([
'example.com/*' => Http::response('ok'),
]);

Http::get('https://example.com/users'); // ✅ ok
Http::get('https://proglib.io'); // ❌ исключение


Так тесты не зависят от доступности внешних сервисов и не отправляют неожиданные запросы в CI.

➡️ Особенно полезно, когда локально всё проходит, а в CI внезапно находится запрос, который забыли замокать.

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍1🔥1