首页 > 其他分享 >Laravel Repository 仓库模式【转】

Laravel Repository 仓库模式【转】

时间:2023-10-12 18:22:49浏览次数:42  
标签:Laravel Repository created 仓库 app successfully Controller php

详细:

1. Repository 模式作用和实现原理;
理论
MVC 分层缺点
MVC 作为一种传统的分层模型已经服务过很多 WEB 应用,非常成熟。Controller 需要直接调用对应的 Model 来完成数据交互,这样不可避免的造成了强耦合,也造成了 Controller 和 Model 的臃肿
一般控制器每个方法的代码不会超过 20 行,而且最好不直接引用 Model 的实例。而 Model 的功能应该是非常单一的,应该是单纯定义与数据库有关的业务关系,而不是大量书写逻辑业务代码,保持它们的纯粹对于项目来说是非常重要的。
Repository 模式
如果以 MVC 的模式实现,就是 Controller 与 Model 之间的直接交互,这样强耦合是不可避免的。
以公司的部门来举例,可以不让 Controller 部门直接与 Model 部门打交道,而是成立一个新的中间部门来统一调配,这个部门就是 Repository。也就是说,Controller 和 Model 不用纠结代码应该写在哪里,它们都不用做这个事情,让 Repository 来专职做这件事情。M 和 C 只要做好各自的基本业务就行了。Controller 就负责请求的逻辑调用,Model 只负责数据库的交互。
Repository 擅长根据请求来决定如何调用数据,而且只做这件事情。

Laravel 框架中 Repository 模式的实现原理
接口绑定
依赖注入
代码实例
新建 app/Repositories/StudentRepository.php

<?php

namespace App\Repositories;

interface StudentRepository{

    public function findAll();

    public function delete($sid);

}

 


新建 app/Repositories/StudentRepositoryEntity.php,实现一个实体类
<?php

namespace App\Repositories;
use App\Student;

class StudentRepositoryEntity implements StudentRepository{

    public function findAll(){
        return Student::all();
    }

    public function delete($sid){
        $student = Student::find($sid);
        return $student->delete();
    }
}

 


修改 app/Providers/AppServiceProvider.php
可以自定义一个服务提供者(provider),也可以在已有的服务提供者(provider)里, 将实体类和 interface 类绑定即可
注意:如果是自定义的provider,需要将 provider 类放到 config/app.php 配置文件中的 providers 选项中。
<?php

// use App\Repositories\StudentRepository;
// use App\Repositories\StudentRepositoryEntity;

/**
* Register any application services.
 *
 * @return void
 */
public function register()
{
    //$this->app->bind(StudentRepository::class, StudentRepositoryEntity::class);
    $this->app->bind('App\Repositories\StudentRepository', 'App\Repositories\StudentRepositoryEntity');
}

 


修改 routes/web.php,新建路由,依赖注入
Route::any('repository', function (\App\Repositories\StudentRepository $studentRepository){
    dd($studentRepository->findAll()); 
});

访问 http://192.168.1.214:2000/repository,返回数据,成功
2. Laravel Repository 扩展包的配置和使用;
访问网址:https://github.com/andersao/l5-repository

 

 



# 进入项目目录
cd /data/project/test/laravel1

# 安装 l5-repository
composer require prettus/l5-repository

# 安装 fractal
composer require league/fractal

# 安装完成后配置

 


修改 config/app.php:
/*
 * Package Service Providers...
 */
// Repository
\Prettus\Repository\Providers\RepositoryServiceProvider::class,

 



控制台生成配置文件
php artisan vendor:publish

修改新生成的配置文件 config/repository.php:
// 约定了一些目录结构
// models 的目录改成 Models(个人喜好)
/*
|--------------------------------------------------------------------------
 | Generator Config
 |--------------------------------------------------------------------------
 |
 */
 'generator'  => [
     'basePath'      => app()->path(),
     'rootNamespace' => 'App\\',
     'stubsOverridePath' => app()->path(),
     'paths'         => [
         'models'       => 'Models',
         'repositories' => 'Repositories',
         'interfaces'   => 'Repositories',
         'transformers' => 'Transformers',
         'presenters'   => 'Presenters',
         'validators'   => 'Validators',
         'controllers'  => 'Http/Controllers',
         'provider'     => 'RepositoryServiceProvider',
         'criteria'     => 'Criteria'
     ]
 ]

 


控制台操作
php artisan make:entity User

# 会出现一系列的提问,全部设置 y
Would you like to create a Presenter? [y|N] (yes/no) [no]:
 > y

App\Transformers\UserTransformerPresenter created successfully.

 Would you like to create a Transformer? [y|N] (yes/no) [no]:
 > y

Transformer created successfully.

 Would you like to create a Validator? [y|N] (yes/no) [no]:
 > y

Validator created successfully.

 Would you like to create a Controller? [y|N] (yes/no) [no]:
 > y

