Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

martinbean's avatar

martinbean wrote a reply+100 XP

3d ago

I accidentally deleted a Controller. How to recover?

@adamnet This is what version control is for. And I’m sure you had been advised to use version control some time ago…?

martinbean's avatar

martinbean wrote a reply+100 XP

3d ago

is there already an good implentation of passkey's in laravel?

@jaeggid That Laracasts series is a bit redundant now that Passkeys are natively supported by Laravel via a first-party package.

martinbean's avatar

martinbean wrote a reply+100 XP

3d ago

Database Replication

@eskiesirius This is literally the definition of premature optimisation…

martinbean's avatar

martinbean wrote a reply+100 XP

5d ago

Event-Driven Architecture, do I need it?

Should I bite the nail and continue down this road since it will eventually lead to a better product

@randy_johnson “Better” according to who…?

Event-driven architecture is like any other paradigm: it can be implemented well and it can be implemented poorly. Just implementing an event-driven architecture won’t automatically and inherently make the end result “better”.

If this is an inventory system then all you need to do is record adjustments in a table. Insert a row each time you take stock, and each time stock leaves (i.e. is sold).

martinbean's avatar

martinbean wrote a reply+100 XP

1w ago

Laravel Website Suddenly Slow After Server Migration – Possible PPA Launchpad Issue with PHP 7.4

Given this behavior, I’m wondering if this could be related to the PPA Launchpad issue. Am I thinking in the right direction?

@khanareeb You need to profile requests instead of just guessing.

Profile a request and see where the most time is being spent. My guess is, if you have moved hosting, that you’re probably pointing to a remote database that’s connecting over the network instead of via a socket on the same machine, thus introducing latency. But again, just a guess. You need to profile to confirm the actual cause.

martinbean's avatar

martinbean wrote a reply+100 XP

1w ago

what folder structure patterns have you found most effective ?

@imrandevbd You seem to have again replied to a thread just rewording exactly what I’ve written?

martinbean's avatar

martinbean was awarded Best Answer+1000 XP

1w ago

what folder structure patterns have you found most effective ?

@shivamyadav I’ve worked on probably hundreds of Laravel projects over more than 10 years now, and at companies of all sizes (from SMEs to Fortune 500s). The projects that fell apart and became unmaintainable messes were the ones where developers decided to be “clever” and create their own folder structure, or do “modules”, “domains”, or whatever.

Seriously, stick to Laravel’s default directory structure:

  • Put interfaces in an app/Contracts directory, which follows the framework’s convention.
  • Use managers for things that can have multiple providers (i.e. payment gateways). Think how Laravel uses managers for components you interact with (cache, queue, etc) where the code doesn’t change if you swap providers (i.e. from Redis to database). Try to strive for the same in your application where you’re relying on interfaces and managers rather than a specific provider.
  • If you have different “areas” in your application, then you can sub-namespace controllers (i.e. App\Http\Controllers\Admin).
  • For interactions with third-party services, I create a dedicated namespace in an app/Services directory (i.e. App\Services\Mux). I then treat this folder as a package, so it may have its own Artisan commands, Eloquent models, controllers, routes, etc with a service provider to register those resources.

It Just Works™ and scales, and your Artisan make:* commands still work without having to install horrible “glue” packages. And with the rise in AI-assisted development, sticking to the default directory structure will only help that given that’s what LLMs will be trained on.

martinbean's avatar

martinbean wrote a reply+100 XP

1w ago

what folder structure patterns have you found most effective ?

@shivamyadav I’ve worked on probably hundreds of Laravel projects over more than 10 years now, and at companies of all sizes (from SMEs to Fortune 500s). The projects that fell apart and became unmaintainable messes were the ones where developers decided to be “clever” and create their own folder structure, or do “modules”, “domains”, or whatever.

