目次
php artisan migrate
ログイン後にコピー
これにより、 で宣言した title# を含む blogs" >##データベースのセットアップが完了したので、移行の実行を開始できます。
php artisan migrate
ログイン後にコピー
これにより、 で宣言した title# を含む blogs
リポジトリ##の実装を開始できます。 #デザインスタイル。 app ディレクトリ内に Repositories ディレクトリを作成します。 2 番目に作成するディレクトリは、Interfaces" >すべての準備が整ったので、リポジトリ##の実装を開始できます。 #デザインスタイル。 app ディレクトリ内に Repositories ディレクトリを作成します。 2 番目に作成するディレクトリは、Interfaces
RepositoryServiceProvider" >RepositoryServiceProvider
ホームページ PHPフレームワーク Laravel Laravelでリポジトリ設計パターンを実装する方法

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

Nov 08, 2022 pm 08:39 PM
php laravel

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
ログイン後にコピー
ログイン後にコピー

移行を実行

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

content

および

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

ディレクトリで、

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

我们将注入 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPとPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの目的:動的なWebサイトの構築 PHPの目的:動的なWebサイトの構築 Apr 15, 2025 am 12:18 AM

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPおよびPython:さまざまなパラダイムが説明されています PHPおよびPython:さまざまなパラダイムが説明されています Apr 18, 2025 am 12:26 AM

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHPとPythonの選択:ガイド PHPとPythonの選択:ガイド Apr 18, 2025 am 12:24 AM

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHP:データベースとサーバー側のロジックの処理 PHP:データベースとサーバー側のロジックの処理 Apr 15, 2025 am 12:15 AM

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

See all articles