es
Feedback
Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter

Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter

Ir al canal en Telegram

Все самое полезное для пхпшника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/bca892d6 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b

Mostrar más

📈 Análisis del canal de Telegram Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter

El canal Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter (@phpproglib) en el segmento lingüístico de Ruso es un actor destacado. Actualmente la comunidad reúne a 10 699 suscriptores, ocupando la posición 11 606 en la categoría Tecnologías y Aplicaciones y el puesto 61 369 en la región Rusia.

📊 Métricas de audiencia y dinámica

Desde su creación el невідомо, el proyecto ha mostrado un crecimiento acelerado, reuniendo a 10 699 suscriptores.

Según los últimos datos del 08 junio, 2026, el canal mantiene una actividad estable. En los últimos 30 días la variación de miembros fue de -44, y en las últimas 24 horas de 1, conservando un alto alcance.

  • Estado de verificación: No verificado
  • Tasa de interacción (ER): El promedio de interacción de la audiencia es 15.35%. Durante las primeras 24 horas tras publicar, el contenido suele obtener 8.83% de reacciones respecto al total de suscriptores.
  • Alcance de las publicaciones: Cada publicación recibe en promedio 1 642 visualizaciones. En el primer día suele acumular 945 visualizaciones.
  • Reacciones e interacción: La audiencia responde de forma activa: el promedio de reacciones por publicación es 10.
  • Intereses temáticos: El contenido se centra en temas clave como php, laravel, пхпшника, artisan, api.

📝 Descripción y política de contenido

El autor describe el recurso como un espacio para expresar opiniones subjetivas:
Все самое полезное для пхпшника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/bca892d6 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b

Gracias a la alta frecuencia de actualizaciones (últimos datos recibidos el 09 junio, 2026), el canal mantiene la vigencia y un amplio alcance. La analítica demuestra que la audiencia interactúa activamente con el contenido, lo que lo convierte en un punto de referencia dentro de la categoría Tecnologías y Aplicaciones.

10 699
Suscriptores
+124 horas
-177 días
-4430 días
Archivo de publicaciones
✔️ PHP-тест: Идемпотентность, которой нет Пользователь нажал «Оплатить» один раз. Деньги списались дважды. 📦 Задание Фича: интеграция с платёжным шлюзом. Платёж создаётся на бэке, пользователь редиректится на страницу шлюза, после оплаты шлюз дёргает webhook. По webhook'у выдаётся доступ к продукту. Жалобы начались через две недели после релиза. Только у части пользователей, только в часы пик. У некоторых списывалось дважды, у других доступ не выдавался вовсе.
// src/Payment/WebhookHandler.php
class WebhookHandler
{
    public function __construct(
        private PaymentRepository $payments,
        private OrderRepository   $orders,
        private AccessService     $access,
        private Mailer            $mailer,
    ) {}

    public function handle(array $payload): void
    {
        $externalId = $payload['payment_id'];
        $status     = $payload['status'];

        if ($status !== 'success') {
            return;
        }

        $payment = $this->payments->findByExternalId($externalId);

        if ($payment === null) {
            return;
        }

        $order = $this->orders->findById($payment->orderId);

        if ($order->status === 'paid') {
            return;
        }

        $this->orders->markAsPaid($payment->orderId);
        $this->access->grantForOrder($order);
        $this->mailer->sendReceipt($order);
    }
}

// src/Repository/OrderRepository.php
class OrderRepository
{
    public function __construct(private PDO $pdo) {}

    public function findById(int $id): Order
    {
        $stmt = $this->pdo->prepare(
            'SELECT * FROM orders WHERE id = ?'
        );
        $stmt->execute([$id]);
        return Order::fromRow($stmt->fetch(PDO::FETCH_ASSOC));
    }

    public function markAsPaid(int $orderId): void
    {
        $stmt = $this->pdo->prepare(
            'UPDATE orders SET status = ? WHERE id = ?'
        );
        $stmt->execute(['paid', $orderId]);
    }
}
🔹 Задачи — Объяснить, как именно возникает двойное списание при одном нажатии пользователя — Исправить WebhookHandler::handle Ставьте → 🔥 если нравится формат. Если нет → 🌚 💬 Решения пишите в комменты под спойлер — сравним подходы.

