PHP Reddit – Telegram
PHP Reddit
34 subscribers
288 photos
36 videos
24.8K links
Channel to sync with /r/PHP /r/Laravel /r/Symfony. Powered by awesome @r_channels and @reddit2telegram
Download Telegram
Laravel Gems: Advanced Patterns & Architecture Beyond Controllers

I’ve been building Laravel applications for 10+ years and still genuinely love the framework, its documentation, and the community.

I’d like to start a thread compiling “gems” — talks, videos, or resources that highlight useful patterns, architectural ideas, and techniques that go beyond the usual controller / model / service approach.

Here are some of my favourite videos to kick things off. I’d love to see what resources have influenced the way you structure Laravel apps 👇

Manager pattern: [https://www.youtube.com/watch?v=jCJ\_dxAlHdo&list=PLSfH3ojgWsQopTurfF8lKNAgwtb1XzSMg&index=11](https://www.youtube.com/watch?v=jCJ_dxAlHdo&list=PLSfH3ojgWsQopTurfF8lKNAgwtb1XzSMg&index=11)
Pipeline pattern: https://www.youtube.com/watch?v=2REc-Wlvl9M
State machines: [https://www.youtube.com/watch?v=1A1xFtlDyzU&t](https://www.youtube.com/watch?v=1A1xFtlDyzU&t)
Value objects: https://www.youtube.com/watch?v=0jRTq0Hy\_50
Macros: [https://www.youtube.com/watch?v=G78sN4\_KEdU](https://www.youtube.com/watch?v=G78sN4_KEdU)
Service container + DI: https://www.youtube.com/watch?v=y7EbrV4ChJs

https://redd.it/1q35mne
@r_php
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 print_r() dumps to print arrays, this might make your day slightly better 😄

https://redd.it/1q2cu1w
@r_php
When did you know you could write your Entity as simple as this ?
https://redd.it/1q1r1pi
@r_php
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
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
Anyone try PHP dev yet on DHH’s new Omarchy Linux?

How is it? It’s supposed to be geared specifically toward web developers.

https://redd.it/1q3g7m6
@r_php
improved HTTP and queue transport handling

# [Audit Transports Documentation](https://github.com/rcsofttech85/AuditTrailBundle)

AuditTrailBundle supports multiple transports to dispatch audit logs. This allows you to offload audit processing to external services or queues, keeping your main application fast.

# 1. Queue Transport (Symfony Messenger)

The Queue transport dispatches audit logs as messages via Symfony Messenger. This is the recommended way to handle audits in high-traffic applications.

# Configuration for Queue transport

Enable the queue transport in `config/packages/audit_trail.yaml`:

audit_trail:
transports:
queue:
enabled: true
bus: 'messenger.bus.default' # Optional: specify a custom bus

You must define a transport named `audit_trail` in `config/packages/messenger.yaml`:

framework:
messenger:
transports:
audit_trail: '%env(MESSENGER_TRANSPORT_DSN)%'



# Advanced Usage: Messenger Stamps

You can pass Messenger stamps (like `DelayStamp` or `DispatchAfterCurrentBusStamp`) in two ways:

# 1. Manually (Programmatic Audits)

Pass them via the `$context` array when creating an audit log or performing a revert.

use Symfony\Component\Messenger\Stamp\DelayStamp;

// Programmatic audit log with a 5-second delay
$auditService->createAuditLog($entity, 'custom_action', null, null, [
'messenger_stamps' => [new DelayStamp(5000)]
]);

# 2. Automatically (Event Subscriber)

Use the `AuditMessageStampEvent` to add stamps to the message right before it is dispatched to the bus. This is the recommended way to add transport-specific stamps.

namespace App\EventSubscriber;

use Rcsofttech\AuditTrailBundle\Event\AuditMessageStampEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Stamp\DelayStamp;

class AuditMessengerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
AuditMessageStampEvent::class => 'onAuditMessageStamp',
];
}

public function onAuditMessageStamp(AuditMessageStampEvent $event): void
{
// Add a 5-second delay to all audit logs sent via Queue
$event->addStamp(new DelayStamp(5000));
}
}

