ホームページ >PHPフレームワーク >Laravel >Laravelでリポジトリ設計パターンを実装する方法

Laravelでリポジトリ設計パターンを実装する方法

青灯夜游
青灯夜游転載
2022-11-08 20:39:441653ブラウズ

Laravelでリポジトリ設計パターンを実装する方法

この記事では、Laravel で repository デザイン パターンを最初から実装する方法を説明します。 Laravel バージョン 5.8.3 を使用しますが、Laravel バージョンは最も重要ではありません。コードの作成を開始する前に、repository デザイン パターンに関する情報を理解しておく必要があります。

Laravelでリポジトリ設計パターンを実装する方法

リポジトリ デザイン パターンを使用すると、オブジェクトがどのように永続化されるかを知らなくてもオブジェクトを操作できます。本質的に、これはデータ層の抽象化です。

これは、ビジネス ロジックがデータの取得方法やデータ ソースが何であるかを知る必要がなく、ビジネス ロジックは リポジトリに依存して正しいデータを取得することを意味します。

このパターンに関して、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

ディレクトリにあります。 *
これで、新しく生成されたモデル Blog
app/Models

ディレクトリに見つかるはずです。これは、私がモデルを保存するのに好きな方法です。

コントローラーとモデルを用意したので、作成した移行ファイルを見てみましょう。デフォルトの Laravel タイムスタンプ フィールドに加えて、私たちのブログでは Title、Content、および UserID

フィールドのみが必要です。

<?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(&#39;blogs&#39;, function (Blueprint $table) {
            $table->bigIncrements(&#39;id&#39;);
            $table->string(&#39;title&#39;);
            $table->text(&#39;content&#39;);
            $table->integer(&#39;user_id&#39;);
            $table->timestamps();

            $table->foreign(&#39;user_id&#39;)
                  ->references(&#39;id&#39;)
                  ->on(&#39;users&#39;);
        });
    }

    public function down()
    {
        Schema::dropIfExists(&#39;blogs&#39;);
    }
}
ヒント: Laravel 5.8 より前の古いバージョンを使用している場合は、

$table->bigIncrements(&#39;id&#39;);


$table->increments(&#39;id&#39;);
に置き換えてください。

データベースのセットアップ

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
これにより、 で宣言した title# を含む blogs

テーブルが作成されます。移行 ## 、

content

および

user_id フィールド。 実装リポジトリ デザイン パターン

すべての準備が整ったので、リポジトリ##の実装を開始できます。 #デザインスタイル。 app ディレクトリ内に Repositories ディレクトリを作成します。 2 番目に作成するディレクトリは、Interfaces

ディレクトリで、

Repositories ディレクトリ内にあります。 Interfaces ファイル内に、2 つのメソッドを含む BlogRepositoryInterface インターフェイスを作成します。

すべてのブログ投稿の

all メソッドを返します。

すべてのブログ投稿の
    getByUser## を返します。特定のユーザーの投稿 # メソッド
  • <?php
    
    namespace App\Repositories\Interfaces;
    
    use App\User;
    
    interface BlogRepositoryInterface
    {
        public function all();
    
        public function getByUser(User $user);
    }
    作成する必要がある最後のクラスは、

    BlogRepositoryInterface
  • を実装する
  • BlogRepository

    です。最も単純な実装。

    <?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(&#39;user_id&#39;,$user->id)->get();
        }
    }

    Repositories
  • ディレクトリは次のようになります。
app/└── Repositories/
    ├── BlogRepository.php
    └── Interfaces/
        └── BlogRepositoryInterface.php

これで、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(&#39;blog&#39;)->withBlogs($blogs);
    }

    public function detail($id)
    {
        $user = User::find($id);
        $blogs = $this->blogRepository->getByUser($user);

        return view(&#39;blog&#39;)->withBlogs($blogs);
    }
}
ご覧のとおり、コントローラーのコードは非常に短く、非常に読みやすいです。 repository のおかげで、このロジックはすべて 1 行のコードで実行できるため、必要なデータを取得するのに 10 行のコードは必要ありません。 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 列表中。完成了这些后我们需要清空缓存:

&#39;providers&#39; => [
  \App\Providers\RepositoryServiceProvider::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

【相关推荐:laravel视频教程

以上がLaravelでリポジトリ設計パターンを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。