The following tutorial column will introduce to you how to use Repository Pattern (warehouse mode) in laravel. I hope it will be helpful to friends in need!##Article text
The main idea of the Repository model is to build on a data operation proxy layer, which separates the data operations in the controller. The benefits of doing this are as follows:1 Separating the data processing logic makes the code easier to maintain
2 Separating the data processing logic and business logic, you can test the two codes separately 3 Reduce code duplication 4 Reduce the probability of code errors 5 Greatly improve the readability of the controller codeAs shown in the picture Show the hierarchical relationship of Repository
However, if you want to have an independent operation layer, it will add a lot of code, which is very cumbersome. If you have a small project, you may not need to use this mode. But if it is a complex and large-scale project lasting more than 4-5 years, the benefits of this model are more obvious.
The significance of learning Repository Pattern is not only to use it, but also to make you think deeply about the layered thinking of the framework. You will not only start to pay attention to how to use a framework, but also want to know how to design a framework. Maybe you will become Your entrance to advanced programming. When you realize what a thought is. . .
Repository Pattern
public function index(){ $posts = Post::whereIn('category_id',[1,2]) ->where('is_draft',0) ->orderBy('created_at', 'desc') ->take(5) ->get(); return view('front.index',compact('posts'));}
Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)->get();
Post
data model; The second one iswhereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')-> take(5), data operation conditions;
get()method of data acquisition;
Eloquent# There is aQuery Scope
in ##, which can be used to simplify the second part, which is the query condition. So, after using
, we can simplify it to:
At first glance, it doesn’t seem to be very streamlined, but in fact you have achieved code decoupling and After reuse, for examplePost::ofCategory([1,2])->isDraft()->orderBy('created_at', 'desc')->take(5)->get();
isDraft()
, this code can be used everywhere without worrying about coupling issues.The degree of simplification is related to the degree of abstraction of your logic. For example, you can write:
Post::findPosts([1,2],0,'desc',5)->get();
In light projects, it is highly recommended to useQuery Scope
. This is a good programming habits.
In more complex projects,
Query Scopeis not enough because it is still strongly coupled with the data model.Repository Pattern
is to make the first , the second and third parts are all decoupled;
Speaking of decoupling, we have mentioned inLaravel
’s document guide that the first artifact is the interface in PHP (Interface
)
Let’s look at the example
The first step is to create a folder
app Repositories Interfaces Implements
Create a new file in the above
Interfacesdirectory
PostInterface.php:
namespace App\Repositories\Interfaces;Interface PostInterface{ public function findPosts(Array $cat_id,$is_draft,$order,$take) { }}
The third step is to create an implementation corresponding to the interfaceCreate a new file in the above
Implements
directory
:
namespace App\Repositories\Implements;use Post;class PostRepository Implements PostInterface{ public function findPosts(Array $cat_id,$is_draft,$order,$take){ $query = Post::whereIn('category_id',$cat_id) ->where('is_draft',$is_draft) ->orderBy('created_at', $order) ->take($take) ->get(); return $query; }}
Obviously, the warehouse refers to the implementation of a warehouse interface; define your business logic here;The fourth step is to bind the interface in the ServiceProvider
Open
, add code in
register():
app->bind('App\Repositories\Interfaces\PostInterface', 'App\Repositories\Implements\PostRepository'); }}
We know that ServiceProvider is where the Laravel IOC container implements dynamic interface change, so we bind it here, so that we When using it, do not use the interface implementation directly, but use the ioc container to parse the interface, which will automatically find the corresponding implementation for you. This means that if you need to change the implementation in the future, you can change it here;The fifth step is to use the warehouse
Return to our controller
use App\Repositories\Interfaces\PostInterface;class PostController extends BaseController{ public function __construct(PostInterface $post){ $this->postRepo = $post; } public function index(){ $this->postRepo->findPosts([1,2],0,'desc',5); }}
从上面的例子看,我们的业务逻辑变得非常精简,完全不用管查询;而且也现实了数据查询部分的解耦。
The above is the detailed content of Using Repository Pattern in laravel (warehouse mode). For more information, please follow other related articles on the PHP Chinese website!