Yii3 is released
It happened! Yii3 is officially released after years of intensive development and polishing.
• Yii3 landing page
• Official announcement
• Documentation
• Application templates: Web, API, Console
• Demo applications: Blog (Layered DDD), Diary (Vertical slices, Active Record)
We're pretty sure the Yii3 codebase will serve us well in at least the next 10 years or even more.
Merry Christmas and Happy New Year! Enjoy! 🎉
https://redd.it/1q0ceia
@r_php
It happened! Yii3 is officially released after years of intensive development and polishing.
• Yii3 landing page
• Official announcement
• Documentation
• Application templates: Web, API, Console
• Demo applications: Blog (Layered DDD), Diary (Vertical slices, Active Record)
We're pretty sure the Yii3 codebase will serve us well in at least the next 10 years or even more.
Merry Christmas and Happy New Year! Enjoy! 🎉
https://redd.it/1q0ceia
@r_php
Yiiframework
Yii3 Framework
PHP framework for rapid development of modern applications.
My architecture decision while building an Audit Bundle for Symfony
While building an audit trail bundle for Symfony, I had to make a key architectural decision:
how to capture accurate entity changes without slowing down the main request or coupling the audit logic too tightly with Doctrine internals.
I ended up designing a split-phase audit architecture.
You can find the complete article here
If you’re interested, you can also check out the code repository here
suggestions are very welcome.
https://redd.it/1q0f0ft
@r_php
While building an audit trail bundle for Symfony, I had to make a key architectural decision:
how to capture accurate entity changes without slowing down the main request or coupling the audit logic too tightly with Doctrine internals.
I ended up designing a split-phase audit architecture.
You can find the complete article here
If you’re interested, you can also check out the code repository here
suggestions are very welcome.
https://redd.it/1q0f0ft
@r_php
Medium
Designing a Split-Phase Audit Architecture for Symfony
Building a Production-Ready Audit Trail Without Compromising Performance
Refactoring column names
I recently had to refactor a single column in a very large app (thousands of routes, 270 models) and wondered if there was a better way to track usage of a single column
My specific scenario was a nightmare because what I wanted to do was refactor a column called "type" to be called "type_id" so that
Of course it could have been possible to refactor in a different way, keep the "type" column and have the object available under another name, but other tables generally used the syntax of
Obviously doing a search for "type" returned thousands of results throughout the app.
Most of the time these were either prefixed by -> or wrapped in single quotes e.g.
Nonetheless I could not figure a means of doing this refactor other than searching the entire codebase for "type" and going through every single result line by line, what I actually did was use
But is there a better way?
I started dreaming of one day having a project where all columns where defined in constants so I could easily find all usages of
It would have been nice if my Model would have had a
It may be possible to use an LLM but i've no idea how people give an entire massive monolith to an LLM and I wouldn't totally trust it to not make any mistakes checking thousands of occurrences so I would still have to go through every single one, one by one.
The only real conclusion I could draw was that (1) my grep to text file approach wasn't THAT bad and (2) the most important thing would be having full test coverage. If I had that in theory I could run the migration to rename the column and then have the test populate a list of every place that was affected. Although I don't think i'd ever be confident enough to trust and not do the grep method.
But yes, I assume many, many people have faced this problem and wondered how people approach it and if there's some amazing tool or technique i'm missing?
If anyone is not sure what I mean about the grep you can run these commands in a terminal:
And get results like this into a text file
>./app/Console/Kernel.php:68: $schedule->command('videos:get-channel-stats --type=daily')
>./app/Console/Kernel.php:73: $schedule->command('videos:get-channel-stats --type=weekly')
>./app/Console/Kernel.php:78: $schedule->command('videos:get-channel-stats --type=monthly')
>./app/Console/Kernel.php:83: $schedule->command('videos:get-video-stats --type=daily')
>./app/Console/Kernel.php:88: $schedule->command('videos:get-video-stats --type=weekly')
>./app/Console/Kernel.php:93: $schedule->command('videos:get-video-stats --type=monthly')
Of course you can use find within your IDE, but the benefit of this is having a txt file where you can tick them off
I recently had to refactor a single column in a very large app (thousands of routes, 270 models) and wondered if there was a better way to track usage of a single column
My specific scenario was a nightmare because what I wanted to do was refactor a column called "type" to be called "type_id" so that
$model->type could return an object, where as previously it just returned a string, while the original string ID could still be accessible via ->type_id.Of course it could have been possible to refactor in a different way, keep the "type" column and have the object available under another name, but other tables generally used the syntax of
->object and ->object_id. Either way lets ignore that and focus on the refactor.Obviously doing a search for "type" returned thousands of results throughout the app.
Most of the time these were either prefixed by -> or wrapped in single quotes e.g.
$model->type or $array['type']. Sometimes it might be a property in a class e.g. CreateMyModel() accepting a $type argument. Other times it was not explicit that it was being used e.g. array_keys($model->getCasts) but I think most of these instances were caught by renaming in the one place it was explicitly defined (e.g. the casts array).Nonetheless I could not figure a means of doing this refactor other than searching the entire codebase for "type" and going through every single result line by line, what I actually did was use
grep to create a txt file and then go through line by line marking each one with * at the start of the line in the text file when it had been checked. Some of these I could tell just by eyeballing the response from grep itself whether it was related so this was fairly quick to just look through the txt file.But is there a better way?
I started dreaming of one day having a project where all columns where defined in constants so I could easily find all usages of
Model::column_type although I can imagine this would make the code feel very bloated and i've never seen anyone actually attempt this, probably for good reason.It would have been nice if my Model would have had a
$type property in the class itself rather than all the Laravel magic. But then again I would still have had to go through my grep approach to find all the ways in which it was used.It may be possible to use an LLM but i've no idea how people give an entire massive monolith to an LLM and I wouldn't totally trust it to not make any mistakes checking thousands of occurrences so I would still have to go through every single one, one by one.
The only real conclusion I could draw was that (1) my grep to text file approach wasn't THAT bad and (2) the most important thing would be having full test coverage. If I had that in theory I could run the migration to rename the column and then have the test populate a list of every place that was affected. Although I don't think i'd ever be confident enough to trust and not do the grep method.
But yes, I assume many, many people have faced this problem and wondered how people approach it and if there's some amazing tool or technique i'm missing?
If anyone is not sure what I mean about the grep you can run these commands in a terminal:
grep -irn "type" ./app ./resources/views ./routes ./database > ./type_usages.logAnd get results like this into a text file
>./app/Console/Kernel.php:68: $schedule->command('videos:get-channel-stats --type=daily')
>./app/Console/Kernel.php:73: $schedule->command('videos:get-channel-stats --type=weekly')
>./app/Console/Kernel.php:78: $schedule->command('videos:get-channel-stats --type=monthly')
>./app/Console/Kernel.php:83: $schedule->command('videos:get-video-stats --type=daily')
>./app/Console/Kernel.php:88: $schedule->command('videos:get-video-stats --type=weekly')
>./app/Console/Kernel.php:93: $schedule->command('videos:get-video-stats --type=monthly')
Of course you can use find within your IDE, but the benefit of this is having a txt file where you can tick them off
one by one.
You could also put it into a CSV for use with Excel or any other tool like so:
https://redd.it/1q0hzag
@r_php
You could also put it into a CSV for use with Excel or any other tool like so:
echo "File Path,Line Number,Snippet" > type_usages.csv && grep -rin "type" ./app ./resources/views ./routes ./database | sed 's/"/""/g' | sed -E 's/^([^:]+):([^:]+):(.*)$/"\1",\2,"\3"/' >> type_usages.csvhttps://redd.it/1q0hzag
@r_php
Reddit
From the laravel community on Reddit
Explore this post and more from the laravel community
Anyone any experience with Mago - an alternative for PHP-CS-Fixer, Psalm, PHPStan, and PHP_CodeSniffer?
I just came across this project and it seems very interesting. My current setup includes:
* PHP-CS-Fixer
* PHPStan
* Rector
I'm wondering if Mago might be a tool worth looking into. Anyone has any experience with it? I'd appreciate any feedback
https://redd.it/1q0yrto
@r_php
I just came across this project and it seems very interesting. My current setup includes:
* PHP-CS-Fixer
* PHPStan
* Rector
I'm wondering if Mago might be a tool worth looking into. Anyone has any experience with it? I'd appreciate any feedback
https://redd.it/1q0yrto
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
Lychee 7 is released! FrankenPHP, Webshop & background processing
https://lycheeorg.dev/2025-12-31-version-7/
https://redd.it/1q1281q
@r_php
https://lycheeorg.dev/2025-12-31-version-7/
https://redd.it/1q1281q
@r_php
Lychee
Version 7 released!
Another year, another major release for Lychee! Version 7 is here with exciting new features and improvements.
Detecting unauthorized tampering or modifications in Symfony.
Happy New Year!
Starting the first day of the year by shipping a new feature Verify Audit Log Integrity Ensure the integrity of your audit logs by detecting any unauthorized tampering or modifications. This command validates cryptographic hashes to identify compromised records and ensure trustworthiness of audit data.
https://preview.redd.it/0gn2z5inqrag1.png?width=794&format=png&auto=webp&s=92ed22bd55115c61ce92d7184952a4772c510ecd
You can find the code here: AuditTrailBundle
https://redd.it/1q18yoq
@r_php
Happy New Year!
Starting the first day of the year by shipping a new feature Verify Audit Log Integrity Ensure the integrity of your audit logs by detecting any unauthorized tampering or modifications. This command validates cryptographic hashes to identify compromised records and ensure trustworthiness of audit data.
https://preview.redd.it/0gn2z5inqrag1.png?width=794&format=png&auto=webp&s=92ed22bd55115c61ce92d7184952a4772c510ecd
You can find the code here: AuditTrailBundle
https://redd.it/1q18yoq
@r_php
Musings and realizations from 2025 as a Laravel developer
https://cosmastech.com/2026/01/01/musings.html
https://redd.it/1q17w2j
@r_php
https://cosmastech.com/2026/01/01/musings.html
https://redd.it/1q17w2j
@r_php
cosmastech
Musings on 2025
As 2025 wraps up, I wanted to touch on some broader topics that I thought deeply about this year.
Open Source NovaRadio CMS – A modern, all-in-one management system for internet radio (AzuraCast integrated)
Hi everyone! 👋
I’ve just released the first version (v0.1.0) of NovaRadio CMS – a professional Content Management System designed specifically for internet radio stations.
I’m a radio enthusiast and developer, and I noticed there was a gap for a modern, PHP 8.4-based CMS that plays nicely with AzuraCast.
# 🚀 Key Features in the First Version:
Full AzuraCast Integration: Manage stations, API keys, and streams directly.
DJ & Admin Panels: Separate dashboards for DJs to manage their shows without needing full AzuraCast access.
Real-Time Interaction: AJAX-powered live chat, song requests, and dedications.
Content Suite: Manage shows, schedules, podcasts, blog posts, events, and even a simple merch shop.
Listener Engagement: Polls, contests, music charts, and song history.
Branding & Customization: Light/Dark mode, custom widgets, and full SEO control.
# 🛠 Tech Stack:
PHP 8.4+ (utilizing modern features)
MariaDB / MySQL
Vanilla JS & CSS3 (keeping it lightweight)
Docker-friendly
# 🔗 Links:
GitHub Repository: [https://github.com/novik133/NovaRadio](https://github.com/novik133/NovaRadio)
Live Demo: https://novikradio.com
Note: This is the very first version (v0.1.0). It’s functional and feature-rich, but I’m actively looking for feedback, bug reports, and suggestions for future updates.
Feel free to check it out, star the repo if you like it, and let me know what you think!
https://redd.it/1q1qrwu
@r_php
Hi everyone! 👋
I’ve just released the first version (v0.1.0) of NovaRadio CMS – a professional Content Management System designed specifically for internet radio stations.
I’m a radio enthusiast and developer, and I noticed there was a gap for a modern, PHP 8.4-based CMS that plays nicely with AzuraCast.
# 🚀 Key Features in the First Version:
Full AzuraCast Integration: Manage stations, API keys, and streams directly.
DJ & Admin Panels: Separate dashboards for DJs to manage their shows without needing full AzuraCast access.
Real-Time Interaction: AJAX-powered live chat, song requests, and dedications.
Content Suite: Manage shows, schedules, podcasts, blog posts, events, and even a simple merch shop.
Listener Engagement: Polls, contests, music charts, and song history.
Branding & Customization: Light/Dark mode, custom widgets, and full SEO control.
# 🛠 Tech Stack:
PHP 8.4+ (utilizing modern features)
MariaDB / MySQL
Vanilla JS & CSS3 (keeping it lightweight)
Docker-friendly
# 🔗 Links:
GitHub Repository: [https://github.com/novik133/NovaRadio](https://github.com/novik133/NovaRadio)
Live Demo: https://novikradio.com
Note: This is the very first version (v0.1.0). It’s functional and feature-rich, but I’m actively looking for feedback, bug reports, and suggestions for future updates.
Feel free to check it out, star the repo if you like it, and let me know what you think!
https://redd.it/1q1qrwu
@r_php
GitHub
GitHub - novik133/NovaRadio: Modern Radio Management System featuring: Multi-station AzuraCast support 📻, Real-time Chat 💬, Advanced…
Modern Radio Management System featuring: Multi-station AzuraCast support 📻, Real-time Chat 💬, Advanced Scheduling 📅, Podcasts & Blog 🎙️, Song Requests/Dedications 🎶, and a full Admin/DJ Da...
Sunsetting Enlightn
2 months ago, u/ShadowSpade wondered what happened to Enlightn, this week I received this email:
>Sunsetting Enlightn
>After much thought and consideration, we are sunsetting Enlightn. It will be shutting down starting Jan 2026. With rapid advances in AI powered code assistants, it has become clear that they now cover most of the use cases Enlightn was built for.
>Recently purchased licenses have been fully refunded. Feel free to email us at sales at laravel-enlightn dot com for any questions or refund requests if we missed on refunding your recently purchased license. The open source package on Github will stay available for anyone who finds it useful. Thank you for the support and for trusting Enlightn to help improve your apps over the years!
https://redd.it/1q1tal9
@r_php
2 months ago, u/ShadowSpade wondered what happened to Enlightn, this week I received this email:
>Sunsetting Enlightn
>After much thought and consideration, we are sunsetting Enlightn. It will be shutting down starting Jan 2026. With rapid advances in AI powered code assistants, it has become clear that they now cover most of the use cases Enlightn was built for.
>Recently purchased licenses have been fully refunded. Feel free to email us at sales at laravel-enlightn dot com for any questions or refund requests if we missed on refunding your recently purchased license. The open source package on Github will stay available for anyone who finds it useful. Thank you for the support and for trusting Enlightn to help improve your apps over the years!
https://redd.it/1q1tal9
@r_php
Reddit
From the laravel community on Reddit
Explore this post and more from the laravel community
I'm a little confused with MVC(Need good resources)
I am just biggner in oop PHP, and after some projects I decided to learn MVC but after a long time I didn't really get what MVC is and how I can work with itI need help with good resources with MVC
#
https://redd.it/1q09x1v
@r_php
I am just biggner in oop PHP, and after some projects I decided to learn MVC but after a long time I didn't really get what MVC is and how I can work with itI need help with good resources with MVC
#
https://redd.it/1q09x1v
@r_php
Reddit
From the PHP community on Reddit
Explore this post and more from the PHP community
PHP Array Shapes - potential RFC, looking for feedback
I used AI to draft an implementation of PHP array shapes. I used Claude to implement the idea in PHP's C source - I want to get it out there, full transparency.
Reason I'm posting here: I'd like to see if this is something people would even want in PHP or not. These are extension to PHP's type system enabling devs to use native PHP to relay what's inside an array.
Repository goes into details, so I'll just post the repo here: https://github.com/signalforger/php-array-shapes
There's a patch that enables compiling PHP with the support for array shapes for return types and function parameter types, for version 8.5.1
Looking for honest feedback, does this potential feature appear useful or not? I know this community doesn't pull any punches, let me know what you think :)
https://redd.it/1q1x840
@r_php
I used AI to draft an implementation of PHP array shapes. I used Claude to implement the idea in PHP's C source - I want to get it out there, full transparency.
Reason I'm posting here: I'd like to see if this is something people would even want in PHP or not. These are extension to PHP's type system enabling devs to use native PHP to relay what's inside an array.
Repository goes into details, so I'll just post the repo here: https://github.com/signalforger/php-array-shapes
There's a patch that enables compiling PHP with the support for array shapes for return types and function parameter types, for version 8.5.1
Looking for honest feedback, does this potential feature appear useful or not? I know this community doesn't pull any punches, let me know what you think :)
https://redd.it/1q1x840
@r_php
GitHub
GitHub - signalforger/php-array-shapes: PHP RFC: Array Shape Return Types (draft + implementation)
PHP RFC: Array Shape Return Types (draft + implementation) - signalforger/php-array-shapes
Conditional Audit Logging
Created a Symfony AuditTrailBundle that supports declarative audit conditions. Use expressions like
https://preview.redd.it/f6wuj10ycyag1.png?width=871&format=png&auto=webp&s=af315f2d5dee8ffc15f55eb78f05945438c1d645
https://redd.it/1q215l5
@r_php
Created a Symfony AuditTrailBundle that supports declarative audit conditions. Use expressions like
#[AuditCondition("action == 'update' and object.getPrice() > 100")] to control exactly when entities are audited. No more logging everything and filtering later.https://preview.redd.it/f6wuj10ycyag1.png?width=871&format=png&auto=webp&s=af315f2d5dee8ffc15f55eb78f05945438c1d645
https://redd.it/1q215l5
@r_php
GitHub
GitHub - rcsofttech85/AuditTrailBundle: A lightweight, high-performance Symfony bundle that automatically tracks and stores Doctrine…
A lightweight, high-performance Symfony bundle that automatically tracks and stores Doctrine ORM entity changes for audit logging and compliance. - rcsofttech85/AuditTrailBundle
Tiny PHP pretty-printer that formats arrays like PyTorch tensors
I’ve released a small helper for anyone working with PHP + data-heavy code (ML experiments, debugging, logs, educational projects, etc.).
PrettyPrint is a zero-dependency callable pretty-printer for PHP arrays with clean, Python-style formatting. It supports aligned 2D tables, PyTorch-like tensor views, summarization (head/tail rows & columns), and works both in CLI and web contexts.
Install:
composer require apphp/pretty-print
Examples:
Aligned 2D table:
pprint(1, 23, 456, 12, 3, 45);
// [ 1, 23, 456,
// 12, 3, 45]
PyTorch-style 2D output:
pprint($matrix);
// tensor(
// [ 1, 2, 3, 4, 5,
// 6, 7, 8, 9, 10,
// 11, 12, 13, 14, 15
// ])
Summaries for big matrices:
pprint($m, headRows: 2, tailRows: 1, headCols: 2, tailCols: 2);
3D tensors with ellipsis:
pprint($tensor3d, headB: 1, tailB: 1);
// tensor(
// [ 1, 2, ..., 4, 5,
// 6, 7, ..., 9, 10,
// ...,
// 21, 22, ..., 24, 25
// ])
Also supports labels, precision, start/end strings, and even acts as a callable object:
$pp = new PrettyPrint();
$pp('Hello', 42);
// Hello 42
You may find much more information in repo: *https://github.com/apphp/pretty-print*
If you often stare at messy
https://redd.it/1q2cu1w
@r_php
I’ve released a small helper for anyone working with PHP + data-heavy code (ML experiments, debugging, logs, educational projects, etc.).
PrettyPrint is a zero-dependency callable pretty-printer for PHP arrays with clean, Python-style formatting. It supports aligned 2D tables, PyTorch-like tensor views, summarization (head/tail rows & columns), and works both in CLI and web contexts.
Install:
composer require apphp/pretty-print
Examples:
Aligned 2D table:
pprint(1, 23, 456, 12, 3, 45);
// [ 1, 23, 456,
// 12, 3, 45]
PyTorch-style 2D output:
pprint($matrix);
// tensor(
// [ 1, 2, 3, 4, 5,
// 6, 7, 8, 9, 10,
// 11, 12, 13, 14, 15
// ])
Summaries for big matrices:
pprint($m, headRows: 2, tailRows: 1, headCols: 2, tailCols: 2);
3D tensors with ellipsis:
pprint($tensor3d, headB: 1, tailB: 1);
// tensor(
// [ 1, 2, ..., 4, 5,
// 6, 7, ..., 9, 10,
// ...,
// 21, 22, ..., 24, 25
// ])
Also supports labels, precision, start/end strings, and even acts as a callable object:
$pp = new PrettyPrint();
$pp('Hello', 42);
// Hello 42
You may find much more information in repo: *https://github.com/apphp/pretty-print*
If you often stare at messy
print_r() dumps to print arrays, this might make your day slightly better 😄https://redd.it/1q2cu1w
@r_php
GitHub
GitHub - apphp/pretty-print: PrettyPrint is a small, zero-dependency PHP utility that formats arrays in a clean, readable, PyTorch…
PrettyPrint is a small, zero-dependency PHP utility that formats arrays in a clean, readable, PyTorch-inspired style. It supports aligned 2D tables, 3D tensors, summarized tensor views, and flexibl...
Kreuzberg.dev now has PHP bindings (open-source document processing engine)
Hi all,
We’ve added PHP bindings for Kreuzberg.dev, an open-source document processing engine with a fast Rust core.
That means Kreuzberg now supports most major backend languages:Rust, Python, Ruby, Go, PHP, Elixir, and TypeScript/Node.js
Kreuzberg is an MIT-licensed framework for extracting and structuring data from 50+ documents formats (PDFs, Office, images, emails, etc.). Repo: https://github.com/kreuzberg-dev/kreuzberg
Your feedback, thoughts, and contributions are very welcome. Have a great start to 2026!
https://redd.it/1q2ojco
@r_php
Hi all,
We’ve added PHP bindings for Kreuzberg.dev, an open-source document processing engine with a fast Rust core.
That means Kreuzberg now supports most major backend languages:Rust, Python, Ruby, Go, PHP, Elixir, and TypeScript/Node.js
Kreuzberg is an MIT-licensed framework for extracting and structuring data from 50+ documents formats (PDFs, Office, images, emails, etc.). Repo: https://github.com/kreuzberg-dev/kreuzberg
Your feedback, thoughts, and contributions are very welcome. Have a great start to 2026!
https://redd.it/1q2ojco
@r_php
GitHub
GitHub - kreuzberg-dev/kreuzberg: A polyglot document intelligence framework with a Rust core. Extract text, metadata, and structured…
A polyglot document intelligence framework with a Rust core. Extract text, metadata, and structured information from PDFs, Office documents, images, and 50+ formats. Available for Rust, Python, Rub...