成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

Laravel中怎么實現Repository設計模式

Laravel中怎么實現Repository設計模式

Laravel 9 保姆級視頻教程,想學不會都難!進入學習

在本文中,我會向你展示如何在 Laravel 中從頭開始實現 repository 設計模式。我將使用 Laravel 5.8.3 版,但 Laravel 版本不是最重要的。在開始寫代碼之前,你需要了解一些關于 repository 設計模式的相關信息。

Laravel中怎么實現Repository設計模式

repository 設計模式允許你使用對象,而不需要了解這些對象是如何持久化的。本質上,它是數據層的抽象。

這意味著你的業務邏輯不需要了解如何檢索數據或數據源是什么,業務邏輯依賴于 repository 來檢索正確的數據。

關于這個模式,我看到有人將它誤解為 repository 被用來創建或更新數據。 這不是 repository 應該做的,repository 不應該創建或更新數據,僅僅用于檢索數據。

理解透了吧?接下來一起寫代碼

既然我們從頭開始,那么我們先創建一個新的 Laravel 項目吧:

composer create-project --prefer-dist laravel/laravel repository
登錄后復制

對于本教程,我們將構建一個小型的博客應用。現在我們已經創建好了一個新的 Laravel 項目,接下來應該為它創建一個控制器和模型。

php artisan make:controller BlogController
登錄后復制

這將在 app/Http/Controllers 目錄中創建 BlogController

php artisan make:model Models/Blog -m
登錄后復制

提示:
-m 選項會創建一個對應的數據庫遷移,你可以在 *database/migrations
目錄中找到所生成的遷移。*

現在你應該能在 app/Models 目錄中找到剛生成的模型 Blog 了吧。這只是一種我喜歡的存放模型的方式。

現在我們有了控制器和模型,是時候看看我們創建的遷移文件了。除了默認的 Laravel 時間戳字段外,我們的博客只需要 標題、內容用戶ID 字段。

<?php  use IlluminateSupportFacadesSchema; use IlluminateDatabaseSchemaBlueprint; use IlluminateDatabaseMigrationsMigration;  class CreateBlogsTable extends Migration {     public function up()     {         Schema::create('blogs', function (Blueprint $table) {             $table->bigIncrements('id');             $table->string('title');             $table->text('content');             $table->integer('user_id');             $table->timestamps();              $table->foreign('user_id')                   ->references('id')                   ->on('users');         });     }      public function down()     {         Schema::dropIfExists('blogs');     } }
登錄后復制

提示:
如果你使用的是 Laravel 5.8 以下的舊版本,請將

$table->bigIncrements('id');
登錄后復制

替換為:

$table->increments('id');
登錄后復制

設置數據庫

我將使用 MySQL 數據庫作為示例,第一步就是創建一個新的數據庫。

mysql -u root -p  create database laravel_repository;
登錄后復制

以上命令將會創建一個叫 laravel_repository 的新數據庫。接下來我們需要添加數據庫信息到 Laravel 根目錄的 .env 文件中。

DB_DATABASE=laravel_repositoryDB_USERNAME=rootDB_PASSWORD=secret
登錄后復制

當你更新了 .env 文件后我們需要清空緩存:

php artisan config:clear
登錄后復制

登錄后復制

運行遷移

現在我們已經設置好了數據庫,可以開始運行遷移了:

php artisan migrate
登錄后復制

這將會創建 blogs 表,包含了我們在遷移中聲明的 title , contentuser_id 字段。

實現 repository 設計模式

一切就緒,我們現在可以開始實現 repository 設計風格了。我們將會在 app 目錄中創建 Repositories 目錄。我們將要創建的第二個目錄是 Interfaces 目錄,這個目錄位于 Repositories 目錄中。

Interfaces 文件中我們將創建一個包含兩個方法的 BlogRepositoryInterface 接口。

  • 返回所有博客文章的 all 方法

  • 返回特定用戶所有博客文章的 getByUser 方法

<?php  namespace AppRepositoriesInterfaces;  use AppUser;  interface BlogRepositoryInterface {     public function all();      public function getByUser(User $user); }
登錄后復制