Seriously, stick to Laravel’s default directory structure:

  • Put interfaces in an app/Contracts directory, which follows the framework’s convention.
  • Use managers for things that can have multiple providers (i.e. payment gateways). Think how Laravel uses managers for components you interact with (cache, queue, etc) where the code doesn’t change if you swap providers (i.e. from Redis to database). Try to strive for the same in your application where you’re relying on interfaces and managers rather than a specific provider.
  • If you have different “areas” in your application, then you can sub-namespace controllers (i.e. App\Http\Controllers\Admin).
  • For interactions with third-party services, I create a dedicated namespace in an app/Services directory (i.e. App\Services\Mux). I then treat this folder as a package, so it may have its own Artisan commands, Eloquent models, controllers, routes, etc with a service provider to register those resources.

It Just Works™ and scales, and your Artisan make:* commands still work without having to install horrible “glue” packages. And with the rise in AI-assisted development, sticking to the default directory structure will only help that given that’s what LLMs will be trained on.

martinbean's avatar

martinbean wrote a reply+100 XP

1w ago

Football streaming

@gedirixin Thanks for signing up just to review and reply to a three year old thread…

martinbean's avatar

martinbean was awarded Best Answer+1000 XP

1w ago

How to obsfucate a Laravel application's code ?

@vincent15000 If you don’t want people to have your code, don’t give them it.

Any obfuscation can be easily defeated as PHP is an interpreted language. Any encrypted code needs to be decrypted before it can be ran, and obfuscated code is not going to hide anything of interest (such as API keys, database credentials, etc) if someone really wants to see them.

martinbean's avatar

martinbean wrote a reply+100 XP

1w ago

Plan subscription and Stripe

Are these plans differents products or the same product with different prices ?

@vincent15000 Only you can answer that.

  • Can I use swap and change plans? Then they should belong to the same product.
  • Do the different plans give access to different entitlements? That they should be separate products.
martinbean's avatar

martinbean was awarded Best Answer+1000 XP

1w ago

Use a policy with only the model id and avoiding N+1

Hmmm ... I wonder how I could use a policy with only a model id.

@vincent15000 That would be absolutely useless. If you call the gate using something like $this->can('update', 1); then how is Laravel supposed to know which model that 1 relates to? 🤷‍♂️

Stop over-thinking things and just use Laravel’s features as they’re documented.

martinbean's avatar

martinbean wrote a reply+100 XP

1w ago

Increment/Decrement on High Traffic

@eskiesirius You shouldn’t be using a single column to hold the balance. You should instead of some form of ledger table, where you write individual increments and decrements as their own rows, and then derive the balance from the sum of those increments and decrements. It’s not “expensive” if you have a proper index in place.

martinbean's avatar

martinbean was awarded Best Answer+1000 XP

2w ago

Prefix for session cookie

The application is served via HTTPS in production.

@vincent15000 So stop messing with the cookie prefix, and just set the appropriate configuration option: https://github.com/laravel/laravel/blob/a9fec26463bd62c220702c5d1e9f087c3ca67078/config/session.php#L161-L172

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

No bootstrap.js file anymore in fresh laravel installations ?

@vincent15000 It became redundant when Laravel removed Axios from the the default installation, given all bootstrap.js did was import Axios: https://github.com/laravel/laravel/blob/12.x/resources/js/bootstrap.js

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

Prefix for session cookie

The application is served via HTTPS in production.

@vincent15000 So stop messing with the cookie prefix, and just set the appropriate configuration option: https://github.com/laravel/laravel/blob/a9fec26463bd62c220702c5d1e9f087c3ca67078/config/session.php#L161-L172

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

Prefix for session cookie

@vincent15000 But Laravel cookies are already secure by being HTTP only, optionally HTTPS-only, restricted to path, restricted to domain, and with cross-site restrictions. So what, exactly, “enhanced security” were you trying to add here?

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

At what point do you stop patching CSS and just rebuild properly?

@muhammadali2003 This is why you don’t cut corners: “quick fixes” end up sticking around for much, much longer than intended, and the work to undo them becomes bigger than just doing things properly from the start.

I’ve not worked with WordPress for a few years now, but I’d start by extracting styles for components one-by-one into your theme.css file if you’re building an “old-style” theme. I can’t remember how styles work in block-based themes but again, just extract styles for one component at a time.

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

Best approach for handling large file uploads and ZIP generation in Laravel?

