文档章节

为什么你应该使用 Repository

李文凯
 李文凯
发布于 2017/06/15 09:12
字数 980
阅读 7
收藏 1

Repository 模式

为了保持代码的整洁性和可读性,使用Repository Pattern 是非常有用的。事实上,我们也不必仅仅为了使用这个特别的设计模式去使用Laravel,然而在下面的场景下,我们将使用OOP的框架Laravel 去展示如何使用repositories 使我们的Controller层不再那么啰嗦、更加解耦和易读。下面让我们更深入的研究一下。

不使用 repositories

其实使用Repositories并不是必要的,在你的应用中你完全可以不使用这个设计模式的前提下完成绝大多数的事情,然而随着时间的推移你可能把自己陷入一个死角,比如不选择使用Repositories会使你的应用测试很不容易,具体的实现将会变的很复杂,下面我们看一个例子。 HousesController.php

`<?php
class HousesController extends BaseController {
public function index()
{
$houses = House::all();
return View::make(‘houses.index’,compact(‘houses’));
}

 
  1. public function create()
  2. {
  3. return View::make('houses.create');
  4. }
  5. public function show($id)
  6. {
  7. $house = House::find($id);
  8. return View::make('houses.show',compact('house'));
  9. }

}`
这是一个很典型的一段代码使用Eloquent和数据库交互,这段代码工作的很正常,但是controller层对于Eloquent而言将是紧耦合的。在此我们可以注入一个repository创建一个解耦类型的代码版本,这个解耦的版本代码可以使后续程序的具体实现更加简单。

使用 repositories 其实完成整个repository模式需要相当多的步骤,但是一旦你完成几次就会自然而然变成了一种习惯了,下面我们将详细介绍每一步。

1. 创建 Repository 文件夹

首先我们需要在app文件夹创建自己Repository文件夹repositories,然后文件夹的每一个文件都要设置相应的命名空间。

2: 创建相应的 Interface类

第二步创建对应的接口,其决定着我们的repository类必须要实现的相关方法,如下例所示,在此再次强调的是命名空间一定要记得加上。 HouseRepositoryInterface.php

 
  1. <?php namespace App\Repositories;
  2.  
  3. interface HouseRepositoryInterface {
  4. public function selectAll();
  5.  
  6. public function find($id);
  7. }

3: 创建对应的 Repository类

现在我们可以创建我们repository类 来给我们干活了,在这个类文件中我们可以把我们的绝大多数的数据库查询都放进去,不论多么复杂。如下面的例子 DbHouseRepository.php

 
  1. <?php namespace App\Repositories;
  2.  
  3. use House;
  4.  
  5. class DbHouseRepository implements HouseRepositoryInterface {
  6.  
  7. public function selectAll()
  8. {
  9. return House::all();
  10. }
  11.  
  12. public function find($id)
  13. {
  14. return House::find($id);
  15. }
  16. }

4: 创建后端服务提供

首先你需要理解所谓服务提供,请参考手册服务提供者 BackendServiceProvider.php

<?php namespace App\Repositories;

 
  1. use IlluminateSupportSeriveProvider;
  2.  
  3. class BackSerivePrivider extends ServiceProvider {
  4.  
  5. public function register()
  6. {
  7. $this->app->bind('App\Repositories\HouseRepositoryInterface', 'App\Repositories\DbHouseRepository');
  8. }
  9. }

当然你也可以新建一个文件夹主要放我们的provider相关文件。 上面一段代码主要说的是,当你在controller层使用类型提示HouseRepositoryInterface, 我们知道你将会使用DbHouseRepository.

5: 更新你的Providers Array

其实在上面的代码中,我们已经实现了一个依赖注入,但如果我们要使用在此我们是需要手动去写的,为了更为方面,我们需要增加这个providers到 app/config/app.php 中的 providers数组里面, 只需要在最后加上App\Repositories\BackendServiceProvider::class,

6:最后使用依赖注入更新你的controller

当我们完成上面的那些内容之后,我们在Controller只需要简单的调用方法代替之前的复杂的数据库调用,如下面内容: HousesController.php

 
  1. <?php
  2.  
  3. use App\repositories\HouseRepositoryInterface;
  4.  
  5. class HousesController extends BaseController {
  6.  
  7. public function __construct(HouseRepositoryInterface $house)
  8. {
  9. $this->house = $house;
  10. }
  11.  
  12. public function index()
  13. {
  14. $houses = $this->house->selectAll();
  15.  
  16. return View::make('houses.index', compact('houses'));
  17.  
  18. }
  19.  
  20. public function create()
  21. {
  22. return View::make('houses.create');
  23. }
  24.  
  25. public function show($id)
  26. {
  27. $house = $this->house->find($id);
  28.  
  29. return View::make('houses.show', compact('house'));
  30.  
  31. }
  32. }

如果你觉得眼前需要更好的提高你可以来千锋学PHP,国内最好的PHP机构。

© 著作权归作者所有

李文凯
粉丝 2
博文 26
码字总数 30244
作品 0
东城
私信 提问
使用Kotlin进行Android开发-第一部分

要想找到一个项目覆盖android开发中的新技术真的是太难了,所以我决定自己写一个,在这篇文章中就会涵盖以下内容: Android Studio 3,beta 1 Kotlin language Build Variants ConstraintLay...

尺锤
2017/09/28
0
0
Android SDK 安装过程及安装失败的处理方法

Android SDK Installed Packages   1.1)解压Android SKD   1.2)执行如上目录下的文件:SDK Setup.exe,(机器人图标的那个)   注意:一般的话会出现 Failed to fetch URL https://dl-s...

孟祥天
2012/04/06
354
0
Spring 中的注解与分层思想

在Spring框架中最常见的几个注解 @Controller, @Service, @Component, @Repository 其中@Component是一种通用名称,泛指任意可以通过Spring来管理的组件,@Controller, @Service, @Repositor...

java知识分子
2018/09/28
9
0
【redis】5.spring boot项目中,直接在spring data jpa的Repository层使用redis +redis注解@Cacheable直接在Repository层使用,报错问题处理Null key returned for cache operation

spring boot整合redis:http://www.cnblogs.com/sxdcgaq8080/p/8028970.html 首先,明确一下问题的场景 之前在spring boot整合redis,关于redis的使用都是在repository层上再封装一层service...

angel挤一挤
2017/12/26
0
0
为android项目集成maven

为什么要为android项目增加maven集成功能呢?这里我想到几个主要理由: 部署测试人员和开发人员的角色分离,让他们摆脱eclipse开发环境设置android sdk环境,直接在服务器上运行一个命令,然...

华宰
2011/09/07
3.5K
2

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
12
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部