PHP Reddit
31 subscribers
308 photos
40 videos
25.3K links
Channel to sync with /r/PHP /r/Laravel /r/Symfony. Powered by awesome @r_channels and @reddit2telegram
Download Telegram
Named Arguments Make PHP More Readable and a Refactoring Nightmare at the Same Time

Ever since named arguments landed in PHP 8.0, I've gone back and forth on whether they're actually a net positive.

On one hand, this is genuinely nicer to read:

createUser(
name: 'John',
email: '[email protected]',
role: 'admin'
);


On the other hand, the moment you rename that parameter, even inside a private method, something somewhere breaks. And good luck catching it without full test coverage.

The problem is that parameter names were never part of the contract before. They were implementation details. Named arguments quietly promoted them to public API, and most codebases were not ready for that.

It gets worse in teams. One developer uses named arguments everywhere for readability. Another avoids them entirely. Now your codebase is inconsistent and every PR review turns into an argument about it.

I still use them, but only at the call site of functions I do not own like built-ins and third-party libraries. For my own code that is deployed in prod, I have mostly stopped.

So where do you actually draw the line?

https://redd.it/1skchzn
@r_php
I built an open source WebSocket server in Go that's Pusher-compatible — self-host free forever, or use the managed cloud tier

Hey r/laravel,

I've been building Relay — an open source WebSocket server written in Go that's fully Pusher-compatible. I wanted to share it here because it solves a real problem I kept running into.

The problem: Reverb is great if you're on a pure Laravel monolith. But if your team runs Laravel + Next.js, or Laravel + a Node worker, or anything outside a single Laravel app — Reverb can't serve the non-Laravel parts. Relay can.

What Relay is:

Single Go binary, no runtime dependencies
Fully Pusher-protocol compatible — swap credentials, no code changes
Works with Laravel, Next.js, Rails, Django, Node, and any other language with a Pusher SDK
Multi-app support — one server, multiple projects
Built-in Channel Inspector — live view of active channels and event payloads
Self-host free forever on a $5 VPS

The managed cloud tier (Relay Cloud) is optional. Free hobby plan, $19/mo Startup, $49/mo Business. If you outgrow it, move to self-hosting with two env var changes. Same binary, no code changes.

First-party Laravel package:

bash

composer require darknautica/relay-cloud-laravel

Two env vars and broadcasting works. No config/broadcasting.php editing required.

Performance: At 1,000 concurrent connections, Relay used \~18% CPU and 38MB RAM. Reverb used \~95% CPU and 63MB RAM on equivalent hardware. Full benchmark post here: https://relaycloud.dev/blog/relay-vs-reverb-benchmark

Links:

