Black Friday: coupon FRIDAY24 for 40% off Yearly/Lifetime membership! Read more here
Courses

Design Patterns in Laravel 11

The word "service" is often used in the Laravel community, but is it a "design pattern"?

Yes and no.

It is a pattern in the sense that it's a typical approach to offload the logic from the Controller to "somewhere else", that "somewhere" being the Service class.

However, identically to the Action classes, Services are not a core Laravel function, so there's no php artisan make:service, and developers can name/structure them however they want.

I've seen two main use cases for Service classes:

Case 1. Something like UserService: A class with multiple methods around a certain Model or other subject (more "loose" pattern)

Case 2. Something like StripeService: A class that helps to work with external functionality or a 3rd party library that can be replaced with another library in the future (more "strict" pattern)

And let's see both in action.


"Loose" Services Example

A typical simple example is this:

app/Http/Controllers/UserController.php:

use App\Http\Requests\StoreUserRequest;
use App\Services\UserService;
 
class UserController extends Controller
{
public function store(StoreUserRequest $request, UserService $userService)
{
$userService->store($request->validated());
 
return redirect()->route('users.index');
}
 
// ...
}

Then, inside that UserService class, you have methods to store users, update users, and perform other operations related to the User model.

app/Services/UserService.php:

namespace App\Services;
 
class UserService {
 
public function store(array $userData): User
{
$user = User::create($userData);
 
$user->roles()->sync($userData['roles']);
 
// More actions with that user: let's say, 5+ more lines of code
// - Upload avatar
// - Email to the user
// - Notify admins about new user
// - Create some data for that user
// - and more...
 
return $user;
}
 
public function update(array $userData, User $user): User
{
$user->update($userData);
$user->roles()->sync($userData['roles']);
 
// Also, more actions with that user
}
}

Wait, How Does That "Magic" Type-Hinting Work?

So, you've seen this code...

This lesson is only for Premium Members.
Want to access all lessons of this course?

You also get:

  • 67 courses (1172 lessons, 43 h 18 min total)
  • Premium tutorials
  • Access to repositories
  • Private Discord