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

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Laravel中怎么實現(xiàn)Repository設計模式

Laravel中怎么實現(xiàn)Repository設計模式

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

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

Laravel中怎么實現(xiàn)Repository設計模式

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

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

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

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

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

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

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

php artisan make:controller BlogController
登錄后復制

這將在 app/Http/Controllers 目錄中創(chuàng)建 BlogController

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

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

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

現(xiàn)在我們有了控制器和模型,是時候看看我們創(chuàng)建的遷移文件了。除了默認的 Laravel 時間戳字段外,我們的博客只需要 標題、內(nèi)容用戶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');
登錄后復制

設置數(shù)據(jù)庫

我將使用 MySQL 數(shù)據(jù)庫作為示例,第一步就是創(chuàng)建一個新的數(shù)據(jù)庫。

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

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

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

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

php artisan config:clear
登錄后復制

登錄后復制

運行遷移

現(xiàn)在我們已經(jīng)設置好了數(shù)據(jù)庫,可以開始運行遷移了:

php artisan migrate
登錄后復制

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

實現(xiàn) repository 設計模式

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

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

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

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

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

我們需要創(chuàng)建的最后一個類是將要實現(xiàn) BlogRepositoryInterfaceBlogRepository ,我們會寫一個最簡單的實現(xiàn)方式。

<?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
登錄后復制

你現(xiàn)在已經(jīng)成功創(chuàng)建了一個 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);     } }
登錄后復制

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

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

RepositoryServiceProvider

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

php artisan make:provider RepositoryServiceProvider
登錄后復制

我們?yōu)榇藙?chuàng)建一個新的 provider 的原因是,當您的項目開始發(fā)展為大型項目時,結構會變得非常凌亂。設想一下,一個擁有 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
登錄后復制

登錄后復制

就是這樣