Site + managed cloud: [https://relaycloud.dev](https://relaycloud.dev)
Open source server: https://github.com/DarkNautica/Relay
Laravel package: [https://packagist.org/packages/darknautica/relay-cloud-laravel](https://packagist.org/packages/darknautica/relay-cloud-laravel)
Docs: https://relaycloud.dev/docs

Happy to answer any questions. Would love feedback from anyone who tries it.

https://redd.it/1skfytz
@r_php
VSCode Intelephense with Workspaces?

It's lowkey killing me that VSCode Intelephense doesn't recognize libraries in the same workspace. Does anyone have a workaround for this?

One alternative is that I can have the library in the IncludePath, but that changes per project even if the library doesn't so it's annoying to have to keep adding the same library while removing the old library so when I jumpto it goes to the one in my active workspace.

Any ideas or workarounds?

https://redd.it/1skkzdk
@r_php
Laravel Privacy Agent Skills (feedback is welcome!)

Hey guys, I’ve been working for the past few months on an app in the healthcare industry that requires strong compliance with user data protection and retention policies.

I recently went to Tropical Rails in Sao Paulo and I attended Talysson Oliveira’s talk, "Privacy on Rails - pragmatically complying to data protection laws". They built an Agent Skill for their privacy-by-design approach to help Rails developers ensure their DX is aligned with these policies from the conception of a Rails app.

However, the app I’ve been working on is built with Laravel, and I thought it would be a great idea to take what they built for Rails and apply a similar concept to Laravel. That’s why I decided to create https://github.com/sairojgg/laravel-privacy-skills as a Laravel alternative.

This is my first time sharing something publicly, let alone an Agent Skill, so any feedback is more than welcome.

This project is heavily inspired by their work, and I want to give full credit to the original creators.

https://redd.it/1skpyyj
@r_php
I used multiple Claude Code instances to build and test a Laravel package across 3 production codebases

I posted recently on Reddit about building a fluent validation rule builder for Laravel (laravel-fluent-validation). Since then I also released a Rector companion package for automated migration. Instead of the usual pre-release-and-wait cycle, I ran Claude Code on the package repo and on three production Laravel codebases simultaneously and let the Claude instances work together.

# The workflow

claude-peers is an MCP server for Claude Code. Each instance running on your machine can discover other instances, see what they're working on, and send messages. They don't share context. Each has its own conversation with full codebase access.

In practice it works like this: the package peer tags a new release. It sends a message to the three codebase peers saying "0.4.5 tagged, fixes the parallel-worker race, please re-verify." Each codebase peer receives the message, pulls the new version, runs the migration, runs their tests, and sends back results. If something breaks, the response includes the exact error, the file, and usually a theory about why. The package peer reads that, asks follow-up questions if needed, fixes the issue, and the loop continues.

One thing I didn't expect was how quickly the peers developed their own review dynamic. They would challenge each other's assumptions, ask for evidence, and sometimes reach consensus before coming back with a recommendation.

I had four terminals open:

The package repo, building features, writing tests, shipping releases
Three production codebases, each a real Laravel app with its own validation patterns, framework integrations, and test suites

Everything runs locally. Claude Code works on local clones of each codebase, with the same filesystem access you'd have in your terminal. No production servers, no remote environments, no secrets exposed to AI.

The interesting part was what the peers caught that tests and synthetic fixtures couldn't:

One app has 108 FormRequests and uses `rules()` as a naming convention on Actions and Collections. The skip log grew to 2,988 entries / 777KB. On a smaller codebase you'd never notice.
Another app runs 15 parallel Rector workers. The skip log's truncate flag was per-process, so every worker wiped the others' entries. Synthetic fixtures run single-process. This bug doesn't exist there.
The same app runs Filament alongside Livewire. Five components use Filament's `InteractsWithForms` trait which defines its own `validate()`. Inserting the package's trait would have been a fatal collision on first render.
A third app found that 5/7 of its Livewire files had dead #[Validate] attributes coexisting with explicit validate([...]) calls. Nobody anticipated that pattern.

Wrote up the full workflow, what worked, and when I'd use it (link in comments).

https://redd.it/1sl3ckm
@r_php
I used multiple Claude Code instances to build and test a Laravel package across 3 production codebases
/r/laravel/comments/1sl3ckm/i_used_multiple_claude_code_instances_to_build/

https://redd.it/1sl3d4l
@r_php
Is EasyAdmin still worth it with a lot of customisation?

Hey all!

I've used EasyAdmin to quickstart a back-office with a ton of (sometimes massive) forms. It works great but the more I customise its appearance, the more I feel I'm working against it.

Question: When does it lose out to plain symfony forms and twig templates? Any experience would be much appreciated!

Here's a handful of examples for context:

- boolean fields replaced with a custom tri-state toggle to track true-false-null values

- choicefields displayed as a row of buttons row to view all options at once and pick in one click

- collections of images with an extra link to view the existing file in a new tab

- collection displayed as a custom matrix (properties as rows, objects as columns, values in cells)

Some of these rely on Stimulus, ultimately I may even switch to Turbo.

https://redd.it/1sl6aci
@r_php
25 years to the day !! of my first surviving open source PHP project: PHP-Egg, born 13 April 2001. FIrst PHP Daemon. First RFC PHP client (IRC). First long-running (months on end) PHP process.
https://github.com/hopeseekr/phpegg

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