我們需要創建的最后一個類是將要實現 BlogRepositoryInterfaceBlogRepository ,我們會寫一個最簡單的實現方式。

<?php  namespace AppRepositories;  use AppModelsBlog; use AppUser; use AppRepositoriesInterfacesBlogRepositoryInterface;  class BlogRepository implements BlogRepositoryInterface {     public function all()     {         return Blog::all();     }      public function getByUser(User $user)     {         return Blog::where('user_id',$user->id)->get();     } }
登錄后復制

你的 Repositories 目錄應該像這樣:

app/└── Repositories/     ├── BlogRepository.php     └── Interfaces/         └── BlogRepositoryInterface.php
登錄后復制

你現在已經成功創建了一個 repository 了。但是我們還沒有完成,是時候開始使用我們的 repository 了。

在控制器中使用 Repository

要開始使用 BlogRepository ,我們首先需要將其注入到 BlogController 。由于 Laravel 的依賴注入,我們很容易用另一個來替換它。這就是我們控制器的樣子:

<?php  namespace AppHttpControllers;   use AppRepositoriesInterfacesBlogRepositoryInterface; use AppUser;  class BlogController extends Controller {     private $blogRepository;      public function __construct(BlogRepositoryInterface $blogRepository)     {         $this->blogRepository = $blogRepository;     }      public function index()     {         $blogs = $this->blogRepository->all();          return view('blog')->withBlogs($blogs);     }      public function detail($id)     {         $user = User::find($id);         $blogs = $this->blogRepository->getByUser($user);          return view('blog')->withBlogs($blogs);     } }
登錄后復制

如你所見,控制器中的代碼很簡短,可讀性非常的高。不需要十行代碼就可以獲取到所需的數據,多虧了 repository ,所有這些邏輯都可以在一行代碼中完成。這對單元測試也很好,因為 repository 的方法很容易復用。

repository 設計模式也使更改數據源變得更加容易。在這個例子中,我們使用 MySQL 數據庫來檢索我們的博客內容。我們使用 Eloquent 來完成查詢數據庫操作。但是假設我們在某個網站上看到了一個很棒的博客 API,我們想使用這個 API 作為數據源,我們所要做的就是重寫 BlogRepository 來調用這個 API 替換 Eloquent

RepositoryServiceProvider

我們將注入 BlogController 中的 BlogRepository ,而不是注入 BlogController 中的 BlogRepositoryInterface ,然后讓服務容器決定將使用哪個存儲庫。這將在 AppServiceProviderboot 方法中實現,但我更喜歡為此創建一個新的 provider 來保持整潔。

php artisan make:provider RepositoryServiceProvider
登錄后復制

我們為此創建一個新的 provider 的原因是,當您的項目開始發展為大型項目時,結構會變得非常凌亂。設想一下,一個擁有 10 個以上模型的項目,每個模型都有自己的 repository ,你的 AppServiceProvider 可讀性將會大大降低。

我們的 RepositoryServiceProvider 會像下面這樣:

<?php  namespace AppProviders;  use AppRepositoriesBlogRepository; use AppRepositoriesInterfacesBlogRepositoryInterface; use IlluminateSupportServiceProvider;  class RepositoryServiceProvider extends ServiceProvider {     public function register()     {         $this->app->bind(             BlogRepositoryInterface::class,              BlogRepository::class         );     } }
登錄后復制

留意用另一個 repository 替代 BlogRepository 是多么容易!

不要忘記添加 RepositoryServiceProviderconfig/app.php 文件的 providers 列表中。完成了這些后我們需要清空緩存:

'providers' => [   AppProvidersRepositoryServiceProvider::class ],
登錄后復制

php artisan config:clear
登錄后復制

登錄后復制

就是這樣

現在你已經成功實現了 repository 設計模式,不是很難吧?

你可以選擇增加一些路由和視圖來拓展代碼,但本文將在這里結束,因為本文主要是介紹 repository 設計模式的。

如果你喜歡這篇文章,或者它幫助你實現了 repository 設計模式,請確保你也查看了我的其他文章。如果你有任何反饋、疑問,或希望我撰寫另一個有關 Laravel 的主題,請隨時發表評論。

