Laravelリポジトリパターン

WBOY
リリース: 2016-07-30 13:30:50
オリジナル
946 人が閲覧しました

リポジトリ パターン

コードをクリーンで読みやすい状態に保つために、リポジトリ パターン を使用すると非常に便利です。実際、この特別なデザイン パターンを使用するためだけに Laravel を使用する必要はありません。ただし、次のシナリオでは、OOP フレームワーク Laravel を使用します。 では、リポジトリ を使用して Controller レイヤーの冗長性を減らし、より分離し、読みやすくする方法を示します。詳しく見てみましょう。 Repository Pattern 是非常有用的。事实上,我们也不必仅仅为了使用这个特别的设计模式去使用Laravel,然而在下面的场景下,我们将使用OOP的框架Laravel 去展示如何使用repositories 使我们的Controller层不再那么啰嗦、更加解耦和易读。下面让我们更深入的研究一下。

不使用 repositories

其实使用Repositories并不是必要的,在你的应用中你完全可以不使用这个设计模式的前提下完成绝大多数的事情,然而随着时间的推移你可能把自己陷入一个死角,比如不选择使用Repositories会使你的应用测试很不容易,(swapping out implementations)具体的实现将会变的很复杂,下面我们看一个例子。
HousesController.php

<?php
    class HousesController extends BaseController {
        public function index()
        {
            $houses = House::all();
            return View::make('houses.index',compact('houses'));
        }    
        
        public function create()
        {
            return View::make('houses.create');
        }
        public function show($id)
        {
            $house = House::find($id);
            return View::make('houses.show',compact('house'));
        }
    }
ログイン後にコピー

这是一个很典型的一段代码使用Eloquent和数据库交互,这段代码工作的很正常,但是controller层对于Eloquent而言将是紧耦合的。在此我们可以注入一个repository创建一个解耦类型的代码版本,这个解耦的版本代码可以使后续程序的具体实现更加简单。

使用 repositories

其实完成整个repository模式需要相当多的步骤,但是一旦你完成几次就会自然而然变成了一种习惯了,下面我们将详细介绍每一步。

1.创建 Repository 文件夹

首先我们需要在app文件夹创建自己Repository 文件夹repositories,然后文件夹的每一个文件都要设置相应的命名空间。

2: 创建相应的 Interface

第二步创建对应的接口,其决定着我们的repository类必须要实现的相关方法,如下例所示,在此再次强调的是命名空间一定要记得加上。
HouseRepositoryInterface.php

<?php namespace App\Repositories;

interface HouseRepositoryInterface {
    public function selectAll();
    
    public function find($id);
}
ログイン後にコピー

3:创建对应的 Repository

现在我们可以创建我们repository类 来给我们干活了,在这个类文件中我们可以把我们的绝大多数的数据库查询都放进去,不论多么复杂。如下面的例子
DbHouseRepository.php

<?php namespace App\Repositories;

use House;

class DbHouseRepository implements HouseRepositoryInterface {
    
    public function selectAll()
    {
        return House::all();
    }

    public function find($id)
    {
        return House::find($id);
    }
}
ログイン後にコピー

<code><span><span> </span></span></code>
ログイン後にコピー

4:创建后端服务提供

首先你需要理解所谓服务提供,请参考手册服务提供者
BackendServiceProvider.php

<?php namespace App\Repositories;

use IlluminateSupportSeriveProvider;

class BackSerivePrivider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('App\Repositories\HouseRepositoryInterface', 'App\Repositories\DbHouseRepository');
    }
}
ログイン後にコピー
<code><span><span> </span></span></code>
ログイン後にコピー

当然你也可以新建一个文件夹主要放我们的provider相关文件。
上面一段代码主要说的是,当你在controller层使用类型提示HouseRepositoryInterface,我们知道你将会使用DbHouseRepository.

5:更新你的Providers Array

