亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel中如何實現Repository設計模式

發布時間:2022-11-09 09:05:47 來源:億速云 閱讀:127 作者:iii 欄目:編程語言

本文小編為大家詳細介紹“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 Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

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 App\Repositories\Interfaces;

use App\User;

interface BlogRepositoryInterface
{
    public function all();

    public function getByUser(User $user);
}

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

<?php

namespace App\Repositories;

use App\Models\Blog;
use App\User;
use App\Repositories\Interfaces\BlogRepositoryInterface;

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 App\Http\Controllers;


use App\Repositories\Interfaces\BlogRepositoryInterface;
use App\User;

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 App\Providers;

use App\Repositories\BlogRepository;
use App\Repositories\Interfaces\BlogRepositoryInterface;
use Illuminate\Support\ServiceProvider;

class RepositoryServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(
            BlogRepositoryInterface::class, 
            BlogRepository::class
        );
    }
}

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

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

'providers' => [
  \App\Providers\RepositoryServiceProvider::class
],
php artisan config:clear

讀到這里,這篇“Laravel中如何實現Repository設計模式”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武邑县| 白城市| 承德县| 济南市| 伊宁市| 阿拉善左旗| 天台县| 凤庆县| 沅江市| 合山市| 元朗区| 海兴县| 台州市| 凌海市| 承德市| 洪洞县| 元江| 武胜县| 蕉岭县| 三亚市| 镇远县| 天峻县| 庄浪县| 兴城市| 东乡族自治县| 宿松县| 依安县| 江西省| 上虞市| 清徐县| 宁南县| 安图县| 永泰县| 枣强县| 白城市| 巴中市| 家居| 溧水县| 永仁县| 无棣县| 青海省|