@lailaih You need to look into multi-part/chunked uploading for large uploads. This is where the file is sent in multiple chunks (and requests), and then re-assembled server-side. It then means any failing chunks can be re-tried if they fail, and the entire upload paused and resumed.

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

How to access a private folder (Storage app/private/documents) from another Laravel project

@adamnet It’s all going to depend on how the projects are hosted, and where the stored files actually live (i.e. on disk, or in some third party store like S3).

If the files are stored on disk, and both projects are hosted on the same server, then you could create a symbolic link so both applications can access the files. If the applications are stored on separate servers with separate file systems, then this obviously becomes much, much more difficult.

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

How to access a private folder (Storage app/private/documents) from another Laravel project

@imranbru Wasn’t calling you a bot; just that you were giving OP answers copied from an LLM so it was like OP was chatting with a bot. It’s clear from your comments which ones are written by you (inconsistent formatting and grammar) and which one’s have been sourced from an LLM (suddenly perfect formatting and grammar).

If OP wanted answers from an LLM then they could ask Lary, or something like ChatGPT, themselves instead of waiting for you to do and then copy-and-paste the response.

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

How to access a private folder (Storage app/private/documents) from another Laravel project

In project 1users will be able to only submit (post) pdf documents. […] In project 2 the administrators must be able to see all the pdf documents

@adamnet Why are these two different projects in the first place? They’re clearly the same project, just with users with different roles.

Also, @imranbru is just regurgitating an LLM response to you, so you’re essentially chatting with a bot.

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

Doomscrolling During AI Wait Times is Killing My Focus — Anyone Else?

@shaungbhone The irony of posting an AI-generated post to complain that you can’t focus when using AI…

martinbean's avatar

martinbean wrote a reply+100 XP

2w ago

Prefix for session cookie

@vincent15000 Why have you added that prefix?

martinbean's avatar

martinbean liked a comment+100 XP

3w ago

Larabox: The Local Dev Stack Manager that I built.

I develop on a Mac. Tag line:

Escape the complexity of Docker and WSL. Larabox provides isolated, pre-bundled native binaries for Nginx, PHP, MariaDB, Node.js and more optimized for Windows and live in seconds. 

Pre-bundled native binaries...who is compiling these on or for Windows, there already native binaries.

Docker isn't complex, neither is WSL.

I am a bit old school, if you use Nginx or Apache, you should know how to install and configure them.

More optimized for windows, as to 'less optimized'? How...

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

Deleting rows massively using DB facade

@imranbru You’ve pretty much just repeated my comment and examples, and added nothing extra? 🤷‍♂️

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

Deleting rows massively using DB facade

Is it possible instead of using the primary key $id to use another field which is not the primary key?

@adamnet Yes? Just specify it?

DB::delete('DELETE FROM users WHERE some_other_column = ?', [$value]);

Alternatively, you can still use the query builder:

DB::table('users')->where('some_other_column', '=', $value)->delete();
martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

Multipart limitations

@vincent15000 What do you mean by “works” and “doesn’t work”?

We have no idea what data you’re sending, to where, what you expect to see, nor what you’re actually seeing.

martinbean's avatar

martinbean was awarded Best Answer+1000 XP

3w ago

upgrading vsanilla php 5.4 to 8.x with laravel

@iamyannc Hey. I’ve done a lot of these type of re-factoring and re-platforming projects in the past. The way I’d approach it would be like this:

  • Get the application running on a newer version of PHP. So upgrade to 7, fix any usage of deprecated APIs and libraries, and then when possible upgrade to PHP 8 and do the same.
  • Once you’ve got the vanilla PHP application running on a modern version of PHP, create a new Laravel application and dump your legacy application’s file in the public directory.
    • Rename Laravel’s index.php file to something like laravel-index.php to avoid clashing with your legacy index.php file.
    • Tweak your .htaccess or nginx config to just load a file if it exists, or fall back to Laravel’s front controller.
  • You should now have a Laravel application, but with no requests actually being routed through it to start off with, and instead requests hitting your legacy application as before.
  • Slowly start re-factoring your legacy application to Laravel controllers, views, etc. Do this slowly, and one discreet part at a time. Trying to re-factor too much in one go just leads to lots of files being touched, none of them 100% converted, and the dreaded feeling of, “Urgh, I need to git reset this and start over.”
  • As you do the above, the number of files from the legacy application will decrease, and the number of Laravel files increase, until you’re left with nothing of the legacy application.