其实在上面的代码中,我们已经实现了一个依赖注入,但如果我们要使用在此我们是需要手动去写的,为了更为方面,我们需要增加这个providers 到app/config/app.php 中的 providers数组里面,只需要在最后加上AppRepositoriesBackendServiceProvider::class,

6:最后使用依赖注入更新你的controller

当我们完成上面的那些内容之后,我们在Controller只需要简单的调用方法代替之前的复杂的数据库调用,如下面内容:
HousesController.php

リポジトリを使用しないでください

実際、アプリケーションでは、このデザイン パターンを使用せずにほとんどのタスクを完了できます。ただし、時間が経つと、たとえば、Repositories を使用しないと、アプリケーションのテスト (実装の交換) が非常に困難になる可能性があります。具体的な実装は変わります。非常に複雑なので、以下の例を見てみましょう。
HousesController.php

<?php 

use App\repositories\HouseRepositoryInterface;

class HousesController extends BaseController {

    public function __construct(HouseRepositoryInterface $house)
    {
        $this->house = $house;
    }


    public function index()
    {
        $houses = $this->house->selectAll();

        return View::make('houses.index', compact('houses'));
        
    }


    public function create()
    {
        return View::make('houses.create');
    }


    public function show($id)
    {
        $house = $this->house->find($id);
        
        return View::make('houses.show', compact('house'));

    }
}
ログイン後にコピー

これは、Eloquent を使用してデータベースと対話する非常に典型的なコードです。ただし、controller レイヤーは Eloquent と密接に結合されます。ここで、リポジトリを挿入して、コードの分離バージョンを作成できます。この分離バージョンのコードにより、後続のプログラムの特定の実装が簡素化されます。

repositories の使用🎜🎜実際、repository モード全体を完了するにはかなりの手順が必要ですが、数回完了すると、自然に習慣化しましょう 各ステップについて詳しく説明します。 🎜

1. Repository フォルダーを作成します

🎜 まず、app 内に独自の Repository フォルダー を作成する必要があります。フォルダー >repositories に移動し、フォルダー内の各ファイルに対応する名前空間を設定する必要があります。 🎜

2: 対応する Interface クラスを作成します

🎜 2 番目のステップは、repository クラスがメソッドを実装する必要があるものを決定する、対応するインターフェースを作成することです。次の例に示すように、名前空間を追加する必要があることを再度強調します。
HouseRepositoryInterface.php🎜🎜rrreee🎜

3: 対応する Repository クラスを作成します

🎜これで、リポジトリ クラスがその作業を行ってくれます。このクラス ファイルには、どんなに複雑であっても、ほとんどのデータベース クエリを入れることができます。次の例のように<br><code>DbHouseRepository.php🎜🎜rrreee🎜rrreee

4: バックエンド サービス プロバイダーを作成します

🎜まず、いわゆるサービス プロバイダーについては、マニュアルのサービス プロバイダーを参照してください。
BackendServiceProvider.php🎜🎜rrreee🎜rrreee🎜 もちろん、主に provider を保存する新しいフォルダーを作成することもできます。コード>関連ファイル。 <br>上記のコードが主に示していることは、<code>controller レイヤーでタイプ ヒント HouseRepositoryInterface を使用する場合、 DbHouseRepository を使用することがわかっているということです。 > .🎜
5: Providers Array
を更新します🎜実際、上記のコードでは依存関係の注入を実装しましたが、ここで使用したい場合は、次のことを行う必要があります。手動で行う より便利に記述するには、この providers を app/config/app.php の providers 配列に追加する必要があります。 を追加するだけです。 >AppRepositoriesBackendServiceProvider::class,🎜

6: 最後に、依存関係の注入を使用して コントローラー

を更新します🎜上記の内容を完了したら、 コントローラー は、以下に示すように、前の複雑なデータベース呼び出しの代わりにメソッドを呼び出すだけで済みます。
HousesController.php🎜🎜rrreee🎜🎜 このように、モデル変換全体が完了しました 🎜 🎜 以上、Laravel リポジトリ モードをその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。 🎜 🎜 🎜
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート