Please open Telegram to view this post
VIEW IN TELEGRAM
😁31🥱3❤2💯2
В PHP 8.5 появилась малоизвестная CLI-опция:
php --ini=diff
Она показывает только настройки, которые отличаются от стандартной конфигурации PHP.
Полезно, когда нужно:
— разобраться, чем production отличается от дефолта;
— проверить Docker-образ;
— перенести конфигурацию на новый сервер.
Особенно удобно вместо ручного сравнения огромного php.ini.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥3❤1
В PHP 8.3 появился атрибут #[Override], который помогает ловить ошибки при переопределении методов.
Если метода find() нет в родительском классе или интерфейсе, PHP сообщит об ошибке.
Полезно при рефакторинге: переименовал метод в базовом классе — наследники не останутся с «тихо сломанным» override.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Вместо массивов вроде:
$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
👍13😁4
Такой вызов приходится расшифровывать:
createUser('Аня', true, false, true);
С PHP 8.0 можно передать аргументы по имени:
createUser(
name: 'Аня',
isAdmin: true,
sendEmail: false,
verified: true,
);
Сигнатуру метода менять не нужно — именованные аргументы работают прямо с существующими параметрами.
createUser(
name: 'Аня',
verified: true,
);
Никаких зависимостей — просто вызов, который сам объясняет, что именно происходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱16👍13
В новой версии Telescope искать и разбирать записи можно без открытия dashboard.
php artisan telescope:list request
php artisan telescope:show latest:request
php artisan telescope:list exception --limit=5
php artisan telescope:list request --tag=Auth:42
php artisan telescope:list --batch=79a09461
php artisan telescope:show latest:exception
Для скриптов и coding agents есть --json:
php artisan telescope:show latest:exception --json
А --full отключает сокращение длинных SQL, сообщений и payload’ов.
В 5.24 также исправили stale-запросы dashboard: при навигации старый polling-запрос больше не должен перезаписывать уже открытый экран.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2👍1
Что реально хочется разобрать? Где чаще всего застреваете? Что пробовали, но так и не получилось нормально внедрить?
Задавайте всё, что давно хотелось спросить
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
🔐 Sqids в Laravel: короткие публичные ID
Автоинкрементные ID удобны в базе, но не всегда подходят для публичных URL.
Sqids превращают их в короткие строки:
При этом внутри Laravel остаются обычные integer-ключи, связи Eloquent и индексы.
В статье показано, как встроить Sqids в:
🟡 route model binding;
🟡 API Resources;
🟡 foreign keys;
🟡 входящие запросы.
🔗 Документация
🐸 Библиотека пхпшника
Автоинкрементные ID удобны в базе, но не всегда подходят для публичных URL.
Sqids превращают их в короткие строки:
637 → 4nxk2a
При этом внутри Laravel остаются обычные integer-ключи, связи Eloquent и индексы.
В статье показано, как встроить Sqids в:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3😢1
This media is not supported in your browser
VIEW IN TELEGRAM
С 14 сентября цены в Proglib Academy вырастут
Так что если курс давно ждёт своего часа — лучше не откладывать ещё на месяц
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6🌚3
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6💯4😁3
Stripe, PayPal, Paystack и другие платёжные системы — через один интерфейс. PayZephyr объединяет работу с 8 провайдерами и предлагает:
— единый API для платежей;
— переключение между провайдерами и failover;
— защиту от повторного списания;
— проверку подписей вебхуков;
— возвраты и подписки.
Payment::amount(100)
->currency('USD')
->pay();
Payment::refund($paymentId);
composer require payzephyr/laravel
Please open Telegram to view this post
VIEW IN TELEGRAM
😁6👍3
Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.
— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1🥱1
Бизнес-правила меняются, но старые решения должны оставаться объяснимыми. Например, цена для одного и того же автомобиля может отличаться в зависимости от даты счёта.
Пакет 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 и других сценариев, где важна история решений.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3
В Symfony команды обычно записываются через ::
php bin/console tenant:users:import customers.csv
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
👍4😢2
Проверка через
strpos годами путала новичков:
if (strpos($url, 'https') !== 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
Please open Telegram to view this post
VIEW IN TELEGRAM
😁15👍3
А вы уже забрали свой подарок ко Дню программиста?
К вашему профессиональному празднику Tproger, Proglib, Столото, Центральный университет и SmartApe собрали целую коробку подарков. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/ZX3b
Реклама. ИП Михайлишина Гузель Фаниловна, erid: 2W5zFJrVGHw
К вашему профессиональному празднику Tproger, Proglib, Столото, Центральный университет и SmartApe собрали целую коробку подарков. Переходите по ссылке, трясите коробку и забирайте свой презент: https://tprg.ru/ZX3b
Реклама. ИП Михайлишина Гузель Фаниловна, erid: 2W5zFJrVGHw
👍2🥱1
Было:
framework:
mailer:
dsn: '%env(MAILER_DSN)%’
Стало:
mailer:
dsn: '%env(MAILER_DSN)%’
Старый framework.* при этом продолжает работать — существующие проекты менять не нужно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3👾2
Самые заметные изменения:
Можно зафиксировать часть аргументов функции:
$makeSlug = str_replace(' ', '-', ?);
$makeSlug('Hello World');
// Hello-World
Наконец отдельная функция для ограничения значения:
clamp(101, min: 0, max: 100);
// 100
Тип для представления длительности с наносекундной точностью:
$delay = Duration::fromMilliseconds(100)
->multiplyBy(2 ** $attempt);
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
🔥11👍6🥱3