Implement CRUD with Laravel Service-Repository Pattern
Saf11000
Posted on May 25, 2020
Why Laravel Service and Repository Pattern?
Yes, indeed, there are many ways that laravel can interpret the CRUD functionality. But I personally suggest the service-repository design pattern because it’s clean and sustainable. The concept of repositories and services ensures that you write reusable code and helps to keep your controller as simple as possible making them more readable.
Repositories are usually a common wrapper for your model and the place where you would write different queries in your database. A service on the other hand is a layer for handling all your application’s logic. Based on experience, it’s really conducive to separate the logic and the wrapper of the model especially when you’re working on team or big projects.
To illustrate the repository and service, we’ll build a CRUD application.
I assume you already have laravel project installed in your local machine. If none, you may read my previous post on installing laravel project at https://dev.to/jsafe00/set-up-laravel-project-in-a-virtual-machine-with-laravel-homestead-3d4a.
For the purpose of this tutorial to emphasize the service-repository pattern, I’ll be illustrating the backend side only. You may use postman to execute.
You can download then install postman here: https://www.postman.com/downloads/
To get started, let’s set up Model, Controller and Migration by executing:
php artisan make:model Post -mcr
-m, --migration Create a new migration file for the model.
-c, --controller Create a new controller for the model.
-r, --resource Indicates if the generated controller should be a resource controller
Route
Model
Please ensure that our attributes are fillable. Update Post model like below.
Migration
Then, update the post migration like below then execute
php artisan migrate
Repository
Laravel does not have a repository command. You have to do it manually. Just create a Repositories folder then add PostRepository file and add the code below.
We call the Post model in the constructor of our class.
Service
Like repository, laravel doesn’t have a service command. Create a Services folder, add PostService file and add the code below.
We inject the PostRepository dependency into the constructor of our PostService class.
Now that we are done with the repository-service setup. Let’s proceed with creating our CRUD.
Create
PostController -> PostService -> PostRepository
https://dev-to-uploads.s3.amazonaws.com/i/7hry719tcwbt0l0zxs4p.png
$this->postService->savePostData($data) – this part calls the savePostData function in the post service.
In the post service, we validate the data. If there are no errors,
$this->postRepository->save($data); - we call the save function in the post repository to save the data in the database.
If there are errors, for example when we didn’t input a title, then this will be displayed when we execute in postman.
READ
GetAllData
https://dev-to-uploads.s3.amazonaws.com/i/zdpkcz7d7pl4kah4pvli.png
GetById
https://dev-to-uploads.s3.amazonaws.com/i/old8umw7apwjkvkwqb58.png
Update
https://dev-to-uploads.s3.amazonaws.com/i/uddzrcqmolhupsssrk3c.png
Delete
https://dev-to-uploads.s3.amazonaws.com/i/izq5dwwy2n3fy3mmy4zk.png
I hope by just looking at the screenshots you can already see the pattern then you can easily grasp as to why the laravel service-repository pattern is clean and sustainable. You can clone this CRUD sample at https://github.com/jsafe00/laravel-service-repository
I have created a tutorial with interface implementation on this pattern at https://josafebalili.vercel.app/laravel-service-repository-interface
Or you might check my CRUD implementation of repository pattern with Laravel 8 and Php 8 at https://github.com/jsafe00/her-running-medals-api
I've created a simple package for this. You might want to check it.
https://github.com/jsafe00/laravel-s-r-c
Everything has a pattern, you just need to notice it. This goes with the saying that everything has beauty, but not everyone sees it.
May we see beauty in everything. Beauty is in the eye of the grateful.
Posted on May 25, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.