Request created successfully.
Request created successfully.
Controller created successfully.
Repository created successfully.
Provider created successfully.
Bindings created successfully.

# 新生成了如下图的目录和文件
# 在 app/Http/Controllers/ 生成了一个 UsersController.php
# 里面的代码是一个典型的 RESTful 风格
# 已经把基本的代码结构都生成好了

# 在 app/Http/Providers/ 生成了一个 RepositoryServiceProvider.php
# boot() 方法自动绑定了接口的实例

# 在 config/app.php 中,在 Application Service Providers... 添加一下内容
App\Providers\RepositoryServiceProvider::class,

# 总结:Laravel5 的 Repository 框架可以自动生成一个 RepositoryServiceProvider
# 然后自动去绑定一些接口和实体类
# 这样就可以很方便的去搭建一个 Repository 模式

 



新生成的目录和文件

 

来源:http://www.shanhubei.com/archives/2785.html

标签:Laravel,Repository,created,仓库,app,successfully,Controller,php
From: https://www.cnblogs.com/shanhubei/p/17760241.html

相关文章

  • gitlab、线上合并分支、远程仓库回滚、git工作流,git pull和git fetch,变基、pycharm操
    gitlab使用1、创建账号---》管理员审核2、登录进去---》就能看到项目--(项目管理员把你添加成开发者了)3、把代码clone下来,使用pycharm打开4、写代码,本地提交问题:普通开发者,提交到master分支是不行的创建一个dev分支---》提交到dev分支后期由管理员做分支合并--......
  • DOCKER本地仓库
     概述随着docker的应用越来越多,安装部署越来越方便,批量自动化的镜像生成和发布都需要docker仓库的本地化应用。试用了docker的本地仓库功能,简单易上手,记录下来以备后用。环境centos:CentOS release7.0(Final)或以上版本Dockerversion24.0.6,builded223bc下载regis......
  • 如何将一个空目录添加到Git仓库?
    内容来自DOChttps://q.houxu6.top/?s=如何将一个空目录添加到Git仓库?如何在Git仓库中添加一个空目录(不包含任何文件)?另一种让目录(在仓库中)保持(几乎)空的方法是在该目录中创建一个.gitignore文件,其中包含以下四行:#忽略此目录中的所有内容*#除了这个文件!.gitignore这......
  • git多分支、git远程仓库、ssh方式连接远程仓库、协同开发、冲突解决
    git多分支 ##命令操作分支-1创建分支gitbranchdev-2查看分支gitbranch-3分支合并(可能经常用)gitmergedev#需要在master分支上,合并dev-4删除分支gitbranch-d分支名#不能在当前分支上,删除当前分支......
  • git多分支,git远程仓库, ssh方式连接远程仓库,协同开发,冲突解决
    1git多分支......
  • 使用Verdaccio搭建私有npm仓库
    来源:https://blog.csdn.net/fuhanghang/article/details/133063466搭建团队的私有仓库,保证团队组件的安全维护和私密性,是进阶前端开发主管路上,必不可少的一项技能。一、原理我们平时使用npmpublish进行发布时,上传的仓库默认地址是npm,通过Verdaccio(灰绿)工具在本地新建一个仓库......
  • 将本地仓库分支重置为与远程仓库HEAD一样
    内容来自DOChttps://q.houxu6.top/?s=将本地仓库分支重置为与远程仓库HEAD一样如何将本地分支重置为与远程仓库上的分支一样?我尝试了:gitreset--hardHEAD但是gitstatus声称我已经修改了文件:OnbranchmasterChangestobecommitted:(use"gitresetHEAD<file......
  • 如何解决Git仓库中的合并冲突?
    内容来自DOChttps://q.houxu6.top/?s=如何解决Git仓库中的合并冲突?如何解决我的Git仓库中的合并冲突?试试:gitmergetool它会打开一个GUI,逐步引导你解决每个冲突,并让你选择如何合并。有时候需要手动编辑一下,但通常它自己就够了。当然,它肯定比手工操作要好得多。根据Jos......
  • 私服maven仓库,无法获取到快照版本的jar包 问题处理
    场景1.确认目标包存在与私服仓库中。2.切maven的settings.xml设置无问题,仓库地址,以及快照属性,都是打开的。 解决方式: 在项目pom文件中,重新指定仓库地址以及启用snapshots属性。 <repositories><repository><!--ID必填--><id>......
  • 一个项目下有两个模块,被git识别为两个项目,需要分别推送不同仓库
    用IDEA创建git仓库写代码时,在新建SpringBoot模块后出现如下情况 解决方法:找到项目目录,在对应模块的隐藏文件夹中找到.git文件并删除删除后重新使用IDEA打开项目文件,IDEA会提示 点击配置后将目录映射中的serve移除该情况解决参考解决方案:https://blog.......