Happy for you to reach out if you have any questions. DM me on Twitter 𝕏 (https://x.com/martinbean) and I can share my email address.

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

simple qr code and laravel 12 (with starter kit), not possible?

@sbrillo Fortify already requires the bacon/bacon-qr-code package at version 3 (https://github.com/laravel/fortify/blob/fc66a38872a0e304748336d2975f37672c8fca9c/composer.json#L19). The package you’re trying to install wants version 1 of that package, which suggests the package you’re trying to install is massively outdated.

So given Fortify already adds bacon/bacon-qr-code to your Laravel application, just use it directly. You don’t need to install a package to generate QR codes when there’s literally already one installed.

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

upgrading vsanilla php 5.4 to 8.x with laravel

@iamyannc Hey. I’ve done a lot of these type of re-factoring and re-platforming projects in the past. The way I’d approach it would be like this:

  • Get the application running on a newer version of PHP. So upgrade to 7, fix any usage of deprecated APIs and libraries, and then when possible upgrade to PHP 8 and do the same.
  • Once you’ve got the vanilla PHP application running on a modern version of PHP, create a new Laravel application and dump your legacy application’s file in the public directory.
    • Rename Laravel’s index.php file to something like laravel-index.php to avoid clashing with your legacy index.php file.
    • Tweak your .htaccess or nginx config to just load a file if it exists, or fall back to Laravel’s front controller.
  • You should now have a Laravel application, but with no requests actually being routed through it to start off with, and instead requests hitting your legacy application as before.
  • Slowly start re-factoring your legacy application to Laravel controllers, views, etc. Do this slowly, and one discreet part at a time. Trying to re-factor too much in one go just leads to lots of files being touched, none of them 100% converted, and the dreaded feeling of, “Urgh, I need to git reset this and start over.”
  • As you do the above, the number of files from the legacy application will decrease, and the number of Laravel files increase, until you’re left with nothing of the legacy application.

Happy for you to reach out if you have any questions. DM me on Twitter 𝕏 (https://x.com/martinbean) and I can share my email address.

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

Reverting from PEST to PHPUnit

@randy_johnson Pest is based on PHPUnit. Just take a look at the tests directory in the laravel/laravel repository for the skeleton files you need to go back to using PHPUnit.

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

Multipart limitations

@vincent15000 What is your actual question?

martinbean's avatar

martinbean was awarded Best Answer+1000 XP

3w ago

What about creating a NativePHP channel ?

In this case what about having a Livewire channel ? It's also a third-party framework, no ?

@vincent15000 No. It’s first-party. Its website (https://livewire.laravel.com) is under the laravel.com domain.

Furthermore NativePHP is now entirely free.

So are a load of Spatie packages. But they don’t have channels.

martinbean's avatar

martinbean wrote a reply+100 XP

3w ago

php version does not satisfy that requirement composer laragon, How do i fix this

@jimothee You’ve said yourself that running php -v says your PHP version is 8.2, and Laravel is telling you that it requires a version of PHP that is 8.3 or above. Well when you run Artisan (a CLI tool) it’s going to use the CLI version of PHP, which is not PHP 8.3 or above.

martinbean's avatar

martinbean wrote a reply+100 XP

4w ago

Aptfile or Dockerfile

@onurzdgn I truthfully don’t use Digital Ocean or its app platform, but what do either of these have to do with create a backup using mysqldump?

Dockerfiles are for containerising a project; not running one-off commands like mysqldump. And I’ve never used an “Aptfile” whatever that is.

martinbean's avatar

martinbean wrote a reply+100 XP

4w ago

Pregunta!

@imranbru Thanks, ChatGPT.

martinbean's avatar

martinbean wrote a reply+100 XP

4w ago

Scheduler over UI

@maurits-leblo Why can’t the sysadmins just set up cron jobs proper in that case?

martinbean's avatar

martinbean wrote a reply+100 XP

4w ago

Slow page load in Inertia (Laravel) despite not having any data on DB yet (freshly deployed app), how to find the bottleneck?

@brunogritti Sounds like you’re trying to connect over the Internet (i.e. external IP address) rather than through some sort of internal IP address or socket, hence the latency.

martinbean's avatar

martinbean wrote a reply+100 XP

4w ago

Google api OAuth unauthorized issue?

@shivamyadav I see you didn’t take my advice (that I’m sure I mentioned a couple of times when you’ve posted about this Google Drive-related project) of moving your Google Client creation logic to a service provider, so that classes then using that client (controllers, etc) just need to type-hint it and it will be automatically built and resolved:

public function register(): void
{
    $this->app->singleton(Client::class, function (Application $app) {
        return new Client([
            'client_id' => $app['config']['services.google.client_id'],
            'client_secret' => $app['config']['services.google.client_secret'],
            'scopes' => 'https://www.googleapis.com/auth/drive',
            'redirect_uri' => $app['config']['services.google.redirect_uri'],
            'prompt' => 'consent',
            'access_type' => 'offline',
        ]);
    });
}

For refreshing access tokens, I have a scheduled task that fires daily to refresh any soon-to-expire access tokens. But again, I’m sure I’ve mentioned this before:

Schedule::command('access-token:refresh')->daily();

If you find you’re unable to refresh an access token (because it’s been revoked by the owner), then you can delete it, and send a notification to the owner telling them they need to re-connect their Google account.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

VueJs as separate Installation or use VueJs within Laravel

@shibu0708 What exactly is the problem? You can just install the Vue package, and built it with Vite in your Laravel project: https://laravel.com/docs/13.x/vite#vue

Why would you need a “separate installation”?

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

Developing on Linux

@max100 Just use Docker. I use it on macOS, but it’ll be even more streamlined on Linux.

All I need to do to get running with a project is clone it and run make. My Makefile then builds the containers (if needed), and runs the project. Vite also works just fine.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

Difference between Use Case, Action, and Application Service in DDD

@aymanmsh That’s because they pretty much are interchangeable. Those names just refer to a class that encapsulates business logic.

Use cases and actions tend to be individual classes that encapsulate a single process, whereas an application service tends to be a class that groups one or more methods related to a particular concept in a single class. So you might have a OrderService with methods for creating an order, updating an order, cancelling an order, etc.

The important thing is to choose one approach and stick to it. Your codebase should look like a single person has authored it, so that means not using multiple names and approaches for the same thing.

Also, my customary DDD gripe: DDD is more about working with people in a business to create software that accurately models that business and its processes. DDD is not carving your codebase up into modules that you then you then call “domains” instead.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

What about creating a NativePHP channel ?

In this case what about having a Livewire channel ? It's also a third-party framework, no ?

@vincent15000 No. It’s first-party. Its website (https://livewire.laravel.com) is under the laravel.com domain.

Furthermore NativePHP is now entirely free.

So are a load of Spatie packages. But they don’t have channels.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

What about creating a NativePHP channel ?

Don‘t really think it makes sense as NativePHP is a paid for and third-party. Otherwise every third party with a premium product would want their own dedicated channel.

This forum tends to be more about Laravel and its first-party ecosystem.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

Single users table with intermediate trainer-client relationship table in Laravel — good practice?

I’d personally add a separate timestamp column for recording “start” and “end” dates, just so users can set up training to start at a future date rather than the exact second a record just happens to be created in your database.

martinbean's avatar

martinbean liked a comment+100 XP

1mo ago

How does wasChanged work with related tables?

What will wasChanged() show for Product A? What about for Product B?

How about just try it out yourself? In tinker or some test artisan command.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

Bundled Alpinejs not working in Laravel Docker

@fireblade No one can assist without seeing the actual error, or the code where you try and include Alpine.

martinbean's avatar

martinbean wrote a reply+100 XP

1mo ago

Is there a way to use certificates for auth?

@lordzeus As @glukinho says, this is something that would be handled at the web server level, not in application code. The web server (Apache, nginx, etc) honours the request if the certificate is present, and rejects the request if the certificate is missing or invalid.