PHP Reddit – Telegram
PHP Reddit
34 subscribers
292 photos
37 videos
24.9K links
Channel to sync with /r/PHP /r/Laravel /r/Symfony. Powered by awesome @r_channels and @reddit2telegram
Download Telegram
How I make my Inertia applications as type safe as possible

Hi everyone!

There have been a couple of posts regarding type safety using Laravel & Inertia. I've also been playing around with this over the past year or so and landed on a solution that works very well for me, so I thought I'd share it. The GIF below shows me changing a parameter in PHP and immediately receiving errors in both PHP & TypeScript.

[My approach to type safety in Inertia detects errors immediately](https://i.redd.it/gvgut8p51epe1.gif)

The steps to achieve this are as follows:

* **Set Up Dependencies**: Install [Laravel Data](https://github.com/spatie/laravel-data/) and [TypeScript Transformer](https://github.com/spatie/laravel-typenoscript-transformer), publish the config for the latter
* **Use Data Objects**: Use data objects as second parameter to `inertia` or `Inertia::render` functions
* **(Optional) Enable Deferred Props**: Ensure `DeferProp` is typed correctly by extending the `default_type_replacements` key of the transformer’s config
* **Generate Types From Data Objects**: Use a composer noscript to generate TypeScript types from your data objects
* **Use Types in React / Vue**: Use the generated types in the App.Data namespace in your React / Vue components
* **Automate Type Updates**: Extend `vite.config.js` with custom plugin to regenerate types whenever data classes change
* **(Optional) CI/CD**: Run type generation in CI so the build fails in case of type errors

If you want to look at the step by step tutorial, you can check out my latest blog post [https://matthiasweiss.at/blog/bulletproofing-inertia-how-i-maximize-type-safety-in-laravel-monoliths/](https://matthiasweiss.at/blog/bulletproofing-inertia-how-i-maximize-type-safety-in-laravel-monoliths/)


Best,

Matthias

https://redd.it/1jdycoc
@r_php
Deploying Laravel

In a world that has so many different technologies, what's the best for Laravel deployment? Do I use docker or something similar? Do I just keep running apache?

My current stack is a ec2 aws instance running Amazon Linux, and my Laravel app uses almost all from the framework (queues, broadcasting, background jobs...) and version 10.

Marked this as a discussion because my stack is working perfectly, but I'm afraid that it will become hard to maintain in a couple of years. So I want to hear your ideas and how you deploy your own apps.

Edit: I thought that more people used containers

https://redd.it/1je2rmi
@r_php
Config vs. Enum for Managing Supported File Conversions – What’s Your Preference?

Hey r/Laravel community! 👋

A few weeks ago, I launched **Doxswap** (pre-release), a Laravel package for **seamless document conversion** (DOCX → PDF, Markdown → HTML, etc.). The response was **really positive**, and I got **valuable feedback**—especially from this subreddit! 🙌

Now, as I work toward **Doxswap v1**, I’m tackling a design decision:

# 🔍 The Problem

I need a way to **store and validate**:

* **Which conversions are supported** (e.g., DOCX → PDF is valid, but PNG → DOCX is not).
* **MIME types for each format** (e.g., `application/pdf` for PDFs).
* **Easy maintenance & future expansion** (new formats, integrations, etc.).

Right now, I’m debating between **storing this data in a config file (**`config/doxswap.php`**)** or using an **Enum class (**`DocumentFormat::class`**)**. I’d love to hear your thoughts! 🚀

Currently in the pre-release it's all stored in config. But I plan on adding more conversion drivers which could make the doxswap config bloated as I would have to specify support conversions and mime types for each conversion driver.

Option 1: stick with config

'drivers' => [

'libreoffice' => [

'path' => env('LIBRE_OFFICE_PATH', '/usr/bin/soffice'),

'supported_conversions' => [
'doc' => ['pdf', 'docx', 'odt', 'rtf', 'txt', 'html', 'epub', 'xml'],
'docx' => ['pdf', 'odt', 'rtf', 'txt', 'html', 'epub', 'xml'],
'odt' => ['pdf', 'docx', 'doc', 'txt', 'rtf', 'html', 'xml'],
'rtf' => ['pdf', 'docx', 'odt', 'txt', 'html', 'xml'],
'txt' => ['pdf', 'docx', 'odt', 'html', 'xml'],
'html' => ['pdf', 'odt', 'txt'],
'xml' => ['pdf', 'docx', 'odt', 'txt', 'html'],
'csv' => ['pdf', 'xlsx', 'ods', 'html'],
'xlsx' => ['pdf', 'ods', 'csv', 'html'],
'ods' => ['pdf', 'xlsx', 'xls', 'csv', 'html'],
'xls' => ['pdf', 'ods', 'csv', 'html'],
'pptx' => ['pdf', 'odp'],
'ppt' => ['pdf', 'odp'],
'odp' => ['pdf', 'pptx', 'ppt'],
'noscript' => ['pdf', 'png', 'jpg', 'tiff'],
'jpg' => ['pdf', 'png', 'noscript'],
'png' => ['pdf', 'jpg', 'noscript'],
'bmp' => ['pdf', 'jpg', 'png'],
'tiff' => ['pdf', 'jpg', 'png'],
],

'mime_types' => [
'doc' => 'application/msword',
'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'odt' => 'application/vnd.oasis.opendocument.text',
'rtf' => 'text/rtf',
'txt' => 'text/plain',
'html' => 'text/html',
'xml' => 'text/xml',
'csv' => 'text/csv',
'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'xls' => 'application/vnd.ms-excel',
'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'ppt' => 'application/vnd.ms-powerpoint',
'odp' => 'application/vnd.oasis.opendocument.presentation',
'noscript' => 'image/noscript+xml',
'jpg' => 'image/jpeg',
'png' => 'image/png',
'bmp' => 'image/bmp',
'tiff' => 'image/tiff',
]

],

# Pros:

✔️ **Easier to modify** – No code changes needed; just edit `config/doxswap.php`.
✔️ **Supports environment overrides** – Can be adjusted dynamically via `.env` or `config()` calls.
✔️ **User-friendly for package consumers** – Developers using my package can **customize it without modifying
source code**.

# Cons:

**No strict typing** – You could accidentally pass an unsupported format.
**No IDE auto-completion** – Developers don’t get hints for available formats.
**Can be less performant** – Uses `config()` calls vs. in-memory constants.

Option 2: Using an Enum (`DocumentFormat.php`)

namespace App\Enums;

enum LibreOfficeDocumentFormat: string
{
case DOC = 'doc';
case DOCX = 'docx';
case PDF = 'pdf';
case XLSX = 'xlsx';
case CSV = 'csv';

public static function values(): array
{
return array_column(self::cases(), 'value');
}

public static function isValid(string $format): bool
{
return in_array($format, self::values(), true);
}
}

# Pros:

✔️ **Strict typing** – Prevents typos and ensures only valid formats are used.
✔️ **IDE auto-completion** – Developers get **hints** when selecting formats.
✔️ **Better performance** – Faster than config files since values are stored in memory.

# Cons:

**Harder to modify dynamically** – Requires **code changes** to add/remove formats.
**Less user-friendly for package consumers** – They must **extend the Enum** instead of just changing a config file.
**Less flexible for future expansion** – Adding support for new formats requires **code changes** rather than a simple config update.

# 🗳️ What Do You Prefer?

Which approach do you think is **better for a Laravel package**?
Would you prefer a **config file for flexibility** or **an Enum for strict validation**?

The other question is "would anyone even need to modify the config or mime types?"

🚀 Looking forward to hearing your thoughts as I work toward **Doxswap v1!** 🔥


You can check out Doxswap here [https://github.com/Blaspsoft/doxswap](https://github.com/Blaspsoft/doxswap)

https://redd.it/1je2r7v
@r_php
Enums for authorisation

https://laravel-news.com/authorization-backed-enums

I do think being able to use an enum in authorisation checks is an improvement over directly using strings but I’m not sure backed enum are much better.

I’ve not checked, but I suspect that the enum is converted to its backed value rather than using its identity to find the correct check. It feels like a missed opportunity.

https://redd.it/1je4s29
@r_php
Laravel Starter Kit, or Laravel SPA

For SaaS, what's better to use, the laravel starter kit for either Vue or React, or use Laravel with Vue for example as SPA application? I haven't used any of the starter kits, I've only used Laravel wit Vue SPA, what are the advantages of using the starter kit?

I have no experience with Interia

Sorry for the confusion: I meant a SPA with Laravel Sanctum, Pinia and etc, versus the default SPA that are the starter kits

https://redd.it/1je9618
@r_php
How Much Memory Does A Worker Use?

Yep, I get the logical fallacy here. May as well ask how long is a rope. BUT...I'm wondering from your experience what have you seen as an average in your projects? I'd like to do some basic calculations to estimate how much ram my VPS will need for an upcoming project. Not looking for anything exact, just roughly.

If you would like, you can assume my project will be extensive and lots of features and tools. Complex.

https://redd.it/1jeag1a
@r_php
Should I learn PHP or .NET?

I already know web development with react and next js and I wanted to learn something related backend to upscale myself I don’t want to learn node although I know how it works (don’t know how to code in it) I’m confused between PHP and .NET.

https://redd.it/1jem95k
@r_php
Form still submit through live component instead of symfony controller

Where am I doing it wrongly?

I have the live component extends abstract controller with defaultactiontrait and compnentwithformtrait as per documentation and create form via instantiateForm.

Inside symfony controller I have created form as usual and then pass the form to live component via twig as per documentation.

When it rendered first time, the form created in symfony controller is used. But when I submit, it appears live component form is submitted instead.

My impression is there is seperate form instance being created when a refresh is done in live component.

I saw in symfony profile, there r two POST, first one was for symfony controller and second POST was for live component.

https://redd.it/1jeozl1
@r_php
Who's hiring/looking

This is a bi-monthly thread aimed to connect PHP companies and developers who are hiring or looking for a job.

Rules

No recruiters
Don't share any personal info like email addresses or phone numbers in this thread. Contact each other via DM to get in touch
If you're hiring: don't just link to an external website, take the time to describe what you're looking for in the thread.
If you're looking: feel free to share your portfolio, GitHub, … as well. Keep into account the personal information rule, so don't just share your CV and be done with it.

https://redd.it/1jesouk
@r_php
Can't Livewire be smart enough to detect Alpinejs is already installed on the project and not install(run) it again?

I've spent 3 hours trying to solve an issue with a volt component today. I had an input with a variable binded with wire:model attribute. And I just couldn't get the variable to change. Every other thing was working on the app though, it successfully created a DB record, but just didn't empty the text input no matter what I did.

Some of the things I tried : $a = $this->pull('string'), $this->reset('string'), and even straight up $this->string = "";

Then I remembered I started this project with Breeze auth (which comes with alpinejs), and then I installed livewire/volt which apparently also runs alpinejs in the background.

I'm 100% aware that this particular case was a skill issue, since simply opening the Dev tools console showed what was causing the error; Detected multiple instances of Alpine running

But the thing is, I was writing PHP code the whole way. And you don't debug with Dev tools console when you're writing PHP. That's why I wasted 3 hours looking everywhere for a bug except the console.

So, back to my question: is it not possible to add some conditions to check if alpinejs already initialized in the app.js file, so that both of these first (and almost-first) party Laravel packages wouldn't conflict with each other when installed on a brand new project?

https://redd.it/1jf3dbc
@r_php
Best practice for Vue integration

Hey all,

As per noscript, wdyt is the best way to use Vue with Symfony?

I found some old articles and I see Symfony UX explained a little on the website but I would like some insight if anyone has it, or some resources.

Cheers!

https://redd.it/1jf76o6
@r_php
Why doesn't laravel have the concept of router rewriting

A concept found in the zend framework (and i likely others) is route rewriting, so if you had `/products/{product:slug}`, it could be hit with `/{product:slug}` if configured that way.

Its currently impossible to have multiple routes that are a single dynamic parameter, so if i want to have user generated pages such as /about and /foobar created in a cms, and then also have products listed on the site, such as /notebook or /paintbrush, i would have to register each manually, and when the DB updates, trigger 'route:clear' and 'route:cache' again.

Rewrites would be a powerful tool to support this in a really simple way, is there any reasoning why it isnt used, or is this something that would be beneficial to the community?

Edit: to clarify, what i want to have as a mechanism where you can register two separate dynamic routes, without overlapping, so rather than just matching the first one and 404 if the parameter cant be resolved, both would be checked, i have seen router rewriting used to achieve this in other frameworks, but i guess changes to the router itself could achieve this

if i have

Route::get('/{blog:slug}', [BlogController::class, 'show']);

Route::get('/{product:name}', [ProductsController::class, 'pdp']);

and go to /foo, it will match the blog controller, try to find a blog model instance with slug 'foo', and 404 if it doesn't exist, IMO what SHOULD happen, is the parameter resolution happening as part of determining if the route matches or not, so if no blog post is found, it will search for a product with name 'foo', if it finds one match that route, if not keep checking routes.

https://redd.it/1jfc2ao
@r_php
Why doesn't laravel have the concept of router rewriting

A concept found in the zend framework (and i likely others) is route rewriting, so if you had `/products/{product:slug}`, it could be hit with `/{product:slug}` if configured that way.

Its currently impossible to have multiple routes that are a single dynamic parameter, so if i want to have user generated pages such as /about and /foobar created in a cms, and then also have products listed on the site, such as /notebook or /paintbrush, i would have to register each manually, and when the DB updates, trigger 'route:clear' and 'route:cache' again.

Rewrites would be a powerful tool to support this in a really simple way, is there any reasoning why it isnt used, or is this something that would be beneficial to the community?

Edit: to clarify, what i want to have as a mechanism where you can register two separate dynamic routes, without overlapping, so rather than just matching the first one and 404 if the parameter cant be resolved, both would be checked, i have seen router rewriting used to achieve this in other frameworks, but i guess changes to the router itself could achieve this

if i have

Route::get('/{blog:slug}', [BlogController::class, 'show']);

Route::get('/{product:name}', [ProductsController::class, 'pdp']);

and go to /foo, it will match the blog controller, try to find a blog model instance with slug 'foo', and 404 if it doesn't exist, IMO what SHOULD happen, is the parameter resolution happening as part of determining if the route matches or not, so if no blog post is found, it will search for a product with name 'foo', if it finds one match that route, if not keep checking routes.

https://redd.it/1jfc6qi
@r_php
Google Cloud Pub Sub Multiple Subnoscriptions

Hey everyone,

At my work, we run a Symfony 7.2 app within Google Cloud, and we have an in-house written process that will pull from the various subnoscriptions we have and process messages.

I've now been tasked with rewriting this and integrating it into Symfony Messenger. That challenge is that for ... reasons (https://github.com/symfony/symfony/issues/44635), Symfony Devs refuse to write an integration for Messenger.

This leaves me looking at packages like petit press messenger https://github.com/petitpress/gps-messenger-bundle, however I have 2 basic requirements:

It must support multiple topics/subnoscriptions
I must have the option of cycling through the subnoscriptions and pulling messages, like a round robin. (So pull 10 from Sub A, 10 from Sub B etc)

Petit Messenger doesn't do either of these as far as I can tell, so was part way through writing my own.

I guess the challenge with this will be how I link a message back to a queue to be able to acknowledge it.

Just wondering if anyone else has had to do something similar, and what was your solution.

Cheers

https://redd.it/1jfk21i
@r_php
Scaling PHP for Real-World Applications: Seeking Your Feedback on My Newsletter

As the noscript says, I'm looking for feedback and critique. Every year we hear from someone about the fictional death of the immortal PHP =). But as a CTO specializing in PHP refactoring, I see its immense potential for scaling. I've launched a “PHP at Scale” newsletter — my monthly deep dive into best practices, architecture patterns, and real-world use cases of PHP in large, complex applications. https://phpatscale.substack.com

Getting meaningful critique and improvement suggestions is hard as you start a newsletter like this, so I hope you guys can get me some. The idea for this newsletter is to help the community, so I will value any ideas or opinions.  

As of right now, my newsletter has 7 issues, some of the topics I’ve tried to cover practically:

PHP's place in the modern web development scene
Keeping code-base up-to-date
Day-to-day rules we can follow to improve our code
Improving performance
Documentation
My interview with Roman Pronskiy (CEO of the PHP Foundation) + some business perspective on PHP 

Specific Questions for Your Feedback:

What are the most significant scaling challenges you're currently facing in your PHP projects?
Are there any specific architecture patterns or best practices related to PHP scaling that you would be most interested in reading about in the newsletter?
Are there any specific topics you would like covered in future issues?
What is your preferred newsletter length and frequency?

I value your insights and opinions. Hope you’ll find something useful for yourself in my newsletter, if you do - consider subscribing. 



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