Laravel フレームワークでの Contracts コントラクトの解析
コントラクト
Laravel のコントラクトは、フレームワークによって提供されるコア サービスを定義するインターフェイスのセットです。ユーザー認証を紹介する章 ユーザー ガード コントラクト IllumninateContractsAuthGuard
とユーザー プロバイダー コントラクト IlluminateContractsAuthUserProvider
、およびアプリによって実装される IlluminateContractsAuthAuthenticatable
contract フレームワークに付属するユーザー モデル。
コントラクトを使用する理由
上記のコントラクトのソースコードファイルを通じて、Laravel によって提供されるコントラクトは、Laravel 用に定義されたインターフェイスのセットであることがわかります。コアモジュール。 Laravel は、各コントラクトに対応する実装クラスを提供します。次の表は、上記の 3 つのコントラクトに対して Laravel が提供する実装クラスのリストです。
したがって、独自の開発プロジェクトで、Laravel が提供するユーザー認証システムがニーズを満たせない場合は、必要に応じてウォッチャーとユーザープロバイダーの実装クラスを定義できます。以前取り組んだプロジェクトでは、ユーザー認証が会社の従業員管理システムのAPIに依存していたため、ガードとユーザープロバイダーコントラクトの実装クラスを自分で書き、カスタムGuardを介してLaravelにユーザー認証を完了させました。とユーザープロバイダー。ユーザー認証のカスタマイズ方法については、ユーザー認証の紹介の章で紹介していますので、そちらをご覧ください。
つまり、Laravel がすべてのコア機能のコントラクト インターフェイスを定義する目的は、開発者が独自のプロジェクトのニーズに応じて独自の実装クラスを定義できるようにすることと、これらのインターフェイスの利用者 (コントローラー、カーネルは AuthManager などを提供します) インターフェースによって提供されるメソッドがどのように実装されるかを気にする必要はありません。インターフェース メソッドがどのような機能を提供できるかだけを気にし、それらの機能を使用します。必要に応じてインターフェースを変更するだけで、コンシューマ側で変更を加える必要はありません。
コントラクトの定義と使用
上で述べたものはすべて、Laravel カーネルによって提供されるコントラクトです。大規模なプロジェクトを開発する場合、プロジェクト内でコントラクトを自分で定義することもできます。コードを作成するには、組み込みのコントローラー層とモデル層だけで十分だと感じるかもしれませんが、何もないところからコントラクトや実装クラスを追加すると、開発が面倒になります。簡単な例から始めて、次のコードの何が問題なのかを考えてみましょう。
class OrderController extends Controller { public function getUserOrders() { $orders= Order::where('user_id', '=', \Auth::user()->id)->get(); return View::make('order.index', compact('orders')); } }
このコードは非常に単純ですが、このコードをテストしたい場合は、間違いなく実際のデータベースと通信することになります。
言い換えれば、ORM とこのコントローラーは密接に結合されています。 Eloquent ORM を使用して実際のデータベースに接続しない限り、このコードを実行またはテストする方法はありません。このコードは、「関心事の分離」というソフトウェア設計原則にも違反しています。
簡単に言うと、このコントローラーは知りすぎています。
コントローラーは、データへのアクセス方法を知っていれば、データがどこから来たのかを知る必要はありません。コントローラーはデータが MySQL からどこから来たのかを知る必要はなく、データが現在利用可能であることを知っていればよいだけです。
#懸念事項の分離
すべてのクラスは 1 つの責任を持つ必要があり、その責任はクラスによって完全にカプセル化される必要があります。#各クラスは 1 つの責任のみを持つ必要があり、その責任内のすべてがこのクラスによってカプセル化される必要があります。
次にインターフェイスを定義し、インターフェイスを実装します
interface OrderRepositoryInterface { public function userOrders(User $user); } class OrderRepository implements OrderRepositoryInterface { public function userOrders(User $user) { Order::where('user_id', '=', $user->id)->get(); } }
の実装をバインドします。 Laravel のサービス コンテナへのインターフェイス
App::singleton('OrderRepositoryInterface', 'OrderRespository');
次に、インターフェイスの実装をコントローラーに注入します
class UserController extends Controller { public function __construct(OrderRepositoryInterface $orderRepository) { $this->orders = $orderRespository; } public function getUserOrders() { $orders = $this->orders->userOrders(); return View::make('order.index', compact('orders')); } }
これで、コントローラーはデータ層から完全に独立しました。ここでのデータは、MySQL、MongoDB、または Redis から取得される可能性があります。私たちのコントローラーは違いを知りませんし、知る必要もありません。こうすることで、データ層から独立して Web 層をテストでき、将来的にはストレージ実装を簡単に切り替えることができます。
インターフェイスとチーム開発チームが大規模なアプリケーションを開発している場合、部分によって開発速度は異なります。
たとえば、ある開発者がデータ層を開発し、別の開発者がコントローラー層を開発しているとします。
コントローラーを作成した開発者はコントローラーをテストしたいと考えていますが、データ層の開発が遅いため、同時にテストすることができません。 2 人の開発者が最初にインターフェイスの形式で合意に達すると、バックグラウンドで開発されるさまざまなクラスがこの合意に従います。
合意が確立されると、合意が実装されていない場合でも、開発者はこのインターフェイスの「偽の」実装を作成することもできます。
class DummyOrderRepository implements OrderRepositoryInterface { public function userOrders(User $user) { return collect(['Order 1', 'Order 2', 'Order 3']); } }
偽の実装が作成されると、 IoC コンテナ内で
App::singleton('OrderRepositoryInterface', 'DummyOrderRepository');
にバインドされると、このアプリケーションのビューに偽のデータを埋め込むことができます。次に、バックエンド開発者が実際の実装コードの作成を完了すると、たとえば、
RedisOrderRepository と呼ばれます。 <p>那么使用IoC容器切换接口实现,应用就可以轻易地切换到真正的实现上,整个应用就会使用从Redis读出来的数据了。</p><p><strong>接口与测试</strong></p><p>建立好接口约定后也更有利于我们在测试时进行<code>Mock
public function testIndexActionBindsUsersFromRepository() { // Arrange... $repository = Mockery::mock('OrderRepositoryInterface'); $repository->shouldReceive('userOrders')->once()->andReturn(['order1', 'order2]); App::instance('OrderRepositoryInterface', $repository); // Act... $response = $this->action('GET', 'OrderController@getUserOrders'); // Assert... $this->assertResponseOk(); $this->assertViewHas('order', ['order1', 'order2']); }
总结
接口在程序设计阶段非常有用,在设计阶段与团队讨论完成功能需要制定哪些接口,然后设计出每个接口具体要实现的方法,方法的入参和返回值这些,每个人就可以按照接口的约定来开发自己的模块,遇到还没实现的接口完全可以先定义接口的假实现等到真正的实现开发完成后再进行切换,这样既降低了软件程序结构中上层对下层的耦合也能保证各部分的开发进度不会过度依赖其他部分的完成情况。
更多laravel框架相关技术文章,请访问laravel教程栏目!
以上がLaravel フレームワークでの Contracts コントラクトの解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









この記事では、コンポーネントを使用してLaravelで再利用可能なUI要素の作成とカスタマイズについて説明し、組織のベストプラクティスを提供し、パッケージを強化することを提案します。

この記事では、スケーラビリティ、信頼性、セキュリティに焦点を当てたクラウドネイティブ環境でLaravelを展開するためのベストプラクティスについて説明します。重要な問題には、コンテナ化、マイクロサービス、ステートレス設計、最適化戦略が含まれます。

この記事では、Laravelでカスタムブレードディレクティブの作成と使用を行い、テンプレートを強化します。ディレクティブの定義、テンプレートでそれらを使用し、大規模なプロジェクトでそれらを管理することをカバーし、改善されたコードの再利用性やRなどの利点を強調しています

この記事では、Laravelでカスタム検証ルールの作成と使用について説明し、それらを定義および実装する手順を提供します。再利用性や特異性などの利点を強調し、Laravelの検証システムを拡張する方法を提供します。

Laravelの職人コンソールは、コードの生成、移行の実行、スケジューリングなどのタスクを自動化します。重要なコマンドには、Make:Controller、Migrate、およびDB:Seedが含まれます。特定のニーズに合わせてカスタムコマンドを作成し、ワークフロー効率を向上させることができます。

この記事では、Laravelのルーティングを使用してSEOに優しいURLを作成し、Best Practice、Canonical URL、SEO最適化のツールをカバーします。ワード数:159

この記事では、Laravelでデータベーストランザクションを使用して、データの一貫性を維持し、DBファサードと雄弁なモデルを使用した方法の詳細、ベストプラクティス、例外処理、およびトランザクションの監視とデバッグのためのツールについて説明します。

DjangoとLaravelはどちらもフルスタックのフレームワークです。 DjangoはPython開発者や複雑なビジネスロジックに適していますが、LaravelはPHP開発者とエレガントな構文に適しています。 1.DjangoはPythonに基づいており、迅速な発展と高い並行性に適した「バッテリーコンプリート」哲学に従います。 2. LaravelはPHPに基づいており、開発者エクスペリエンスを強調しており、小規模から中規模のプロジェクトに適しています。