🗓 14 мая в 19:00 (Мск) встречаемся в онлайне. Тема: Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало. В кружке выше Эмиль Сатаев рассказал, какие именно проблемы с LLM в проде будем разбирать. Что в программе:
- Разберем реальные кейсы стартапов и ограничения LLM. - Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества. - Ответим на ваши вопросы и разберем кейсы участников.
🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы. 👉 Зарегистрироваться на вебинар

🔼 Улучши UX одним методом При создании опций для CLI-приложений можно улучшить UX, реализовав автозаполнение для пользовател
🔼 Улучши UX одним методом При создании опций для CLI-приложений можно улучшить UX, реализовав автозаполнение для пользователя. Это можно сделать с помощью метода anticipate, предоставляемого Laravel 🚀 Библиотека пхпшника #vardump

Как правильно определять границы сервисов в микросервисной архитектуре? Один из недооценённых скиллов в разработке — это умение провести правильную границу между сервисами. Большинство «распределённых монолитов», которые мы встречаем в продакшене, рождаются именно здесь. Разобрали тему — держи шпаргалку 👇 🔹 Что такое Service Boundary Это контракт на три вещи: — за что сервис отвечает; — какими данными он владеет; — как он общается с соседями. Пример: в компании HR не лезет в финансы, а склад не занимается зарплатами. Так же должны работать твои сервисы. 🔹 4 принципа, которые работают 1. Business Capability First Режь по бизнес-функциям, а не по техническим слоям. OrderService, PaymentService, UserService — потому что именно так бизнес думает о системе. 2. Single Responsibility Один сервис — одна ответственность. Если в описании сервиса есть союз «и», это уже тревожный звоночек 🚨 3. Data Ownership У каждого сервиса своя БД. Без исключений. Shared database = shared pain. 4. Loose Coupling Только API, никакого прямого доступа к чужим таблицам. 🔹 Классический антипаттерн
// ❌ Бизнес-логика смешана в одном сервисе
class BadOrderService
{
    public function processOrderAndPayment(int $id): string
    {
        $order = $this->orderRepository->findById($id)
            ?? 'Order not found';

        $paymentStatus = 'Payment Successful'; // 🚨 чужая ответственность

        return $order . ' | ' . $paymentStatus;
    }
}
Выглядит безобидно, пока не нужно масштабировать платежи отдельно, сменить платёжного провайдера или добавить retry-логику только для оплаты. Тут и начнутся реальные проблемы. 🔹 Советы из практикиНачни с монолита. Не дроби систему заранее. Сначала пойми домен, потом режь по швам. → Следи за chatty communication. Если сервис делает 10 вызовов к соседям на каждый запрос — граница явно проведена не там. → Изучи DDD. Bounded Context из Domain-Driven Design — лучший инструмент для поиска правильных границ. Инвестиция окупается быстро. 💬 Делимся в комментах страшными историями god-сервисов

🎤 Ваши знания по ИИ-агентам + наша аудитория в 1 млн человек = профит Мы в Proglib активно качаем тему ИИ-агентов. Если вы в
🎤 Ваши знания по ИИ-агентам + наша аудитория в 1 млн человек = профит Мы в Proglib активно качаем тему ИИ-агентов. Если вы в теме, то у нас есть предложение 👇 Что с нас? - Огромный охват: пропиарим ваши соцсети и продукты на 1 000 000+ айтишников. - Личный бренд: станете узнаваемым экспертом в самой горячей нише 2026 года. - Никакой рутины: наши редакторы сами упакуют ваши мысли в крутые посты. Что с вас? Любой экспертный контент по ИИ-агентам: кейсы из прода, шпаргалки, статьи, наработки по стеку (LangGraph, CrewAI, AutoGen и др.) или просто мысли по архитектуре. 👉 Стать экспертом и заявить о себе

