gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

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

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號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
天天操狠狠操夜夜操| 三级4级全黄60分钟| 欧美成人三级在线播放| 日本成年人网址| 久久亚洲中文字幕无码| 男人添女人荫蒂免费视频| 91免费网站视频| 亚洲国产欧美91| 成人在线免费观看网址| 中文字幕第一页在线视频| 向日葵污视频在线观看| 高潮一区二区三区| 国产aⅴ爽av久久久久| 久久久久久久久久久久91| 在线免费观看av的网站| 天堂视频免费看| 波多野结衣在线免费观看| 五月天综合婷婷| 国产aaa免费视频| 欧美一区二区中文字幕| 日韩中文字幕免费在线| 国产一区二区在线免费播放| 性chinese极品按摩| 日日夜夜精品视频免费观看| 亚洲色成人www永久在线观看| www.射射射| 国产一级特黄a大片免费| 亚洲欧美天堂在线| 国产精品入口芒果| 国产a级片免费观看| 中文字幕 欧美日韩| 国产美女作爱全过程免费视频| 精品无码一区二区三区在线| 久久九九国产视频| 欧美精品一区二区性色a+v| 精品国产一区二区三区无码| 99草草国产熟女视频在线| 免费网站在线观看黄| 国模无码视频一区二区三区| 91在线视频观看免费| 天天操天天干天天玩| 日本xxxxxxx免费视频| 免费观看中文字幕| 91香蕉视频污版| 国产手机免费视频| 国产九九九视频| 成人在线观看a| 天堂8在线天堂资源bt| 国产三级精品三级在线| 99精品人妻少妇一区二区| 极品粉嫩美女露脸啪啪| 日韩免费毛片视频| www.日本在线视频| 黄瓜视频免费观看在线观看www| 国产精品-区区久久久狼| wwwwww欧美| 中国一级黄色录像| 欧美激情第一区| 一道本视频在线观看| 日韩久久一级片| 欧美 日韩 亚洲 一区| 青青在线视频免费观看| 最新中文字幕久久| 四虎1515hh.com| 一二三级黄色片| 欧美激情国内自拍| 可以看污的网站| 国产免费中文字幕| 污污网站在线观看视频| 韩国中文字幕av| 久久久久久久久久一区| av中文字幕网址| 深爱五月综合网| 波多野结衣三级在线| 波多野结衣在线免费观看| 香蕉视频xxxx| av日韩在线看| 日本香蕉视频在线观看| 久久久久久久中文| 日本精品一区二区三区四区| 无码人妻丰满熟妇区毛片18| 成人久久久久久久久| 亚洲成人av免费看| 福利片一区二区三区| 国产奶头好大揉着好爽视频| 高清无码一区二区在线观看吞精| 性高湖久久久久久久久aaaaa| 国产欧美精品aaaaaa片| 欧美日韩在线中文| 亚洲这里只有精品| 国产在线拍揄自揄拍无码| www.av91| 国模私拍视频在线观看| 韩国无码av片在线观看网站| 午夜免费福利小电影| 狠狠躁狠狠躁视频专区| 欧美一级黄色录像片| 97av视频在线观看| 日本高清免费在线视频| 国产三区在线视频| 性鲍视频在线观看| 欧美性久久久久| 毛片毛片毛片毛片毛| 久久久久人妻精品一区三寸| 午夜一级免费视频| 少妇高潮喷水在线观看| 污视频在线观看免费网站| 精品这里只有精品| 欧美性视频在线播放| 日av中文字幕| 欧美中日韩在线| www.日本久久| 成人亚洲精品777777大片| 国产一级不卡视频| 性欧美在线视频| 最近免费中文字幕中文高清百度| 老汉色影院首页| 999在线观看| 亚洲人辣妹窥探嘘嘘| 久久综合九色综合88i| 五月六月丁香婷婷| 亚洲一区在线不卡| 五月天婷婷激情视频| jizzjizzxxxx| 加勒比成人在线| 9191国产视频| 国产女人18毛片| 日本三级中文字幕在线观看| 高清一区在线观看| 国产精品视频分类| 苍井空浴缸大战猛男120分钟| 欧洲精品在线播放| 青青在线视频免费观看| 九一免费在线观看| av一区二区三区免费观看| 三上悠亚免费在线观看| 五月天av影院| 2021狠狠干| 成人免费视频91| 僵尸世界大战2 在线播放| 亚洲国产精品无码av| 成人性免费视频| 六月丁香激情网| 黄色av免费在线播放| 好男人www社区| 国产在线观看中文字幕| www.黄色网址.com| 少妇大叫太大太粗太爽了a片小说| 国产精品第157页| 内射国产内射夫妻免费频道| 日韩在线xxx| 波多野结衣xxxx| 男人的天堂视频在线| 狠狠精品干练久久久无码中文字幕| 国产一区 在线播放| 霍思燕三级露全乳照| 国产激情在线观看视频| 91小视频在线播放| 黄网站色视频免费观看| 农村妇女精品一二区| 色播五月综合网| 免费人成自慰网站| 五月天亚洲视频| 久久艹国产精品| 亚洲这里只有精品| 男女激情免费视频| 男人添女人下面免费视频| 国产成人亚洲综合无码| 国产91在线免费| 国产大尺度在线观看| 日av中文字幕| 91黄色在线看| 911福利视频| 久久久精品在线视频| 桥本有菜av在线| 91色国产在线| 日韩在线视频在线观看| 26uuu成人| 天美星空大象mv在线观看视频| 99re6这里有精品热视频| 五月婷婷之综合激情| 99热在线这里只有精品| www.激情网| 久久久福利影院| 国产视频1区2区3区| 欧美 日韩 国产 高清| 日本丰满少妇黄大片在线观看| 9久久婷婷国产综合精品性色 | 五月婷婷六月丁香激情| 国产精彩视频一区二区| 男插女免费视频| 日韩高清第一页| 538在线视频观看| 日韩视频第二页| 精品免费国产一区二区| av黄色在线网站| 北条麻妃在线视频| 亚洲精品乱码久久久久久自慰 | 在线观看亚洲色图| 国产福利影院在线观看|