# Queue Payload Signing

When `audit_trail.integrity.enabled` is true, the bundle automatically signs the payload to ensure authenticity. The signature is added as a `SignatureStamp` to the Messenger envelope.

use Rcsofttech\AuditTrailBundle\Message\Stamp\SignatureStamp;

// In your message handler
$signature = $envelope->last(SignatureStamp::class)?->signature;

# 2. HTTP Transport

The HTTP transport audit logs to an external API endpoint (e.g., a logging service.

# Configuration for http transport

audit_trail:
transports:
http:
enabled: true
endpoint: 'https://audit-api.example.com/v1/logs'
headers:
'Authorization': 'Bearer your-api-token'
'X-App-Name': 'MySymfonyApp'
timeout: 10 # seconds

# HTTP Payload Signing

When `audit_trail.integrity.enabled` is true, the bundle adds an `X-Signature` header to the HTTP request. This header contains the HMAC signature of the JSON body.

POST /api/logs HTTP/1.1
X-Signature: a1b2c3d4...
Content-Type: application/json

{ ... }

# Payload Structure

The transport sends a `POST` request with a JSON body:

{
"entity_class": "App\\Entity\\Product",
"entity_id": "123",
"action": "update",
"old_values": {"price": 100},
"new_values": {"price": 120},
"changed_fields": ["price"],
"user_id": 1,
"username": "admin",
"ip_address": "127.0.0.1",
"user_agent": "Mozilla/5.0...",
"transaction_hash": "a1b2c3d4...",
"signature":
"hmac-signature...",
"context": {
"app_version": "1.0.0",
"custom_meta": "value"
},
"created_at": "2024-01-01T12:00:00+00:00"
}

# 3. Doctrine Transport (Default)

The Doctrine transport stores logs in your local database. It is enabled by default.

audit_trail:
transports:
doctrine: true

# 4. Chain Transport (Multiple Transports)

You can enable multiple transports simultaneously. The bundle will automatically use a `ChainAuditTransport` to dispatch logs to all enabled transports.

audit_trail:
transports:
doctrine: true
queue:
enabled: true

# 5. Signature vs. Payload Signing

It is important to distinguish between the two types of signatures:

1. **Entity Signature (**`signature` **field in JSON):**
* Generated at the moment of creation.
* Signs the business data (Entity Class, ID, Changes).
* **Purpose:** Long-term data integrity and non-repudiation. Stored in the database.
2. **Transport Signature (**`X-Signature` **header or** `SignatureStamp`**):**
* Generated just before sending.
* Signs the *entire* payload (including the Entity Signature).
* **Purpose:** Transport security. Ensures the message wasn't tampered with during transit.

https://redd.it/1q3rey3
@r_php
Weekly /r/Laravel Help Thread

Ask your Laravel help questions here. To improve your chances of getting an answer from the community, here are some tips:

What steps have you taken so far?
What have you tried from the documentation?
Did you provide any error messages you are getting?
Are you able to provide instructions to replicate the issue?
Did you provide a code example?
Please don't post a screenshot of your code. Use the code block in the Reddit text editor and ensure it's formatted correctly.

For more immediate support, you can ask in the official Laravel Discord.

Thanks and welcome to the r/Laravel community!

https://redd.it/1q3wpbo
@r_php
My Laravel API Starter Template just got updated! you are welcome to try it!

Hello everyone,
Today, I’d like to share a Laravel API Starter Template that I’ve been using personally for quite a long time to build production-ready API projects. I’ve recently updated it to the latest Laravel version, and I believe it may be useful for many of you as well.

🔗 GitHub Repository
https://github.com/Innovix-Matrix-Systems/ims-laravel-api-starter

This starter template is designed to help you avoid rebuilding the same foundational features every time you start a new API project, so you can focus more on your actual business logic.

# What you’ll find in this starter:

🔐 Authentication & Security

Secure API authentication using Laravel Sanctum
Multi-device login with device-specific token management and logout
Phone-based OTP authentication with rate limiting
Role-Based Access Control (RBAC) with roles and permissions

📚 API Documentation

Scalar, Swagger UI, and OpenAPI support
Fully compatible with Postman for easy testing and sharing

📊 Monitoring & Observability

Laravel Telescope, Pulse, and Health
A unified dashboard to monitor application and system health

🏗️ Clean & Maintainable Architecture

Repository pattern
DTOs and service layer
Scalable, clean, and production-friendly structure

💾 Data & Background Processing

User management
Excel / CSV data import and export
Queue-based background job processing
Real-time job progress tracking
Automated cleanup for completed jobs and temporary files

🌍 Additional Features

Multi-language support (English and Bengali, with easy extensibility)
Fully containerized Docker development environment
Developer tools (code generators, IDE helpers, Git hooks)
Production-ready testing setup (Pest PHP, Mockery, queue testing, DTO validation)

If you work with Laravel and regularly build API or backend-focused projects, I hope this starter template can save you time and effort.

I kindly invite you to take a look, try it out, and share your feedback. Suggestions, issues, or contributions are always very welcome.

Thank you for your time.

https://redd.it/1q3zl4p
@r_php
Weekly Ask Anything Thread

Feel free to ask any questions you think may not warrant a post. Asking for help here is also fine.

https://redd.it/1q4bpu4
@r_php
Weekly help thread

Hey there!

This subreddit isn't meant for help threads, though there'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!

https://redd.it/1q4evsy
@r_php
PHP Version Changer?

I have several projects written in PHP, using different frameworks and CMSs. Recently, I installed PHP 8.4, and now I’m planning to install PHP 8.5 as well. After upgrading, I noticed that some of my older projects are showing deprecated warnings.

I’m looking for software or tools that allow me to easily switch between PHP versions so I can maintain and test these projects without constantly breaking compatibility.

I’ve already searched for some tools but I haven’t tested any of them yet.

Which tool would you recommend for managing multiple PHP versions efficiently in Linux and Windows.

https://redd.it/1q4kijh
@r_php
Your thoughts on Zed for Laravel development

Hi Laravel people.

I've been trying to use Zed for a while now. I keep coming back to VSCode because while Zed is so fast and nice to play with, VSCode seems to work better than VSCode for Laravel development (using regular blade and livewire).

I really wish I could use Zed more, but I don't know where to go from there to make it a great experience.

Do you use Zed full time? If so, what are the addons and settings do you use?

https://redd.it/1q4zwy6
@r_php
Deployed Laravel 12 (Concurrency) + Nuxt 4 in production. The performance boost is wild

Hey everyone,

I know using bleeding-edge versions (Laravel 12 + Nuxt 4) for a production app is risky, but I wanted to test the limits for a new project I'm building (a PPP pricing widget).

The Challenge: Since it's an embeddable widget, latency is everything. I need to resolve the user's GeoIP location AND fetch the Real-time Exchange Rate before rendering the discount.

Doing this sequentially (the old way) was adding too much overhead (\~300-400ms depending on the external APIs).

The Laravel 12 Solution: I utilized the improved Concurrency facade to run these tasks in parallel without the complexity of configuring heavy queues for a simple read operation.

use Illuminate\Support\Facades\Concurrency;

// Both APIs are hit simultaneously $geoData, rateData =

Concurrency::run( fn () => $geoService->locate($ip), fn () => $currencyService->getRate('USD', $targetCurrency), );

The Result: The API response time dropped to \\<80ms (basically just the latency of the slowest provider + small overhead).

Combined with Nuxt 4 on the frontend (the new unbundled layer size is tiny), the widget feels instant.

Has anyone else started migrating to v12 for the Concurrency features? Would love to hear if you are hitting any edge cases.

(Link to the live demo in comments if you want to check the speed)

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