<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><category term="PHP" label="r/PHP"/><updated>2026-09-09T09:07:29+00:00</updated><icon>https://www.redditstatic.com/icon.png/</icon><id>/r/PHP/.rss</id><link rel="self" href="https://www.reddit.com/r/PHP/.rss" type="application/atom+xml" /><link rel="alternate" href="https://www.reddit.com/r/PHP/" type="text/html" /><subtitle>Share and discover the latest news about the PHP ecosystem and its community. Please respect r/php's rules.</subtitle><title>PHP: The latest news in the PHP world</title><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hey there!&lt;/p&gt; &lt;p&gt;This subreddit isn&amp;#39;t meant for help threads, though there&amp;#39;s one exception to the rule: in this thread you can ask anything you want PHP related, someone will probably be able to help you out!&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9jp39/weekly_help_thread/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9jp39/weekly_help_thread/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w9jp39</id><link href="https://www.reddit.com/r/PHP/comments/1w9jp39/weekly_help_thread/" /><updated>2026-09-07T06:00:05+00:00</updated><published>2026-09-07T06:00:05+00:00</published><title>Weekly help thread</title></entry><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;In this monthly thread you can share whatever code or projects you&amp;#39;re working on, ask for reviews, get people&amp;#39;s input and general thoughts, … anything goes as long as it&amp;#39;s PHP related. &lt;/p&gt; &lt;p&gt;Let&amp;#39;s make this a place where people are encouraged to share their work, and where we can learn from each other 😁&lt;/p&gt; &lt;p&gt;Link to the previous edition: &lt;a href=&quot;/u/brendt_gd&quot;&gt;/u/brendt_gd&lt;/a&gt; should provide a link&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1vsfymc/pitch_your_project/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1vsfymc/pitch_your_project/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1vsfymc</id><link href="https://www.reddit.com/r/PHP/comments/1vsfymc/pitch_your_project/" /><updated>2026-08-19T08:00:12+00:00</updated><published>2026-08-19T08:00:12+00:00</published><title>Pitch Your Project 🐘</title></entry><entry><author><name>/u/rc0604</name><uri>https://www.reddit.com/user/rc0604</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/rc0604&quot;&gt; /u/rc0604 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://typephp-php.github.io/docs/blog/when-static-analyzers-teach-the-wrong-way.html&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wbfd4i/when_static_analyzers_teach_you_the_wrong_way_the/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wbfd4i</id><link href="https://www.reddit.com/r/PHP/comments/1wbfd4i/when_static_analyzers_teach_you_the_wrong_way_the/" /><updated>2026-09-09T08:09:38+00:00</updated><published>2026-09-09T08:09:38+00:00</published><title>When Static Analyzers Teach You the Wrong Way: The Dogma of Variance and the Pursuit of Working QA</title></entry><entry><author><name>/u/shinya_dono</name><uri>https://www.reddit.com/user/shinya_dono</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;php had radius_* functions in a PECL package (that i think is no longer updated) but did not have any tool for the server side of RADIUS protocol. so this weekend i made a &lt;a href=&quot;https://github.com/shinya-dono/php-radser&quot;&gt;small package for that&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;currently only supporting RFC 2865, RFC 2866, RFC 3576/5176 and Mikrotik attributes (i use mikrotik for my own work); currently no EAP, no 802.1X, no Message-Authenticator and no TLV.&lt;/p&gt; &lt;p&gt;it&amp;#39;s my first time publishing a php package so i really wanna hear your opinion on this.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/shinya_dono&quot;&gt; /u/shinya_dono &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wazcb5/phpradser_finally_a_library_for_building_a_radius/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wazcb5/phpradser_finally_a_library_for_building_a_radius/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wazcb5</id><link href="https://www.reddit.com/r/PHP/comments/1wazcb5/phpradser_finally_a_library_for_building_a_radius/" /><updated>2026-09-08T20:00:58+00:00</updated><published>2026-09-08T20:00:58+00:00</published><title>php-radser: finally a library for building a RADIUS server in PHP, on ReactPHP</title></entry><entry><author><name>/u/impruthvi</name><uri>https://www.reddit.com/user/impruthvi</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;I built Cashier Dunning because testing failed-payment flows in Laravel is surprisingly difficult.&lt;/p&gt; &lt;p&gt;It records a real Stripe billing lifecycle once and replays it offline through your application&amp;#39;s actual webhook route, including signature verification and real listeners.&lt;/p&gt; &lt;p&gt;It can replay trial expiration, failed payments, retries, cancellation and resubscription in about a second.&lt;/p&gt; &lt;p&gt;It also tests duplicate and out-of-order webhook delivery.&lt;/p&gt; &lt;p&gt;No Stripe account, API keys in CI, or network access during replay.&lt;/p&gt; &lt;p&gt;It&amp;#39;s MIT licensed and currently supports Laravel 11–13.&lt;/p&gt; &lt;p&gt;GitHub: &lt;a href=&quot;https://github.com/impruthvi/cashier-dunning&quot;&gt;https://github.com/impruthvi/cashier-dunning&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I&amp;#39;d especially appreciate feedback from anyone running Stripe/Cashier in production. What billing edge cases would you want something like this to test?&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/impruthvi&quot;&gt; /u/impruthvi &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wamy1n/i_built_a_laravel_package_to_replay_stripe/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wamy1n/i_built_a_laravel_package_to_replay_stripe/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wamy1n</id><link href="https://www.reddit.com/r/PHP/comments/1wamy1n/i_built_a_laravel_package_to_replay_stripe/" /><updated>2026-09-08T12:24:00+00:00</updated><published>2026-09-08T12:24:00+00:00</published><title>I built a Laravel package to replay Stripe billing lifecycles offline</title></entry><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://stitcher.io/blog/no-need&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wagu62/thoughts_about_typephp/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wagu62</id><link href="https://www.reddit.com/r/PHP/comments/1wagu62/thoughts_about_typephp/" /><updated>2026-09-08T06:47:55+00:00</updated><published>2026-09-08T06:47:55+00:00</published><title>Thoughts about TypePHP</title></entry><entry><author><name>/u/Hour-Swimmer7140</name><uri>https://www.reddit.com/user/Hour-Swimmer7140</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Short version: ISO 4217 assigns an exponent to every currency. Most are 2. XOF, XAF, GNF, JPY, KRW and about twenty others are 0. If your money type assumes minor units are hundredths, every amount in those currencies goes out a hundred times too large.&lt;/p&gt; &lt;p&gt;I hit this integrating West African mobile money and ended up writing a Laravel package around it. The money type holds integer minor units and refuses rather than rounds:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;Money::of(1500.50, Currency::XOF); // InvalidMoneyException: XOF is a zero-decimal currency, so 1500.5 cannot be represented &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;Refusing matters more than it looks. Rounding picks a direction and someone is wrong by a franc on every transaction, forever, and nothing tells you.&lt;/p&gt; &lt;p&gt;The rest of the package is three provider drivers behind one interface, phone parsing that declines to guess an operator when a numbering plan is not documented and stable, idempotent collections, and reconciliation for callbacks that never arrive. 103 tests, zero runtime dependencies beyond Laravel itself.&lt;/p&gt; &lt;p&gt;On verification, because it is the first thing I would ask. Only MTN has met a live sandbox and only partly: MTN has hit Azure&amp;#39;s 25,000 subscription cap on its Collections product, so no new developer can subscribe to it and the run had to go through the endpoints their APIs share. Worth doing anyway. It found a double charge bug in my own code, where a replayed reference returns 409 RESOURCE_ALREADY_EXIST and the driver was throwing on it, which would push a caller retrying after a timeout into issuing a fresh reference. Wave and Orange need merchant credentials I do not have, and the README says which paths were exercised and which were not.&lt;/p&gt; &lt;p&gt;Looking for anyone with credentials who wants to prove or break the other two.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/catidegla/laravel-mobile-money&quot;&gt;https://github.com/catidegla/laravel-mobile-money&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Hour-Swimmer7140&quot;&gt; /u/Hour-Swimmer7140 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wbcoh2/zerodecimal_currencies_break_the_always_store/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wbcoh2/zerodecimal_currencies_break_the_always_store/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wbcoh2</id><link href="https://www.reddit.com/r/PHP/comments/1wbcoh2/zerodecimal_currencies_break_the_always_store/" /><updated>2026-09-09T05:36:43+00:00</updated><published>2026-09-09T05:36:43+00:00</published><title>Zero-decimal currencies break the &quot;always store money as cents&quot; rule, and payment libraries mostly do not model it</title></entry><entry><author><name>/u/Efficient-Zone-7374</name><uri>https://www.reddit.com/user/Efficient-Zone-7374</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;​Hi Reddit, ​I built Phphone, an open-source mobile runtime and anti-framework designed to run full PHP 8.4 directly on mobile devices with zero mandatory cloud dependencies. ​Instead of writing apps in Dart (Flutter) or relying on heavy JavaScript runtimes (React Native), Phphone embeds the complete Zend Engine into a lightweight native C++ chassis, fully functional across both Android and iOS. ​Architecture &amp;amp; Low-Level Highlights: ​Full Native Binaries: Cross-compiled PHP 8.4 (dynamic library on Android, static library on iOS) paired with embedded SQLite3, full libcurl, and OpenSSL. It supports standard PHP libraries, outgoing HTTPS calls, and complex local data pipelines right out of the box. ​IP Protection (AES-256): To prevent source code extraction from decompilation, all application files in src/ are cryptographically encrypted using AES-256 derived from the project&amp;#39;s build keystore. Decryption occurs on-the-fly directly in memory inside the C++ runtime. ​Hardware-Accelerated UI: The frontend runs inside the platform&amp;#39;s native hardware-accelerated WebView over an in-memory micro-server loop (localhost), guaranteeing smooth 60 FPS transitions via standard HTML/CSS/JS. ​Minimal Footprint: Base Android APK is ~19MB with near-zero idle CPU usage and low RAM consumption. ​Cross-Platform Ready: Full Android and iOS support is completed. The CLI toolchain automates local scaffolding and builds for both platforms, and our first production app is currently queued for release on both Google Play and the iOS App Store. ​Live APK Demos Available: To demonstrate that this is a production-ready application engine and not just a theoretical experiment, the website hosts 3 pre-built APKs you can download and test: ​System &amp;amp; Hardware Demo: A showcase app interacting directly with 14+ native phone APIs and sensors, plus an interactive gradient generator. ​2D Gaming Demo: A high-performance 2D game running on PixiJS, powered by local logic. ​3D Gaming Demo: A fully interactive 3D scene built with Babylon.js, demonstrating hardware-accelerated WebGL graphics backed by the native PHP engine. ​Whether for enterprise offline-first software, edge compute nodes, multimedia apps, or 2D/3D games, Phphone proves that modern PHP and standard web technologies can build fast, sovereign mobile apps. ​Documentation, CLI &amp;amp; APK Downloads: &lt;a href=&quot;https://phphone.xyz&quot;&gt;https://phphone.xyz&lt;/a&gt; ​I’d love to hear your thoughts on the low-level C++ embedding, binary optimizations, or the anti-framework approach to mobile architecture.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Efficient-Zone-7374&quot;&gt; /u/Efficient-Zone-7374 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wap2yq/i_built_phphone_full_php_84_runtime_and_cli_for/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wap2yq/i_built_phphone_full_php_84_runtime_and_cli_for/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wap2yq</id><link href="https://www.reddit.com/r/PHP/comments/1wap2yq/i_built_phphone_full_php_84_runtime_and_cli_for/" /><updated>2026-09-08T13:54:45+00:00</updated><published>2026-09-08T13:54:45+00:00</published><title>I built Phphone: Full PHP 8.4 runtime and CLI for Android and iOS</title></entry><entry><author><name>/u/aimeos</name><uri>https://www.reddit.com/user/aimeos</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hi &lt;a href=&quot;/r/PHP&quot;&gt;r/PHP&lt;/a&gt;,&lt;/p&gt; &lt;p&gt;we’ve released Aimeos Prisma 0.7, adding video generation and editing to its text, image, audio, and video APIs.&lt;/p&gt; &lt;p&gt;Prisma is a PHP package for working with AI providers through a consistent interface. It covers text generation and streaming, structured output, embeddings, image editing, speech synthesis, transcription, and video. It works with plain PHP, Symfony, Laravel, or another framework, requires PHP 8.2+, and is MIT licensed.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;https://php-prisma.org&quot;&gt;PHP Prisma&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This release lets applications create videos from prompts and reference media, then continue or edit them through the same package. A product-content workflow could generate a product image, use it as the opening frame of a short video, and write the accompanying copy without integrating a separate client for each media type.&lt;/p&gt; &lt;h1&gt;What using it looks like&lt;/h1&gt; &lt;p&gt;Install it through Composer:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;composer require aimeos/prisma &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;This example generates a video using Google Omni:&lt;/p&gt; &lt;pre&gt;&lt;code&gt;use Aimeos\Prisma\Prisma; $video = Prisma::video() -&amp;gt;using(&amp;#39;omni&amp;#39;, [ &amp;#39;api_key&amp;#39; =&amp;gt; getenv(&amp;#39;GEMINI_API_KEY&amp;#39;), ]) -&amp;gt;imagine( &amp;#39;A ceramic coffee cup on a windowsill, steam rising in the morning light&amp;#39;, [], [&amp;#39;duration&amp;#39; =&amp;gt; 5, &amp;#39;aspectRatio&amp;#39; =&amp;gt; &amp;#39;16:9&amp;#39;] ); file_put_contents(&amp;#39;coffee-cup.mp4&amp;#39;, $video-&amp;gt;binary()); &lt;/code&gt;&lt;/pre&gt; &lt;p&gt;The current Omni adapter returns completed video data from &lt;code&gt;imagine()&lt;/code&gt;, so this example belongs in a background job for a web application. Providers such as Veo and xAI return asynchronous jobs instead: keep their response object in a running worker and call &lt;code&gt;ready()&lt;/code&gt; for individual status checks, or access &lt;code&gt;binary()&lt;/code&gt; to let Prisma wait and poll until generation finishes. Each status request itself still blocks.&lt;/p&gt; &lt;h1&gt;What’s new in 0.7&lt;/h1&gt; &lt;p&gt;Video generation now supports Alibaba Wan, Amazon Nova Reel through Bedrock, BytePlus Seedance, Google Omni and Veo, Luma, MiniMax, Runway, xAI, and OpenRouter.&lt;/p&gt; &lt;p&gt;Alongside &lt;code&gt;imagine()&lt;/code&gt;, the video API adds:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;code&gt;extend()&lt;/code&gt; to continue an existing clip&lt;/li&gt; &lt;li&gt;&lt;code&gt;repaint()&lt;/code&gt; to edit a video from a prompt, with reference media on supported providers&lt;/li&gt; &lt;li&gt;&lt;code&gt;uncrop()&lt;/code&gt; to expand the video frame&lt;/li&gt; &lt;li&gt;&lt;code&gt;upscale()&lt;/code&gt; to increase video resolution&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Support varies by provider and model. Applications can check operations with &lt;code&gt;has()&lt;/code&gt; or require them with &lt;code&gt;ensure()&lt;/code&gt;. Generation uses common media roles such as &lt;code&gt;start&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt;, and &lt;code&gt;references&lt;/code&gt;, with provider-specific options available where needed.&lt;/p&gt; &lt;p&gt;OpenRouter support also expands beyond text: this release adds audio transcription, description, and speech synthesis; image generation, editing, description, OCR, and embeddings; and video generation and description. These operations depend on the capabilities of the selected model.&lt;/p&gt; &lt;p&gt;Also, Ideogram gains V4 generation, remix, and description support, plus text removal, object removal, background removal, and transparent image generation and editing. V4 image generation can run asynchronously, while reference and style options retain V3 routing where supported.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;https://php-prisma.org&quot;&gt;Documentation&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;https://github.com/aimeos/prisma&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;If you like it, give it a star :-)&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/aimeos&quot;&gt; /u/aimeos &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wal29k/aimeos_prisma_07_access_llms_through_a_common_php/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wal29k/aimeos_prisma_07_access_llms_through_a_common_php/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wal29k</id><link href="https://www.reddit.com/r/PHP/comments/1wal29k/aimeos_prisma_07_access_llms_through_a_common_php/" /><updated>2026-09-08T10:53:38+00:00</updated><published>2026-09-08T10:53:38+00:00</published><title>Aimeos Prisma 0.7 – Access LLMs through a common PHP API</title></entry><entry><author><name>/u/Successful_Mode8468</name><uri>https://www.reddit.com/user/Successful_Mode8468</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;In 2022 I started teaching programming to schoolchildren. On the first day I was handed the curriculum for the web track. Nobody could tell me who had written it. After a full year of lessons, the students were supposed to produce an HTML page with a background image and some pictures on it.&lt;/p&gt; &lt;p&gt;I threw it out and wrote a new one.&lt;/p&gt; &lt;p&gt;The other half of the job was the register. Paper, one sheet per child. On every sheet you marked attendance, wrote in the topic of the lesson and the number of hours. That was every group, every week, by hand.&lt;/p&gt; &lt;p&gt;At some point I had enough and built something. It was 2023, I knew PHP, and I wrote it the way you write things at eleven at night: procedural, one file per action. Some colleagues started using it too. Five commits in a single day, two of them named &amp;quot;Add files via upload&amp;quot;.&lt;/p&gt; &lt;p&gt;Last week I opened that repository for the first time in three years.&lt;/p&gt; &lt;h2&gt;What past me got right&lt;/h2&gt; &lt;p&gt;More than I expected. Passwords went through &lt;code&gt;password_hash&lt;/code&gt; and &lt;code&gt;password_verify&lt;/code&gt;. Eighty-nine prepared statements, and not one place where &lt;code&gt;$_GET&lt;/code&gt; was pasted into SQL. For something written to stop filling in paper, that is not bad.&lt;/p&gt; &lt;h2&gt;What past me got wrong&lt;/h2&gt; &lt;p&gt;&lt;code&gt;htmlspecialchars&lt;/code&gt; appears zero times in the whole codebase. Every value from the database goes straight into the page.&lt;/p&gt; &lt;p&gt;The upload handler takes the extension from the filename the browser sent and writes the file into a served directory. You can upload a &lt;code&gt;.php&lt;/code&gt; file and then request it. That is remote code execution.&lt;/p&gt; &lt;p&gt;Attendance was stored as &lt;code&gt;(student_id, date, status)&lt;/code&gt;. No group. A student who came to two different tracks was one row per day, and there was no way to say which of the two they had missed.&lt;/p&gt; &lt;p&gt;A student had a single &lt;code&gt;group_id&lt;/code&gt;, so anyone attending two tracks could not be recorded at all.&lt;/p&gt; &lt;p&gt;Teachers and students lived in two tables with two separate login handlers. Anything that concerned both had to be written twice.&lt;/p&gt; &lt;h2&gt;The rewrite&lt;/h2&gt; &lt;p&gt;Laravel 13 and Postgres. The domain survived and nothing else did.&lt;/p&gt; &lt;p&gt;The interesting part is what the 2023 version never had: tasks that grade themselves.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;I do not run student code.&lt;/strong&gt; It goes to &lt;a href=&quot;https://wandbox.org&quot;&gt;Wandbox&lt;/a&gt;, which has been running untrusted code for years and does nothing else. On a project this size, running my own sandbox would mean one person keeping isolation correct in their spare time, and I would rather that person were not me.&lt;/p&gt; &lt;p&gt;I expected to stitch several backends together, the way these things usually go: Wandbox for most languages, the Go playground for Go, the Rust playground for Rust. Then I read the Go playground&amp;#39;s compile endpoint. It takes the program body and a version. There is no field for standard input. I posted &lt;code&gt;stdin&lt;/code&gt; and &lt;code&gt;input&lt;/code&gt; alongside the program anyway, in case the field simply went undocumented, and the program read EOF both times.&lt;/p&gt; &lt;p&gt;Without stdin there is no test case with input data, and without that there is no assessment worth the name. Every task collapses into &amp;quot;print this constant&amp;quot;. So I use one backend. Wandbox covers fourteen languages, Rust, Pascal and SQL included.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Grading runs on a queue, because I measured it.&lt;/strong&gt; One Go build on Wandbox takes about twenty seconds. Five test cases one after another would be a minute and a half. I send them in parallel, four at a time, which got it down to sixty-two seconds. Still far too long to hold an HTTP request open, so submitting queues the work and the page polls for the result.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Some test cases are hidden.&lt;/strong&gt; For open cases the student sees the input and the expected answer. For hidden ones they see only whether it passed. Show everything and the solution gets fitted to the known answers instead of made to work.&lt;/p&gt; &lt;h2&gt;Three findings that cost me an afternoon each&lt;/h2&gt; &lt;p&gt;Wandbox&amp;#39;s Rust compiler rejects the &lt;code&gt;warning&lt;/code&gt; option set, and does not say so. It returns exit status 1 with empty output, which is indistinguishable from a program that printed nothing.&lt;/p&gt; &lt;p&gt;Mono prints non-ASCII as question marks until you set &lt;code&gt;Console.OutputEncoding&lt;/code&gt;, and once you do, it prefixes the output with a byte order mark. Comparing that against the expected answer fails on an invisible character. The &lt;code&gt;dotnetcore&lt;/code&gt; image on Wandbox does not build at all, so mono is the only option.&lt;/p&gt; &lt;p&gt;Laravel&amp;#39;s &lt;code&gt;trans_choice()&lt;/code&gt; falls back to the fallback locale in cases where &lt;code&gt;__()&lt;/code&gt; returns the key unchanged. My source language is Russian and my fallback was English, so Russian pages rendered English text in exactly the places where a count was involved. No test caught it; I saw it in a screenshot.&lt;/p&gt; &lt;h2&gt;What I am not sure about&lt;/h2&gt; &lt;p&gt;Leaning on a free public service at the moment a student submits an exam is the obvious weak point, and I do not have a good answer for the day Wandbox is down. My reasoning is that the alternative is worse for a project this size. If you have run the other way and maintained your own isolation, I would like to hear how that went.&lt;/p&gt; &lt;p&gt;MIT, Laravel 13, PHP 8.3+, Postgres, no keys or accounts needed to try it. The seed builds a demo school with four tracks and a month of attendance.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;https://github.com/dripips/ItCube&quot;&gt;https://github.com/dripips/ItCube&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Successful_Mode8468&quot;&gt; /u/Successful_Mode8468 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9xjiz/i_built_an_attendance_tool_in_2023_to_escape_a/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9xjiz/i_built_an_attendance_tool_in_2023_to_escape_a/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w9xjiz</id><link href="https://www.reddit.com/r/PHP/comments/1w9xjiz/i_built_an_attendance_tool_in_2023_to_escape_a/" /><updated>2026-09-07T16:52:23+00:00</updated><published>2026-09-07T16:52:23+00:00</published><title>I built an attendance tool in 2023 to escape a paper register. I rewrote it last week, and past me made four real mistakes.</title></entry><entry><author><name>/u/IvanVoitovych</name><uri>https://www.reddit.com/user/IvanVoitovych</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/IvanVoitovych&quot;&gt; /u/IvanVoitovych &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://viewi.net/blog/viewi-in-production&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wal5jd/i_wrote_a_php_frontend_framework_components/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wal5jd</id><link href="https://www.reddit.com/r/PHP/comments/1wal5jd/i_wrote_a_php_frontend_framework_components/" /><updated>2026-09-08T10:58:32+00:00</updated><published>2026-09-08T10:58:32+00:00</published><title>I wrote a PHP front-end framework — components compiled to JS, SSR + hydration. Here's what running it in production actually pressed on.</title></entry><entry><author><name>/u/Dariusz_Gafka</name><uri>https://www.reddit.com/user/Dariusz_Gafka</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Dariusz_Gafka&quot;&gt; /u/Dariusz_Gafka &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://blog.ecotone.tech/ecotone-vs-symfony-messenger-the-real-difference/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wagiba/symfony_messenger_vs_ecotone_the_real_difference/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wagiba</id><link href="https://www.reddit.com/r/PHP/comments/1wagiba/symfony_messenger_vs_ecotone_the_real_difference/" /><updated>2026-09-08T06:28:52+00:00</updated><published>2026-09-08T06:28:52+00:00</published><title>Symfony Messenger vs Ecotone: The Real Difference</title></entry><entry><author><name>/u/TheTreasuryPetra</name><uri>https://www.reddit.com/user/TheTreasuryPetra</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Because PHP templates are back! &lt;a href=&quot;https://github.com/mousr/templates&quot;&gt;https://github.com/mousr/templates&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/TheTreasuryPetra&quot;&gt; /u/TheTreasuryPetra &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wa0u69/mousrtemplates_static_analysisfriendly_native_php/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1wa0u69/mousrtemplates_static_analysisfriendly_native_php/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1wa0u69</id><link href="https://www.reddit.com/r/PHP/comments/1wa0u69/mousrtemplates_static_analysisfriendly_native_php/" /><updated>2026-09-07T18:51:12+00:00</updated><published>2026-09-07T18:51:12+00:00</published><title>mousr/templates: Static analysis-friendly native PHP templates</title></entry><entry><author><name>/u/DoItForTheXP</name><uri>https://www.reddit.com/user/DoItForTheXP</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hey &lt;a href=&quot;/r/PHP&quot;&gt;r/PHP&lt;/a&gt;, I wanted to share a practical implementation of &lt;strong&gt;FrankenPHP&lt;/strong&gt; and native &lt;strong&gt;SQLite&lt;/strong&gt; powering a self-hosted personal WebTop: &lt;strong&gt;YouMeOS Microverse&lt;/strong&gt;. A major problem with self-hosted PHP applications is distribution: telling non-technical users to install Docker, Nginx, and MySQL creates massive friction.&lt;/p&gt; &lt;h1&gt;How We Utilized FrankenPHP:&lt;/h1&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Embedded Desktop Engine:&lt;/strong&gt; In addition to standard Docker Compose, our Electron desktop app bundles a portable FrankenPHP binary with SQLite.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Zero External Dependencies:&lt;/strong&gt; Users download the &lt;code&gt;.exe&lt;/code&gt;, &lt;code&gt;.dmg&lt;/code&gt;, or &lt;code&gt;.AppImage&lt;/code&gt;, and it runs a local Caddy + PHP 8.3 server process in the background without Docker or local PHP installations.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Resource Footprint:&lt;/strong&gt; Cold starts take ~1 second, with idle RAM usage significantly lower than traditional Apache/Nginx + PHP-FPM + MySQL stacks.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Caddy Worker Integration:&lt;/strong&gt; Takes advantage of FrankenPHP&amp;#39;s fast application handling directly from local storage.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Livesite: &lt;a href=&quot;http://www.youmeos.com&quot;&gt;www.youmeos.com&lt;/a&gt; but the microverse can be ran locally using our docker container or binaries. &lt;/p&gt; &lt;p&gt;Source code and configs: &lt;a href=&quot;https://github.com/YouMeOS/youmeos-microverse&quot;&gt;https://github.com/YouMeOS/youmeos-microverse&lt;/a&gt;&lt;br/&gt; Release builds: &lt;a href=&quot;https://github.com/YouMeOS/youmeos-microverse/releases&quot;&gt;https://github.com/YouMeOS/youmeos-microverse/releases&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Feedback on our FrankenPHP runner and Caddyfile setup is welcome.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/DoItForTheXP&quot;&gt; /u/DoItForTheXP &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9pa06/youmeos_microverse_running_frankenphp_sqlite_as/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9pa06/youmeos_microverse_running_frankenphp_sqlite_as/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w9pa06</id><link href="https://www.reddit.com/r/PHP/comments/1w9pa06/youmeos_microverse_running_frankenphp_sqlite_as/" /><updated>2026-09-07T11:13:40+00:00</updated><published>2026-09-07T11:13:40+00:00</published><title>YouMeOS Microverse: Running FrankenPHP + SQLite as an embedded, zero-Docker desktop runtime</title></entry><entry><author><name>/u/Minimum_Hour519</name><uri>https://www.reddit.com/user/Minimum_Hour519</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Minimum_Hour519&quot;&gt; /u/Minimum_Hour519 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://hqtui.com/docs#php&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w9tz5r/hqtui_terminal_ui_for_typescript_rust_go_python/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w9tz5r</id><link href="https://www.reddit.com/r/PHP/comments/1w9tz5r/hqtui_terminal_ui_for_typescript_rust_go_python/" /><updated>2026-09-07T14:38:53+00:00</updated><published>2026-09-07T14:38:53+00:00</published><title>HQTUI — Terminal UI for TypeScript, Rust, Go, Python and Zig</title></entry><entry><author><name>/u/brendt_gd</name><uri>https://www.reddit.com/user/brendt_gd</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/brendt_gd&quot;&gt; /u/brendt_gd &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://stitcher.io/blog/no-more-issues&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6wxh5/no_more_issues/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w6wxh5</id><link href="https://www.reddit.com/r/PHP/comments/1w6wxh5/no_more_issues/" /><updated>2026-09-04T06:58:48+00:00</updated><published>2026-09-04T06:58:48+00:00</published><title>No more issues</title></entry><entry><author><name>/u/XenonBG</name><uri>https://www.reddit.com/user/XenonBG</uri></author><category term="PHP" label="r/PHP"/><content type="html">&amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/XenonBG&quot;&gt; /u/XenonBG &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://sensiolabs.com/blog/2026/give-ai-agents-long-term-memory-llm-wiki-pattern-implemented-symfony&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w7vujy/give_ai_agents_longterm_memory_llm_wiki_pattern/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w7vujy</id><link href="https://www.reddit.com/r/PHP/comments/1w7vujy/give_ai_agents_longterm_memory_llm_wiki_pattern/" /><updated>2026-09-05T09:18:33+00:00</updated><published>2026-09-05T09:18:33+00:00</published><title>Give AI Agents Long-Term Memory: LLM Wiki Pattern in Symfony</title></entry><entry><author><name>/u/phumacinha</name><uri>https://www.reddit.com/user/phumacinha</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Hi everyone,&lt;/p&gt; &lt;p&gt;I work for a Brazilian federal university, and we&amp;#39;re starting to plan a new integrated system that will serve the whole university community (from teaching-related services to internal administration). Expected usage is high (many requests across several domains), and the system needs to last many years.&lt;/p&gt; &lt;p&gt;One challenge specific to our context: being public sector, we have high staff turnover on the dev team, so whoever joins later needs to ramp up quickly.&lt;/p&gt; &lt;p&gt;We were initially leaning toward microservices, mostly to keep things scalable and modular over the long run, but after reading some older threads here I&amp;#39;m second-guessing that. Given a small-ish team, high turnover, a long lifespan, and multiple domains, would you recommend starting with a well-structured modular monolith instead of going straight to microservices?&lt;/p&gt; &lt;p&gt;And if microservices do make sense for a project like this, which PHP frameworks/tools would you suggest for building the actual APIs: Laravel, Symfony, Slim, Lumen, something else?&lt;/p&gt; &lt;p&gt;Genuinely trying to learn from people who&amp;#39;ve been through this. Any experience, even &amp;#39;don&amp;#39;t do it&amp;#39;, is welcome!&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/phumacinha&quot;&gt; /u/phumacinha &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6891x/longterm_university_system_in_php_microservices/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6891x/longterm_university_system_in_php_microservices/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w6891x</id><link href="https://www.reddit.com/r/PHP/comments/1w6891x/longterm_university_system_in_php_microservices/" /><updated>2026-09-03T14:00:33+00:00</updated><published>2026-09-03T14:00:33+00:00</published><title>Long-term university system in PHP, microservices or modular monolith, given high staff turnover?</title></entry><entry><author><name>/u/Dodokii</name><uri>https://www.reddit.com/user/Dodokii</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;I know it is a whack-a-mole situtation but I want to know if there is a library that already cover major/famous temporary emails. I plan to restrict registration from temp mail providers to reduce cleanup work from pockers.&lt;/p&gt; &lt;p&gt;Again not a service as I will not send emails to third-party. Also I don&amp;#39;t need 100% gate that does not exist. And not asking to help stop them or how to use a library. just a library or code sitting somewhere, since I cannot know all libraries all there&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Dodokii&quot;&gt; /u/Dodokii &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w720nr/is_there_reputable_foss_library_that_validates/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w720nr/is_there_reputable_foss_library_that_validates/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w720nr</id><link href="https://www.reddit.com/r/PHP/comments/1w720nr/is_there_reputable_foss_library_that_validates/" /><updated>2026-09-04T11:43:13+00:00</updated><published>2026-09-04T11:43:13+00:00</published><title>Is there reputable FOSS library that validates temp email?</title></entry><entry><author><name>/u/ogprogrammer</name><uri>https://www.reddit.com/user/ogprogrammer</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;I&amp;#39;m parting with my ElePHPant collection after 13 years of collecting them. I&amp;#39;m raising money for my startup and also will need open heart surgery in the next 5 years. As the UG leader of PHP Vegas for over 10 years, its been a hell of a run. I still love PHP and my startup is built in it, but I also need funds as I&amp;#39;m quitting my full time to do all this. If we crossed paths before, thank you for all the fish. You can find my collection for sell here: &lt;a href=&quot;https://www.ebay.com/sch/i.html?_dkr=1&amp;amp;iconV2Request=true&amp;amp;_blrs=recall_filtering&amp;amp;_ssn=pokemastercenter&amp;amp;store_cat=0&amp;amp;_nkw=elephpant&amp;amp;store_name=pokemastercenter&amp;amp;_oac=1&quot;&gt;https://www.ebay.com/sch/i.html?_dkr=1&amp;amp;iconV2Request=true&amp;amp;_blrs=recall_filtering&amp;amp;_ssn=pokemastercenter&amp;amp;store_cat=0&amp;amp;_nkw=elephpant&amp;amp;store_name=pokemastercenter&amp;amp;_oac=1&lt;/a&gt;&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/ogprogrammer&quot;&gt; /u/ogprogrammer &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w5t8z7/im_selling_my_37_elephpant_collection/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w5t8z7/im_selling_my_37_elephpant_collection/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w5t8z7</id><link href="https://www.reddit.com/r/PHP/comments/1w5t8z7/im_selling_my_37_elephpant_collection/" /><updated>2026-09-03T01:16:45+00:00</updated><published>2026-09-03T01:16:45+00:00</published><title>I'm selling my 37+ ElePHPant Collection</title></entry><entry><author><name>/u/Round-Pie-7125</name><uri>https://www.reddit.com/user/Round-Pie-7125</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;I’ve made a Hindi tutorial on Laravel 12 Middleware covering the complete flow from creating Middleware to applying it on routes.&lt;/p&gt; &lt;p&gt;In this video: • Create custom Middleware • Understand the handle() method • Register Middleware • Create Middleware aliases • Apply aliases to routes • Practical route examples&lt;/p&gt; &lt;p&gt;🎥 Tutorial: &lt;a href=&quot;https://youtu.be/USOjYgaKUDk&quot;&gt;https://youtu.be/USOjYgaKUDk&lt;/a&gt;&lt;/p&gt; &lt;p&gt;For those learning Laravel 12, hope this helps clear up how Middleware actually works.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Round-Pie-7125&quot;&gt; /u/Round-Pie-7125 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6zls3/laravel_middleware_in_hindi_create_alias_apply_to/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6zls3/laravel_middleware_in_hindi_create_alias_apply_to/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w6zls3</id><link href="https://www.reddit.com/r/PHP/comments/1w6zls3/laravel_middleware_in_hindi_create_alias_apply_to/" /><updated>2026-09-04T09:35:15+00:00</updated><published>2026-09-04T09:35:15+00:00</published><title>Laravel Middleware in Hindi: Create, Alias &amp; Apply to Routes</title></entry><entry><author><name>/u/nwnuyhs</name><uri>https://www.reddit.com/user/nwnuyhs</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;&lt;strong&gt;Source: &lt;a href=&quot;https://github.com/nwnuyhs/flatbb&quot;&gt;https://github.com/nwnuyhs/flatbb&lt;/a&gt;&lt;/strong&gt; (MIT; added after the comments below asked for it)&lt;/p&gt; &lt;p&gt;I&amp;#39;ve just released &lt;strong&gt;Flatbb 0.1.5&lt;/strong&gt;, a flat, lightweight forum written in plain PHP 8.1. MIT licensed, free.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;No framework, no Composer, no build step.&lt;/strong&gt; Upload, open the installer, done in 2 minutes. Runs on the cheapest shared hosting or a 1 GB VPS.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;SQLite or MySQL 5.7+.&lt;/strong&gt; Start on SQLite, move to MySQL later with one command.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Built for AI-assisted development.&lt;/strong&gt; The repo ships CLAUDE.md / AGENTS.md and docs written for AI tools. Open the folder in Claude Code or Cursor, say &amp;quot;add a badge plugin&amp;quot;, and it knows the hooks, the rules and how to publish.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Plugin marketplace&lt;/strong&gt; with one-click install from the admin panel; publish your own plugin with &lt;code&gt;php flatbb plugin:publish&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;Discourse-style three-column layout, dark mode, Markdown editor with image upload, full-text search, 7 interface languages.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The interesting part is the developer story: every hook, region and API function is documented in generated Markdown, plugins are plain prefixed functions with a manifest, and the repo includes instruction files for Claude Code / Cursor / Copilot. In practice you describe a plugin in one sentence and the AI writes it, checks it (&lt;code&gt;php flatbb plugin:check&lt;/code&gt;) and publishes it to the marketplace.&lt;/p&gt; &lt;p&gt;Source: &lt;a href=&quot;https://github.com/nwnuyhs/flatbb&quot;&gt;https://github.com/nwnuyhs/flatbb&lt;/a&gt; - Download: &lt;a href=&quot;https://www.flatbb.com/download&quot;&gt;https://www.flatbb.com/download&lt;/a&gt; - Plugins: &lt;a href=&quot;https://www.flatbb.com/market&quot;&gt;https://www.flatbb.com/market&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It&amp;#39;s early (0.1.x) and I&amp;#39;d love feedback, bug reports and plugin ideas.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/nwnuyhs&quot;&gt; /u/nwnuyhs &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6zj1e/flatbb_a_free_opensource_php_forum_designed_to_be/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6zj1e/flatbb_a_free_opensource_php_forum_designed_to_be/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w6zj1e</id><link href="https://www.reddit.com/r/PHP/comments/1w6zj1e/flatbb_a_free_opensource_php_forum_designed_to_be/" /><updated>2026-09-04T09:30:37+00:00</updated><published>2026-09-04T09:30:37+00:00</published><title>flatbb: a free, open-source PHP forum designed to be extended by AI assistants (no framework, SQLite/MySQL, plugin marketplace)</title></entry><entry><author><name>/u/elizabethn</name><uri>https://www.reddit.com/user/elizabethn</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;Germany is spending €108 million to move its federal websites onto a TYPO3-based platform. The European Commission runs 770 sites on Drupal. Around 300,000 German federal users work on Nextcloud. All PHP.&lt;/p&gt; &lt;p&gt;Across Europe, when governments say &amp;quot;digital sovereignty,&amp;quot; what they&amp;#39;re describing is very often a PHP application. In our latest blog post, Sebastian Bergmann looks at where PHP runs in the public sector, why so little of that support reaches the maintainers underneath it, and three practical changes to procurement that could fix it.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/elizabethn&quot;&gt; /u/elizabethn &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://thephp.foundation/blog/2026/09/02/digital-sovereignty-is-written-in-php/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w5c16q/digital_sovereignty_is_written_in_php/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w5c16q</id><link href="https://www.reddit.com/r/PHP/comments/1w5c16q/digital_sovereignty_is_written_in_php/" /><updated>2026-09-02T14:30:59+00:00</updated><published>2026-09-02T14:30:59+00:00</published><title>Digital Sovereignty Is Written in PHP</title></entry><entry><author><name>/u/Eznix86</name><uri>https://www.reddit.com/user/Eznix86</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;At work, I kept writing the same thing: a few analytics tables, a cron job to rebuild them, and the same SQL copy-pasted into three models. Change one definition, forget to update one copy, and suddenly two dashboards quietly disagree.&lt;/p&gt; &lt;p&gt;There’s `dbt`, which solves this problem for data teams, but it means bringing Python and a second toolchain into a Laravel project. So I tried the same idea in PHP.&lt;/p&gt; &lt;p&gt;An analytics model is an Eloquent model with one query on it:&lt;/p&gt; &lt;p&gt;```php&lt;br/&gt; class Revenue extends Model implements AnalyticsModel&lt;br/&gt; {&lt;br/&gt; use Analytics;&lt;/p&gt; &lt;p&gt;public function computes(): Query&lt;br/&gt; {&lt;br/&gt; return $this-&amp;gt;from(Order::class)&lt;br/&gt; -&amp;gt;where(&amp;#39;status&amp;#39;, &amp;#39;&amp;lt;&amp;gt;&amp;#39;, &amp;#39;cancelled&amp;#39;)&lt;br/&gt; -&amp;gt;per(&amp;#39;customer_id&amp;#39;)&lt;br/&gt; -&amp;gt;measure(&amp;#39;total&amp;#39;, &amp;#39;sum(amount)&amp;#39;);&lt;br/&gt; }&lt;br/&gt; }&lt;br/&gt; ```&lt;/p&gt; &lt;p&gt;Then `php artisan analytics:sync` works out what depends on what and builds everything in the right order.&lt;/p&gt; &lt;p&gt;After that, it’s just Eloquent:&lt;/p&gt; &lt;p&gt;```php&lt;br/&gt; Revenue::query()-&amp;gt;where(&amp;#39;total&amp;#39;, &amp;#39;&amp;gt;&amp;#39;, 1000)-&amp;gt;get();&lt;br/&gt; ```&lt;/p&gt; &lt;p&gt;A few things it does:&lt;/p&gt; &lt;p&gt;* The `GROUP BY` comes from the dimensions you declare, so you never have to write them twice.&lt;br/&gt; * it has Incremental, microbatch, and snapshot buildsthe, same ideas as dbt.&lt;br/&gt; * Runs on PostgreSQL, MySQL, and SQLite with the same commands.&lt;/p&gt; &lt;p&gt;### What it does not do&lt;/p&gt; &lt;p&gt;Every model in a dependency chain has to use the same connection. &lt;/p&gt; &lt;p&gt;That means you can’t, for example, import a SQLite query directly into a PostgreSQL query. This could be solved with an import mechanism, and I am still thinking about a better way to make that work in an Eloquent-like way.&lt;/p&gt; &lt;p&gt;### Why not just use a query class with dependency injection?&lt;/p&gt; &lt;p&gt;A query class, like the action pattern in `App\Queries`, that you inject wherever you need it is perfectly fine.&lt;/p&gt; &lt;p&gt;If the aggregate is fast, you need live numbers, and you only have one or two of them, write the class and skip this package.&lt;/p&gt; &lt;p&gt;The issue is that it computes on every read and you have zero indexes.&lt;/p&gt; &lt;p&gt;Cache the query? Now you’re stuck dealing with stale data.&lt;/p&gt; &lt;p&gt;There’s another problem: each layer (CTEs, subqueries, etc.) gets re-run instead of being reused.&lt;/p&gt; &lt;p&gt;You can use query classes can be composable by calling each other, but a shared subquery is still recomputed inside every caller. This package composes by reference.&lt;/p&gt; &lt;p&gt;For example, you can have a `StgOrder` model representing a transformed version of the `Order` table. It gets built once, and the models that depend on it simply select from the finished table.&lt;/p&gt; &lt;p&gt;This package can append the rows that arrived since the last run, rebuild one day at a time, or keep one row per version with `valid_from` and `valid_to`.&lt;/p&gt; &lt;p&gt;This package will make a built table that can carry the indexes your read patterns need.&lt;/p&gt; &lt;p&gt;A helper like `Revenue::isStale()` can tell you when the data has passed its freshness window.&lt;/p&gt; &lt;p&gt;### Why not just write a job that rebuilds the table?&lt;/p&gt; &lt;p&gt;That’s essentially what the package does.&lt;/p&gt; &lt;p&gt;The difference is that the queries are reusable, and dependencies are propagated through the entire chain of downstream aggregates.&lt;/p&gt; &lt;p&gt;TLDR; You write reusable queries as a data person but in PHP.&lt;/p&gt; &lt;p&gt;Repo: &lt;a href=&quot;https://github.com/eznix86/laravel-analytics&quot;&gt;https://github.com/eznix86/laravel-analytics&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Read more about DBT: &lt;a href=&quot;https://en.wikipedia.org/wiki/Data%5C_build%5C_tool&quot;&gt;https://en.wikipedia.org/wiki/Data\_build\_tool&lt;/a&gt;&lt;/p&gt; &lt;p&gt;the real dbt guys: &lt;a href=&quot;https://github.com/dbt-labs/dbt-core&quot;&gt;https://github.com/dbt-labs/dbt-core&lt;/a&gt; (for the curious folks)&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Eznix86&quot;&gt; /u/Eznix86 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://github.com/eznix86/laravel-analytics&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6t8k8/github_eznix86laravelanalytics_data_build_tool/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w6t8k8</id><link href="https://www.reddit.com/r/PHP/comments/1w6t8k8/github_eznix86laravelanalytics_data_build_tool/" /><updated>2026-09-04T03:43:04+00:00</updated><published>2026-09-04T03:43:04+00:00</published><title>GitHub - eznix86/laravel-analytics: Data Build Tool the eloquent way</title></entry><entry><author><name>/u/Round-Pie-7125</name><uri>https://www.reddit.com/user/Round-Pie-7125</uri></author><category term="PHP" label="r/PHP"/><content type="html">&lt;!-- SC_OFF --&gt;&lt;div class=&quot;md&quot;&gt;&lt;p&gt;If you&amp;#39;re working with Laravel 12 and want to implement proper roles and permissions, I put together a complete tutorial using Laravel Breeze + Spatie Laravel Permission.&lt;/p&gt; &lt;p&gt;In the video, I cover:&lt;/p&gt; &lt;p&gt;Laravel 12 + Breeze authentication setup Installing and configuring Spatie Permissions Creating Roles &amp;amp; Permissions Assigning permissions to users Checking roles and permissions Protecting routes with middleware Role-based access control Practical examples with Admin / Manager / Employee roles&lt;/p&gt; &lt;p&gt;🎥 Full tutorial: &lt;a href=&quot;https://youtu.be/vX46YQprMho&quot;&gt;https://youtu.be/vX46YQprMho&lt;/a&gt; Language:Hindi&lt;/p&gt; &lt;p&gt;Hope this helps anyone currently implementing RBAC in Laravel.&lt;/p&gt; &lt;/div&gt;&lt;!-- SC_ON --&gt; &amp;#32; submitted by &amp;#32; &lt;a href=&quot;https://www.reddit.com/user/Round-Pie-7125&quot;&gt; /u/Round-Pie-7125 &lt;/a&gt; &lt;br/&gt; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6rzht/laravel_12_breeze_spatie_permissions_complete/&quot;&gt;[link]&lt;/a&gt;&lt;/span&gt; &amp;#32; &lt;span&gt;&lt;a href=&quot;https://www.reddit.com/r/PHP/comments/1w6rzht/laravel_12_breeze_spatie_permissions_complete/&quot;&gt;[comments]&lt;/a&gt;&lt;/span&gt;</content><id>t3_1w6rzht</id><link href="https://www.reddit.com/r/PHP/comments/1w6rzht/laravel_12_breeze_spatie_permissions_complete/" /><updated>2026-09-04T02:41:52+00:00</updated><published>2026-09-04T02:41:52+00:00</published><title>Laravel 12 + Breeze + Spatie Permissions — Complete Role &amp; Permission Setup</title></entry></feed>