⌨️ Топ-вакансий по PHP за неделю PHP/Vue.js Developer — офис (Москва) — TRIBE PHP и Node.js разработчик — от 1000 до 2500 $ — удалёнка РНР-разработчик (Авто.ру Бизнес) — 200 000 —‍ 300 000 ₽ — гибрид (Москва, Санкт-Петербург ) ➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs

⌛ Сохраняйте шпаргалку по HTTP кодам
Сохраняйте шпаргалку по HTTP кодам

🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)? Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или
🦾 Почему ваши AI-продукты на базе LLM ломаются (и как это чинить)? Выкатили ИИ-фичу в прод, а она галлюцинирует, падает или выдает мусор? Приглашаем на открытый вебинар, где разберем реальную боль внедрения LLM-агентов и научимся делать так, чтобы «всё работало». 🗓️ Когда: 7 мая в 19:00 МСК ⏱️ Формат: 60 минут мяса + 30 минут ответов на ваши вопросы 🧑🏻‍💻 Кто вещает: Эмиль Сатаев — Backend Platform Developer (8+ лет в разработке). Человек, который своими руками внедряет LLM и агентные системы в реальные коммерческие сервисы. 🎁 Главный бонус для онлайна: Только участникам прямого эфира подарим уникальный промокод на скидку 10.000 ₽ на большой курс AgentOps. 👉 Занять место на вебинаре

Что будет результатом кода?
Anonymous voting

🏭 PHP дотянулся до промышленных PLC Исторически связать PHP с OPC UA (протокол SCADA, контроллеров Siemens, датчиков Industry 4.0) означало городить шлюз на Python/Node, тащить C-расширения через FFI или звать внешние процессы из шелла. Костыли, латенси, второй стек в проде. Проект php-opcua закрывает этот разрыв — нативная реализация бинарного протокола OPC UA на чистом PHP. Ноль C-зависимостей кроме ext-openssl. Что в экосистеме: — opcua-client: транспорт, крипто (10 security policies, включая ECC), сессии, подписки; — opcua-session-manager: ReactPHP-демон держит сессию живой, хендшейк 150мс → 5мс на запрос; — laravel-opcua и symfony-opcua: фасады, DI, события, кеш через Redis/PSR-16; — opcua-client-nodeset: 807 сгенерённых DTO из 51 companion spec (Robotics, CNC, ISA-95).
$client = ClientBuilder::create()
    ->connect('opc.tcp://192.168.1.100:4840');

$temp = $client->read('ns=2;s=Temperature');
echo $temp->getValue(); // 23.5
Три строки и Eloquent-модель читает температуру с цеха. Без сайдкаров. 🔗 Подробнее Библиотека пхпшника

✔️ PHP-тест: Утечка сессии между пользователями Баг не воспроизводится локально. На проде один юзер видит чужие данные 👇 📦 Задание Стартап запустил SaaS. Первые две недели тишина. А потом в поддержку прилетело: «Я зашёл в кабинет и увидел чужой аккаунт». В коде сессий и авторизации не трогали давно, там всё стабильно.
// src/Auth/UserSession.php
class UserSession
{
    private static ?User $currentUser = null;

    public static function set(User $user): void
    {
        self::$currentUser = $user;
    }

    public static function get(): ?User
    {
        return self::$currentUser;
    }

    public static function clear(): void
    {
        self::$currentUser = null;
    }
}

// src/Middleware/AuthMiddleware.php
class AuthMiddleware
{
    public function __construct(
        private readonly UserRepository $userRepository,
        private readonly JWTService     $jwt,
    ) {}

    public function handle(Request $request, callable $next): Response
    {
        $token = $request->headers->get('Authorization');

        if (!$token) {
            return new Response(status: 401);
        }

        $payload = $this->jwt->decode(str_replace('Bearer ', '', $token));
        $user    = $this->userRepository->find($payload['sub']);

        UserSession::set($user);

        return $next($request);
    }
}

// src/Controller/DashboardController.php
class DashboardController
{
    public function index(): Response
    {
        $user = UserSession::get();

        return new Response(
            body: $this->renderDashboard($user),
        );
    }
}

// src/Console/CacheWarmupCommand.php
class CacheWarmupCommand
{
    public function execute(): void
    {
        $users = $this->userRepository->findAll();

        foreach ($users as $user) {
            UserSession::set($user);
            $this->warmupForUser($user);
        }

        // прогрев завершён
    }
}
🔹 Задачи — Объяснить механизм утечки — Объяснить, как CacheWarmupCommand триггерит баг и при каком race window — Переписать UserSession так, чтобы устранить проблему архитектурно, а не патчем Ставьте → 🔥 если нравится формат. Если нет → 🌚 💬 Решения пишите в комменты под спойлер — сравним подходы.

🏗 Laravel SaaS: как не утонуть в собственном коде через полгода Дефолтная структура Laravel отлично заходит на старте. Потом приходят мультитенантность, биллинг, сложные правила. В итоге контроллеры пухнут, логика расползается по моделям и джобам. Рабочий рецепт: модульный монолит с доменной организацией. Каждый домен — мини-приложение внутри приложения.
app/Domains/Bookings/
  Models/
  Services/
  Repositories/
  DTOs/
  Actions/
  Requests/
💡 Правила, которые реально экономят часы на рефакторинге: — контроллер принимает FormRequest, дёргает сервис, возвращает Resource; — бизнес-логика живёт в сервисах, чтобы переиспользоваться в API, CLI и очередях; — доступ к БД — через репозитории, без Booking::where() в сервисах; — сразу версионируй API (/api/v1), иначе первый же breaking change принесёт боль. По SaaS-специфике: Sanctum для SPA, Cashier + Stripe для подписок (писать биллинг руками — плохая идея), stancl/tenancy если нужна изоляция тенантов. Тяжёлое отправляем в очереди на Redis, дебаг с Telescope локально и Sentry в проде. 🔗 Читать оригинал Библиотека пхпшника #book_code

🧪 Тестирование Symfony-конфигов Библиотека matthiasnoback/symfony-config-test предоставляет PHPUnit-трейт с готовыми ассертами для проверки дерева конфигурации. Она позволяет убедиться, что конфиги ведут себя корректно при невалидных данных, мёрже и дефолтах:
class ConfigurationTest extends TestCase
{
    use ConfigurationTestCaseTrait;

    protected function getConfiguration(): Configuration
    {
        return new Configuration();
    }

    public function test_invalid(): void
    {
        $this->assertConfigurationIsInvalid(
            [[]], // пустой массив
            'required_value'
        );
    }

    public function test_processed(): void
    {
        $this->assertProcessedConfigurationEquals(
            [['key' => 'first'], ['key' => 'last']],
            ['key' => 'last']
        );
    }
}
Через параметр breadcrumbPath можно тестировать отдельную ветку дерева (например, doctrine.orm), игнорируя остальные required-ноды. Версия 6.x поддерживает PHPUnit 10–12. Репозиторий на GitHub Библиотека пхпшника #release_radar

🔬 Лексер, парсер, интерпретатор — собираем свой DSL на чистом PHP Doctrine DQL, Twig-выражения, Symfony ExpressionLanguage — всё это мини-языки внутри PHP-проектов. Под капотом у каждого одинаковый конвейер: исходный текст → токены → AST → результат. Тот же конвейер ложится в 3 класса и ~150 строк, если задача — rule engine для бизнес-логики:
// Lexer: режет строку на токены через preg_match
// Parser: рекурсивный спуск → AST с приоритетами
// Interpreter: обход дерева + контекст

$rule = 'user.age >= 18 and (user.has_vip or user.orders_count > 5)';

$tokens = (new Lexer($rule))->getTokens();
$ast    = (new Parser($tokens))->parse();
$result = (new Interpreter($context))->evaluate($ast);
// true | false — без eval, без магии
Парсер строит BinaryOpNode / UnaryOpNode, интерпретатор резолвит переменные через explode('.', $name) и match по операторам. Никакого eval — дерево объектов и рекурсия. Расширяется под промокоды, скоринг, ACL и любые гибкие системы, где правила хранятся в БД как строки. 🔗 Читать оригинал — полный код всех трёх классов с тестами. Библиотека пхпшника #php_core