From Code Smells to AI
This week in PHP: Spotting bad code, building a RAG system, and the sustainability of open engineering.
Before we jump into this week’s PHP, Laravel, and Symfony content, I want to share something I’ve been building: Whisper Money.
It’s an open source personal finance app that treats privacy as a first‑class feature:
military‑grade, end‑to‑end encryption; a local private key you own; zero tracking. Tech‑wise it’s a Laravel backend with a React frontend, and the whole thing is transparent on GitHub.
If you care about private-by-design tooling, here’s how you can support it:
⭐ Give the GitHub repo a star: https://github.com/whisper-money/whisper-money
🛠️ Check the code, open issues, or send PRs
🧪 Join the early-access waitlist and help test: whisper.money
Alright, let’s get into the rest of the newsletter.
PHP
📚 Refactoring Legacy: Part 2 - Tell, Don’t Ask. (Server Driven UI)
It will always break. You could write flawless code. You could have 100% test coverage, multi-region failover, circuit breakers, retries, the works. Something will still break.
📚 Use variable variables of PHP to obfuscate code
I came across a weird PHP concept—variable variables.
📚 Sustainability of Open Engineering
Recently the question “Why don’t major corporations invest in PHP?” was raised in the Reddit PHP community.
📚 The Difference Between ?: and ?? in PHP
In PHP, I often see the ternary operator (?:) and null coalescing operator (??) being used interchangeably, but they actually serve different purposes.
📚 Migrating Ugly ID-Based URLs to Clean Keyword URLs — a practical, safe SEO guide
If your site still serves URLs like /product.php?id=12345, you’re missing out on better UX, cleaner analytics, and small SEO gains that add up. Migrating to keyword-rich URLs (e.g., /products/red-running-shoes) is worth it — but only if you do it methodically to avoid traffic loss.
📚 Trick for testing exceptions in PHPUnit
When you’re using PHPUnit to test for an exception you can use $this->expectException(EvatrInvalidVatNumberException::class); for setting up your test to listen to the exception. If the expected exception is not thrown your test will fail and PHPUnit will report the issue.
📚 How to set up Database Integration Tests in vanilla PHP
In this guide I’ll show you how to run fast, isolated, high-quality Database Integration Tests in legacy or framework-less PHP projects. Only Doctrine or PDO needed, and a small but incredibly powerful trick used by many battle-tested frameworks across different programming languages ecosystems.
📚 Multitenancy in Yii2: Practical Guide and Code Examples
In this article, I’ll show you how to implement a basic multitenant setup in Yii2, including code snippets and best practices.
📚 A Beginner’s Guide to PHP — The Language That Powers the Web
If you’re starting your journey in backend development, PHP is one of the best languages to begin with. It’s simple, powerful, and used by millions of websites — including Facebook (early days), WordPress, Wikipedia, and many more.
📚 Building a simple RAG system in PHP with the Neuron AI framework in one evening
Today, we’ll look at how to build a basic RAG system in PHP (yes, really!) using the Neuron AI framework. This will be a small proof-of-concept: minimal, but fully functional.
📚 Why PHP Memory Only Goes Up in Long-Running Workers (and What You Can Do About It)
Have you ever looked at a PHP worker and wondered, “Why does the memory go up… and never come down?” If you’re seeing this for the first time, it feels like a memory leak. But here’s the twist: most of the time, it’s not a leak at all — it’s simply how PHP works internally.
📚 How to Spot Code Smells (and What to Do About Them) — CodeCraft Diary
You know that feeling when you open a file and instantly regret it? That’s your nose telling you: “This code smells.”
📚 Still Printing Stack Traces? Let PHP Tell You the Story Instead
There’s a moment every PHP developer knows way too well: the app suddenly freezes like it just remembered it left the stove on, the screen blasts a stack trace long enough to qualify as a family tree, and now you’re staring at a digital autopsy trying to guess the cause of death.
📚 How to quickly test an API with snapshot tests
After Fandom acquired Metacritic and TV Guide in 2022, the Fandom engineering team faced the task of developing and maintaining complex systems powering those websites.
Laravel
📚 Route Definitions in Laravel
In a Laravel application, you will define your web routes in routes/web.php, closure-based Artisan commands in routes/console.php, and, if you choose to publish them, API routes in routes/api.php and event broadcasting channel registration in routes/channels.php.
📚 The Ultimate Guide to Debugging Laravel Queued Jobs Like a Pro
After years of working with Laravel’s queue system, I’ve compiled this comprehensive guide to help you master the art of debugging background jobs.
📚 Surviving Microsoft SSO: A Guide to Laravel 12, Sanctum, and Azure AD
Implementing Single Sign-On (SSO) can feel like navigating a minefield of obscure error codes and strict security protocols. Recently, I integrated Microsoft (Azure AD) authentication into a Laravel 12 API backend intended for an Angular frontend.
📚 Pause a Queue for a Given Number of Seconds in Laravel 12
The Laravel team released a patch version, v12.40.2, which can pause a queue for a given number of seconds. Building on the Laravel 12.40 release, which introduced pausing and resuming a queue indefinitely, now you can specify a number of seconds to pause the queue.
📚 Introducing Mailviews Early Access
Everyone loves the idea of sending great emails, but actually building them is another story. You start with good intentions, then end up wrestling with layouts, fixing tiny spacing issues, and testing across a bunch of clients to make sure nothing breaks.
Laravel Live Japan is the first official Laravel community conference in Japan. Join us in Tokyo at Tachikawa Stage Garden on May 26-27, 2026 for this premiere event. Enjoy two days of inspiring talks, hands-on learning, and unforgettable community experiences.
Symfony
📚 Mastering Symfony 7.4: The Power of Attribute Improvements
The release of Symfony 7.4 in November 2025 marks a significant milestone in the framework’s history. As the latest Long-Term Support (LTS) version, it solidifies the shift towards a more expressive, attribute-driven architecture that has been evolving since PHP 8 introduced native attributes.
📚 Building custom Symfony Console Commands like a pro (with Symfony 7.4)
The Console component is one of Symfony’s oldest and most widely used components. It powers everything from simple maintenance scripts to complex DevOps tools. Not only in Symfony apps, but in thousands of PHP projects around the world.
Symfony 7.4.0 has just been released. Check the New in Symfony 7.4 posts on this blog to learn about the main features of this new stable release; or check the first beta release announcement to get the list of all its new features.
📚 November 24–30, 2025: A Week of Symfony #987
This week, the stable versions of Symfony 7.4.0 and Symfony 8.0.0 were released, including tens of impressive new features. In addition, the Symfony community gathered for the SymfonyCon Amsterdam 2025 conference, which was a great success. Finally, we published the Black Friday promotions for the Symfony ecosystem.
📚 Architecting Advanced Routing Patterns in Symfony
If you ask a junior developer what the Symfony Routing component does, they will tell you it maps a URL to a controller. They aren’t wrong, but they are only scratching the surface.


Excelent roundup this week. The RAG sytem in PHP article caught my attention since most people assume that kind of work needs Python. Seeing someone build a functional proof-of-concept with Neuron AI in PHP is a nice reminder that language choice often matters way less than people think once the frameworks exist. Curious to see how performance compares in production.
Thanks for making whisper.money open source.
What is military grade encryption? I see this on your landing page hero section