PHP Reddit – Telegram
PHP Reddit
34 subscribers
294 photos
39 videos
25K links
Channel to sync with /r/PHP /r/Laravel /r/Symfony. Powered by awesome @r_channels and @reddit2telegram
Download Telegram
Why I built another Audit Bundle for Symfony

# Why I built another Audit Bundle for Symfony (and why you might need it)

When I started my latest Symfony project, I looked at the existing options for entity auditing. While there are some massive, well-established bundles out there, I ran into a few common headaches:

They felt "heavy": Often bringing in dependencies or UI components I didn't need.

Hard to customize: Trying to exclude specific fields or logic was surprisingly difficult.

No Integrity Checks: I had no easy way to verify if someone had manually tampered with the audit logs in the database.

So, I built AuditTrailBundle. Here is why it’s different:

1. Conditional Logging (The "Smart" Audit) Sometimes you don’t want to log everything. Logging a last_login update every 5 minutes is a waste of storage. I added Expression Language support, allowing you to set rules so the bundle only logs changes if a specific condition is met or if a high-priority field actually changed.
2. If audit logs are used for compliance, you must be able to detect whether someone has manually altered them to hide their tracks. This bundle includes an integrity check feature that verifies the audit history remains untouched and authentic.
3. Performance-First Architecture Many bundles slow down the main request because of how they handle entity relations. This bundle hooks into the onFlush event, ensuring the audit trail is part of the same database transaction. If your data rolls back, the audit rolls back. No orphaned logs, no performance lag.
4. The "Split Transport" Advantage One of the biggest fears with auditing is bloating the primary database. If your app has millions of transactions, your audit_log table can become a maintenance nightmare. I built a Split Transport feature so you aren't forced to save logs in the same place as your app data. You can route audit trails to a different database connection or an external transport, allowing you to scale without slowing down your high-traffic tables.
5. "Silent Collection" Tracking Most lightweight bundles only track simple fields like strings or integers. When it comes to Many-to-Many or One-to-Many relations, they often fail to log exactly what happened—they just say the collection "changed." My bundle performs a Collection Diff, identifying precisely which IDs were added or removed from a collection.

I didn't build this bundle to replace the giants of the Symfony ecosystem, but to provide a modern, high-performance alternative for developers who need precision and integrity.

By focusing on conditional logging, split transports for scalability, and collection tracking, AuditTrailBundle gives you a "paper trail" that is both lightweight and enterprise-ready.

Check out the project on GitHub: https://github.com/rcsofttech85/AuditTrailBundle

I’m actively looking for feedback!

https://redd.it/1qcb9lr
@r_php
Does LAMP still have a future?

I'm a beginner to web development completely self-taught, and I want to know if learning the LAMP stack and not relying on heavy frameworks is worth my time. I'm primarily self motivated to build fun things for myself/friends, and getting a job in this field is secondary. I hear a lot of bad things about PHP, but recently I built a drawing program powered by Slim and MariaDB using this noscript I found github.com/desuwa/tegaki (I am not the maintainer, I just wanted to share it). The app is simple and I use twig to render pages: a user can post a drawing, browse a gallery of all drawings, and replay a drawing.



I really enjoyed writing in PHP, the syntax was weird but it had everything built in like the PDO for my database. I'm just worried that when I want to implement more complicated features like auth through Twitter/Discord or authz with RBAC doing it all by hand is kind a waste when Django has it built in and I can use Better Auth with NodeJS. I know about Laravel/Symfony but they honestly don't interest me at all. Also what if I want to use S3 to store files or run background workers, all my research points to just sticking with NodeJS runtime or Python. Can any experienced dev give advice?

https://redd.it/1qcbfgi
@r_php
Ran some benchmarks against go, thought you guys might find this interesting (not here to hate)

so full disclosure i primarily write php for work, laravel specifically. pays the bills, i like it


but i was curious about the actual performance difference vs go since everyone has opinions but nobody posts real numbers. built the same api in both, laravel 11 with php 8.2 and go fiber. same mysql db with 500k records, same endpoints, same queries. tried to keep everything fair


screenshots attached. yeah go is faster, obviously. thats not surprising, its compiled. but i was kinda shocked by how much faster on the heavy endpoint - we're talking 30 seconds vs 1.5 seconds for basically the same sql


few things i learned:
- most of laravels overhead is just... being laravel? the actual eloquent queries arent that slow
- for basic crud the difference probably doesnt matter in real apps
- for cpu heavy stuff like aggregating data across multiple tables... ok yeah go absolutely destroys it


honestly still gonna use laravel for most things because i can ship features way faster. but for the few endpoints that need to be actually fast? might be worth writing those in go


anyone else running a mixed stack? curious how people handle this in production

https://redd.it/1qcf71g
@r_php
Sitemap Generator in Laravel.

Hello guys. I have code like that:

<?php


namespace App\Console\Commands;


use Illuminate\Console\Command;
use App\Services\Sitemap\SitemapService;


class GenerateSitemap extends Command
{
    protected
$signature
= 'sitemap:generate';
    protected
$denoscription
= 'Generate sitemap.xml including news';


    public function handle(SitemapService
$service
)
    {
       
$path
= public_path('sitemap.xml');
       
       
$service
->generate(
$path
);


       
$this
->info("Sitemap generated: {
$path
}");
    }
}

<?php


declare(strict_types=1);


namespace App\Services\Sitemap;


use Carbon\Carbon;
use SimpleXMLElement;
use Illuminate\Support\Facades\File;


class SitemapService
{
    private const BASE_URL = 'https://example.com';


    public function generate(string
$outputPath
): void
    {
       
$xml
= new SimpleXMLElement(
            '<?xml version="1.0" encoding="UTF-8"?>
            <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"></urlset>'
        );


       
$staticUrls
= [
            ['/', 'daily', '1.0'],
            ['/section-a', 'daily', '0.9'],
            ['/section-b', 'hourly', '0.9'],
            ['/section-c', 'weekly', '0.8'],
            ['/section-d', 'daily', '0.8'],
            ['/about', 'monthly', '0.5'],
            ['/contact', 'monthly', '0.5'],
        ];


        foreach (
$staticUrls
as [
$path
,
$freq
,
$priority
]) {
           
$this
->addUrl(
               
$xml
,
                self::BASE_URL .
$path
,
                now(),
               
$freq
,
               
$priority
            );
        }


        Model::where('status', 1)
            ->whereNotNull('published_at')
            ->latest('published_at')
            ->chunk(500, function (
$items
) use (
$xml
) {
                foreach (
$items
as
$item
) {
                   
$this
->addUrl(
                       
$xml
,
                        self::BASE_URL . '/content/' .
$item
->
slug
,
                       
$item
->
published_at
,
                        'daily',
                        '0.8'
                    );
                }
            });


        File::put(
$outputPath
,
$xml
->asXML());
    }


    private function addUrl(
        SimpleXMLElement
$xml
,
        string
$loc
,
        mixed
$lastmod
,
        string
$freq
,
        string
$priority
    ): void {
       
$url
=
$xml
->addChild('url');
       
$url
->addChild('loc', htmlspecialchars(
$loc
, ENT_XML1));
       
$url
->addChild('lastmod', Carbon::parse(
$lastmod
)->toDateString());
       
$url
->addChild('changefreq',
$freq
);
       
$url
->addChild('priority',
$priority
);
    }
}

Schedule::command('sitemap:generate')
    ->hourly()
    ->name('hourly-sitemap-refresh');

It generate sitemap.xml automatically. And update it in one hour right? Now is there is a way that ping it to search engines automatically? and how can I check it works correctly?

https://redd.it/1qch9lu
@r_php
Messenger not consuming after Postgres upgrade

This is a bit of a long shot. Anyone have messenger not consume messages after a Postgres/SSL upgrade on Linux?

I've had a couple completely separate projects on separate VMs (zero commonality) log an error like this:

console.CRITICAL: Error thrown while running command "messenger:consume async --time-limit=3600". Message: "An exception occurred while executing a query: SQLSTATEHY000: General error: 7 FATAL: terminating connection due to administrator command SSL connection has been closed unexpectedly"


I've tracked the time the error starts to the EXACT time that Postgres is upgraded (via automatic upgrades). Messenger never recovers - it'll just log errors for days.

Messenger is running via Supervisor

Is this a known issue and/or is there a fix on the symfony side of things? I can work around it on the linux update schedule, but would prefer Messenger be able to recover on its own.

Cheers!

https://redd.it/1qcuyez
@r_php
Laravel Community Suspended on X

I just noticed that Laravel’s official X community was suspended. At first, I thought this was something wrong on my end, but it seems to be a global suspension. I’m not very into social media, but X and Reddit official communities are my favourites and the ones I’m most engaged with. I don't know the reason it had been decent to me, this feels like it could have a quite negative effect on Laravel itself.

https://redd.it/1qd9wg6
@r_php
Current state of end to end testing frameworks for a vanilla PHP codebase

I'm currently upgrading a legacy vanilla php 5 codebase to PHP 8 and refactoring the structure of the code around more of a MVC pattern (rather than the pure functional approach it originally had). With this, there is a lot of code being moved around and I'd like to create some tests to ensure certain functionality appears to work.

What is the most common/most used e2e testing framework for PHP applications these days? Playwright? Codeception? Selenium? Others?

https://redd.it/1qdavsi
@r_php
A free Shift to configure "Fast Laravel"

After implementing the strategies on a few different Laravel projects, I got tired of copy/pasting a bunch of snippets and files.

I figured I'd automate the tedium with a Shift... So, allow me to introduce the "Fast Laravel" Shift.

This free Shift configures a new, separate static middleware group (discussed in this Laravel News article) and adds two custom middleware for page caching.

These strategies (and more) are demonstrated in my "Fast Laravel" video course. If you want to learn more about the course and benefits of caching, there was a good Reddit discussion earlier this month.

https://redd.it/1qdiyb5
@r_php
Convert vardump output to PHPStan array shapes - Hell2Shape

Hi folks! Made a CLI tool that converts var\
dump output into PHPStan type annotations. Check it out: https://github.com/Feolius/hell2shape

There's also a web version, if you want to try it without installing anything (see repo docs). Works locally in your browser without sending any data to server (thanks to php-wasm).

Useful when you need to type those messy arrays and stdClass objects, but can't be bothered to do it by hand. It's not designed to be perfect, but it provides a solid baseline for manual refinement.

Feedbacks welcome!





https://redd.it/1qdlox5
@r_php
AI generated content posts

A bit of a meta post, but /u/brendt_gd, could we please get an "AI" flair that must be added to every post that predominantly showcases AI generated content?

We get so many of these posts lately and it's just stupid. I haven't signed up to drown in AI slop. If the posters can't bother to put in any effort of their own, why would I want to waste my time with it? It's taking away from posts with actual substance.

For what it's worth, I'm personally in favour of banning slop posts under "low effort" content, but with a flair people could choose if they want to see that garbage.

https://redd.it/1qdrv9c
@r_php
Coupled vs Decoupled

What’s your approach if you’re a solo dev and you’re to build a small to medium web app.

Will you go full Laravel + blade (Coupled)?

OR

Do you prefer decoupling the backend and frontend…and use JS Frameworks (Decoupled)?

https://redd.it/1qdvr1t
@r_php