現(xiàn)在你已經(jīng)成功實現(xiàn)了 repository 設計模式,不是很難吧?

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

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

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

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

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美大片免费播放| 成年人在线观看视频免费| 日本精品免费在线观看| 182午夜视频| 久章草在线视频| 国产三级中文字幕| 99福利在线观看| 台湾无码一区二区| 手机av在线网| 久久久久久香蕉| 日韩人妻无码精品久久久不卡| 男人操女人免费| 欧美午夜性视频| av免费一区二区| 国产视频一区二区视频| 日韩国产一级片| 国产日韩欧美大片| 欧美性受xxxx黒人xyx性爽| 欧美视频第三页| 国产3p露脸普通话对白| 国产又粗又大又爽的视频| 男人插女人下面免费视频| 免费一级特黄毛片| 人妻av无码专区| 老子影院午夜伦不卡大全| 五月天丁香花婷婷| 尤物国产在线观看| 亚洲视频一二三四| 91性高潮久久久久久久| 免费看污污网站| 精品999在线| 日本中文字幕精品—区二区| 性生交免费视频| 亚洲精品久久久久久宅男| 免费涩涩18网站入口| jizz大全欧美jizzcom| av污在线观看| 99精品视频国产| 日韩一级片一区二区| 成人午夜免费在线视频| 婷婷视频在线播放| 大地资源第二页在线观看高清版| 国产又粗又爽又黄的视频| 中文字幕黄色大片| 999久久欧美人妻一区二区| 国产一区二区视频播放| 成人黄色一区二区| xxx中文字幕| 久久福利一区二区| 5月婷婷6月丁香| 手机看片福利日韩| 色乱码一区二区三区熟女| 台湾无码一区二区| 国模杨依粉嫩蝴蝶150p| 亚洲图色中文字幕| 成人高清在线观看视频| 男人草女人视频| 欧洲精品在线播放| 奇米影视亚洲色图| 一区二区三区视频在线观看免费| 黄色片免费网址| 真人抽搐一进一出视频| 国产午夜伦鲁鲁| 久热精品在线观看视频| 亚洲色婷婷久久精品av蜜桃| 少妇性饥渴无码a区免费| 爱豆国产剧免费观看大全剧苏畅| 欧美精品卡一卡二| 黄色aaaaaa| 久久久999免费视频| 日本一本在线视频| 人妻无码视频一区二区三区| 法国空姐在线观看免费| caopor在线视频| 国产av熟女一区二区三区| 国产野外作爱视频播放| 日韩视频免费播放| 能在线观看的av| 免费看污黄网站| 欧美日韩激情四射| 亚洲人视频在线| 深爱五月综合网| 成人免费a级片| 污污的网站18| 久久婷婷五月综合色国产香蕉| 131美女爱做视频| 午夜激情视频网| 激情久久综合网| 天天操,天天操| 中文字幕在线观看第三页| av中文字幕av| 国产91视频一区| 美女黄色免费看| 在线观看污视频| 成人手机视频在线| japanese在线视频| 性生活免费观看视频| 亚洲激情免费视频| 国产精品美女在线播放| 国产成年人视频网站| 丰满女人性猛交| av片在线免费| 天天干在线影院| 欧美日韩在线免费观看视频| 91成人在线视频观看| 成人在线观看毛片| 漂亮人妻被中出中文字幕| 国产天堂在线播放| 麻豆映画在线观看| 亚洲成人av免费看| 欧洲精品一区二区三区久久| 污污网站在线观看视频| 亚洲精品久久久久久久蜜桃臀| 久久久久国产精品熟女影院| 欧美 日韩 国产 激情| 欧美一级爱爱视频| 高清av免费看| 欧美精品色婷婷五月综合| 亚洲男人天堂2021| 国产免费视频传媒| 久久综合色视频| 欧美这里只有精品| 波多野结衣网页| 亚洲欧美一区二区三区不卡| youjizzxxxx18| mm131国产精品| 污污网站在线观看视频| 国产九九在线观看| 成人av毛片在线观看| 视频二区在线播放| 99久re热视频精品98| 日日夜夜精品视频免费观看| 午夜精品免费看| 国产精品无码电影在线观看| 9191国产视频| 黄www在线观看| 精品亚洲视频在线| www.xxx麻豆| 天天爽天天爽夜夜爽| 中文字幕视频在线免费观看| 中文字幕在线导航| 在线观看av的网址| 日韩中文字幕三区| 亚欧精品在线视频| av免费观看网| 精品国产无码在线| 亚洲精品一二三四五区| 99在线观看视频免费| av噜噜在线观看| 日韩欧美国产免费| 警花观音坐莲激情销魂小说| www.中文字幕在线| 欧美这里只有精品| 小说区视频区图片区| 91激情视频在线| 免费在线看黄色片| 99999精品| 国产又粗又长又爽又黄的视频| 北条麻妃69av| 日本福利视频一区| 青青草综合在线| 日本五级黄色片| 成人午夜免费在线| 成人在线国产视频| 91九色丨porny丨国产jk| 欧洲xxxxx| a级黄色小视频| 无码aⅴ精品一区二区三区浪潮| 日韩人妻无码精品久久久不卡| 精品日韩在线播放| www.av蜜桃| 黑人糟蹋人妻hd中文字幕| 久久国产成人精品国产成人亚洲 | 日韩亚洲欧美视频| 精品人妻一区二区三区四区在线| 极品美女扒开粉嫩小泬| 人人干视频在线| wwww.国产| 少妇人妻大乳在线视频| 久久久精品三级| 日韩视频在线视频| 欧美激情第3页| 国产精品后入内射日本在线观看| 美女网站免费观看视频| 国产 欧美 日本| 手机在线国产视频| 日日干夜夜操s8| 99999精品视频| 奇米777四色影视在线看| 欧美日韩黄色一级片| 成年人网站av| 色诱视频在线观看| 免费国产黄色网址| 成人在线免费观看网址| 久久久久久久少妇| 黄色片视频在线播放| 男女av免费观看| 国产免费成人在线| 激情综合网俺也去| 天天干天天干天天干天天干天天干|