← Back to Course

Repository Pattern and Service Layer Architecture

As a Laravel application grows, putting all logic directly in controllers or models becomes hard to maintain and test. The repository pattern and service layer offer a cleaner separation of responsibilities.

The Repository Pattern

A repository wraps data access behind an interface, so the rest of the application doesn't need to know whether data comes from Eloquent, an API, or somewhere else.

interface PostRepositoryInterface
{
    public function find(int $id): ?Post;
    public function all(): Collection;
}

class EloquentPostRepository implements PostRepositoryInterface
{
    public function find(int $id): ?Post
    {
        return Post::find($id);
    }

    public function all(): Collection
    {
        return Post::all();
    }
}

The Service Layer

A service class holds business logic that doesn't belong in a controller or model — coordinating multiple repositories, sending notifications, applying business rules.

class PostService
{
    public function __construct(private PostRepositoryInterface $posts) {}

    public function publish(int $id): Post
    {
        $post = $this->posts->find($id);
        $post->update(['published_at' => now()]);
        return $post;
    }
}

Is It Always Worth It?

For small applications, this extra layering can be overkill. It tends to pay off most in larger codebases with complex business rules, multiple data sources, or a strong need for test isolation.

With architecture patterns covered, the course now moves toward getting a Laravel application ready to actually ship.

Ready to master Laravel Training Course?

Join Uncodemy's hands-on Laravel program and build real, production-ready applications.

Explore Course