原文地址:https://itnext.io/repository-design-pattern-done-right-in-laravel-d177b5fa75d4

譯文地址:https://learnku.com/laravel/t/31798

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
少妇无码AV无码一区| 忘忧草在线播放WWW网| 色偷偷WWW8888| 无码人妻侵犯一区侵犯| 亚洲VA中文慕无码久久AV| 亚洲亚洲人成综合网络| 2019日韩中文字幕MV| www.性xxxxx| 国产95在线 | 亚洲| 国农村精品国产自线拍| 久久久久亚洲AV成人网| 欧美性猛交ⅩXXX乱大交| 色婷婷综合久久久久中文一区二区| 无码不卡AV东京热毛片| 亚洲人成人一区二区三区| 97久久国产亚洲精品超碰热| 东京热无码人妻精品一区二区三区| 国产未成女一区二区三区| 久久久久久精品无码 | 丰满岳乱妇在线观看中字| 国产内射合集颜射| 久久久无码精品亚洲日韩精东传媒| 欧美性狂猛BBBBBBXXXX| 午夜人妻久久久久久久久| 亚洲中文字幕AⅤ无码天堂| 9久9久女女免费视频精品| 国产成人午夜在线视频A站| 久精品国产欧美亚洲色AⅤ大片| 欧美极度残忍另类| 天天做天天爱夜夜爽毛片| 亚洲色WWW永久网站| JIJZZIZZ老师出水喷水多| 国产麻豆剧传媒精品国产AV| 乱码中字在线观看一二区| 少妇被 到高潮喷出白浆av| 亚洲精品又粗又大又爽A片| CHINESE FREE 高清| 国产日韩一区二区三区在线观看| 乱人伦XXXX国语对白| 色哟哟免费精品网站入口| 亚洲裸男GAY自慰网站| 办公室被公司领导C了很多次| 国模小黎大尺度精品(02)[| 农村妇女野战BBXXX农村妇女| 我的妈妈和黑人群交小说| 中国少妇BBWBBW| 国产精品对白刺激久久久| 乱码中字在线观看一二区| 无码A级毛片免费视频内谢5J| 中文字幕VA一区二区三区| 国产精品久久一国产精品胖虎| 麻花传媒剧国产MV在线看| 忘忧草在线影院WWW动漫图片| 主人给我戴上奶牛榨乳器调教| 国产精品-区区久久久狼| 母与子之间的阴阳调和| 性妇VODAFONEWIFI精| BGMBGMBGM欧美XX| 精品国精品国产自在久国产应用| 日本高清视频WWW| 一本色道久久综合一| 国产精品乱子伦XXXX| 欧美精品做受XXX性少妇| 亚洲成AV人最新无码| 大象一区一品精区搬运机器 | 国产偷国产偷精品高清尤物| 欧美在线一区二区三区| 亚洲日韩国产精品第一页一区 | 麻豆国产蜜桃臀视频在线观看| 无码精品人妻一区二区三区aV| A级毛片免费网站| 久久99精品久久久久久久不卡| 牲欲强的熟妇农村老妇女视频| 18禁无遮挡羞羞啪啪免费网站| 狠狠躁夜夜躁人人爽天天不卡软件| 色播久久人人爽人人爽人人片AV| 中文精品久久久久国产网址| 果冻传媒免费观看4399飘雪| 色欲香天天综合网站| 999精品国产人妻无码系列| 精品国产性色无码AV网站| 婷婷丁香五月深爱憿情网| JAPONENSISFES中国| 久久无码专区国产精品| 亚洲 中文 欧美 日韩 在线| 动漫AV纯肉无码AV在线播放| 女人高潮娇喘抽搐喷水动态视频 | 丰满少妇高潮惨叫久久久| 欧美成人午夜视频| 伊人久久大香线焦AV综合影院| 韩国AV一区二区| 我和公发生了性关系公| 波多野结衣一区二区三区高清 | 亚洲无线码高清在线观看| 国产精品无码久久综合网| 色婷婷综合久久久久中文| 白嫩光屁股BBBBBBBBB| 免费专区SM美脚践踏调教视频| 亚洲综合色区在线观看| 护士的色诱2在线观看免费| 无码精品国产VA在线观看DVD| 成熟人妻换╳╳╳╳Ⅹ| 强行糟蹋人妻HD中文字幕| 最新中文字幕AV专区| 老熟妇高潮一区二区高清视频| 亚洲欧美日韩成人综合网 | 高清拍拍拍无挡国产精品| 日本XXXX18裸体XXXX| IGAO在线视频成人免费| 欧美成人午夜视频| √天堂资源中文WWW| 美女扒开腿让男人桶爽直播| 一区二区三区四区黄色网站| 久久久久精品国产99久久综合| 亚洲精品无码AV中文字幕| 狠狠澡人人添人人爽人妻少妇| 性一交一乱一伦一在线小视频| 国产精品麻豆欧美日韩WW | 日本免费一区二区三区| おまえの母亲をだます怎么读| 欧美人与动牲交A免费观看| 99国产精品久久99久久久| 男人J桶进女人P无遮挡在线观看 | 男女啪啪永久免费网站| 中文字幕乱偷无码AV先锋| 免费无遮挡禁18污污网站| 51无码人妻精品1国产| 年轻的少妇A级伦理| 99久久无码一区人妻| 青草久久久国产线免费| 成人A级毛片免费视频| 色噜噜精品一区二区三区| 丰满少妇BBWBBW| 婷婷五月深深久久精品| 国产精品无码A∨果冻传媒| 西西大胆无码视频免费| 荷兰肥妇BBWBBWBBW| 亚洲人成人无码WWW影院| 老师你的兔子好软水好多小时| 中文字幕一区二区人妻5566| 欧美丰满少妇内射XXXX免费| 阿姨呀咿呀啊咿呀咿呀| 色88久久久久高潮综合影院| 国产AV无码专区亚洲AVJUL| 无遮挡粉嫩小泬久久久久久久动漫| 国产亚洲美女精品久久久久| 亚洲国产一区二区三区波多野结衣| 久久精品国产精品久久久| 在线观看无码H片| 欧美日韩人妻精品一区二区在线| 成人麻豆精品激情视频在线观看| 天天想你在线视频免费观看高清版| 国产免费一区二区三区在线观看| 亚洲国产欧美在线人成长黄瓜| 久久久99精品免费观看| 23部禽女乱小说内| 日韩免费A级毛片无码A∨| 国产狂喷水潮免费网站WWW| 亚洲精品无码成人片在线观看| 麻豆蜜桃AV蜜臀AV色欲AV| JAPANESE VISA教师| 熟妇熟女乱妇乱女网站| 和人妻隔着帘子按摩中字| 用嘴巴吃鸡的好处| 人妻少妇无码中文幕久久| 国产精品国产三级欧美二区| 亚洲精品无码乱码成人| 嫩草影院网站进入| 夫妻毛片盗摄国产内射| 亚洲不卡无码永久在线| 美女用香蕉练口活视频| 成人免费体验区120秒| 亚洲AⅤ无码乱码在线观看性色 | 精品日本久久久久久人妻日本| 中文字幕一区二区人妻5566| 色噜噜狠狠色综合无码AV天堂| 国产在线无码视频一区二区三区 | 乱肉怀孕又粗又大| 成年丰满熟妇午夜免费视频| 亚洲Av无码一区二区三区大黄瓜 | 欧美肉欲XXⅩOOO性| 国产精品久久久久精品三级卜| 亚洲中文字幕日本无线码| 人妻激情偷乱一区二区三区AV| 国产毛片一区二区精品| 中文乱码精品一区二区三区人妻| 日日摸夜夜添夜夜添视频| 护士猛少妇色ⅩXXXX猛叫| ⅩXXⅩ互换人妻四人互换| 无码日韩精品一区二区免费暖暖| 久久人人妻人人妻人人澡av| 成人午夜福利电影天堂 | 被老外添嫩苞添高潮NP电影| 亚洲AV第一成肉网肉片AV| 女人张开腿让男人添| 国产精品丝袜黑色高跟鞋| 制服 丝袜 人妻 专区一本| 挺进邻居人妻雪白的身体韩国电影 | 妺妺窝人体色WWW网| 国产伦精品一区二区三区免.费|