ホームページ PHPフレームワーク Laravel Laravelインターフェース指向プログラミング(実践)

Laravelインターフェース指向プログラミング(実践)

May 21, 2020 am 11:06 AM
laravel php

Laravelインターフェース指向プログラミング(実践)

インターフェイス指向プログラミングは、固定クラスではなくインターフェイスに基づいてアプリケーションを構築するコーディングにおける設計哲学です。

プログラマーであれば、インターフェイス指向プログラミング、固定クラスの代わりに抽象クラスを使用するなどのステートメントを聞いたことがあるかもしれません。

これらはすべて同じことを言っています。具体的なクラスではなく抽象インターフェイスに依存するようにアプリケーション コードを作成してください。 #########なぜ?

これが、この文を最初に聞いたときの私の正確な反応です。なぜクラスではなくインターフェイスを使用するのでしょうか?インターフェースを作成したとしても、そのインターフェースを実装するクラスを作成する必要があります。これは時間の無駄ではありませんか? ######もちろん違います! !

この世界で唯一変わらないものは変化そのものです。つまり、変化は永遠です。

プログラミングに関する限り、これには例外はありません。ビジネス ニーズは時間の経過とともに変化するため、コードも変更する必要があります。

したがって、コードは柔軟性を維持する必要があります。

インターフェイス指向プログラミングでは、コードを疎結合にして柔軟にすることができます。 #########どうやってするの?

以下のコードを観察してください。

class Logger {
    public function log($content) 
    {
        //日志保存到文件中.
        echo "Log to file";
    }
}
ログイン後にコピー

これは、ファイルにログを記録する単純なクラスです。コントローラー内で呼び出すことができます。

class LogController extends Controller
{
    public function log()
    {
        $logger = new Logger;
        $logger->log('Log this');
    }
}
ログイン後にコピー

しかし、複数の場所 (データベース、ファイル、クラウドなど) にログを記録する必要がある場合はどうすればよいでしょうか。

次に、これらの変更に対応するために LogController クラスと Logger クラスを変更します。

class Logger {
    public function logToDb($content) 
    {
        //将日志记录到 db.
    }
    public function logToFile($content) 
    {
        //将日志保存到 file.
    }
    public function logToCloud($content) 
    {
        //将日志存储到 cloud.
    }
}
ログイン後にコピー
class LogController extends Controller
{
    public function log()
    {
        $logger = new Logger;
        $target = config('log.target');
        if ($target == 'db') {
            $logger->logToDb($content);
        } elseif ($target == 'file') {
            $logger->logToFile($content);
        } else {
            $logger->logToCloud($content);
        }
    }
}
ログイン後にコピー

これで、さまざまな目標を記録できるようになりました。しかし、他のターゲット (ログなど) を Redis サーバーに追加したい場合はどうすればよいでしょうか?最後に、Logger クラスと LogController クラスの両方を変更します。

ご覧のとおり、これはすぐに私たちの手に負えなくなり、コードが乱雑になってしまいます。 Logger クラスはすぐにまとまりました。これは悪夢です。


したがって、物事を分割する必要があります。 SOLID 原則に従って、責任を適切なクラスに移すことができます。

class DBLogger
{
    public function log()
    {
        //将日志记录到 db
    }
}
class FileLogger
{
    public function log()
    {
        //将日志保存到 file
    }
}
class CloudLogger
{
    public function log()
    {
        //将日志存储到 cloud
    }
}
ログイン後にコピー

そして、コントローラーは次のように変更されます:

class LogController extends Controller
{
    public function log()
    {
        $target = config('log.target');
        if ($target == 'db') {
            (new DBLogger)->log($content);
        } elseif ($target == 'file') {
            (new FileLogger)->log($content);
        } else {
            (new CloudLogger)->log($content);
        }
    }
}
ログイン後にコピー

これははるかに優れています。ここで、さらにログ ターゲットを追加したい場合は、新しいクラスを作成し、それをコントローラーの if-else に追加できます。

ただし、ロガーの選択はコントローラーが引き続き担当します。コントローラーの場合、さまざまなロガーについて知り、その中から選択する必要はありません。コンテンツをログに記録するには、 log() メソッドを備えたロガー クラスが必要です。

インターフェースの使用

この状況はインターフェースの使用に適しています。では、インターフェースとは何でしょうか?

インターフェイスは、オブジェクトが実行できる操作を記述したものです。

この例では、コントローラーには log() メソッドを備えたロガー クラスのみが必要です。したがって、インターフェースには log() メソッドが必要であることを記述する必要があります。

interface Logger
{
    public function log($content);
}
ログイン後にコピー
ご覧のとおり、これには関数の宣言のみが含まれており、その実装は含まれていないため、抽象と呼ばれます。

インターフェイスを実装する場合、インターフェイスを実装するクラスは、インターフェイスで定義された抽象メソッドの実装の詳細を提供する必要があります。

この例では、Logger インターフェイスを実装するクラスは、抽象メソッド log() の実装の詳細を提供する必要があります。

その後、このインターフェイスをコントローラーに挿入できます。

class LogController extends Controller
{
    public function log(Logger $logger)
    {
        $logger->log($content);
    }
}
ログイン後にコピー

これで、コントローラーは、渡されたロガーのタイプを気にしなくなります。知っておく必要があるのは、Logger インターフェイスを実装する必要があるということだけです。

したがって、このインターフェイスを実装するには Logger クラスを変更する必要があります。

class DBLogger implements Logger
{
    public function log()
    {
        //将日志记录到 db
    }
}
class FileLogger implements Logger
{
    public function log()
    {
        //将日志存储到 file
    }
}
class CloudLogger implements Logger
{
    public function log()
    {
        //将日志保存到 cloud
    }
}
ログイン後にコピー

これで、既存のコードに手を加えずにロガーを追加できるようになりました。必要なのは、Logger インターフェイスを実装する新しいクラスを作成することだけです。

class RedisLogger implements Logger
{
    public function log()
    {
        //将日志存储到 redis
    }
}
ログイン後にコピー

私たちのコードは柔軟で低結合になっているようです。以前のコードを変更せずに、いつでも実装方法を変更できます。

Dependency Injection

Laravel フレームワークを使用している場合、サービス コンテナを使用してインターフェイスの実装を自動的に登録できます。

Laravel ではすぐに使用できるメソッド インジェクションが提供されているため、インターフェイスと実装をバインドするだけで済みます。

まず、ロガー構成ファイルを作成する必要があります。これと同じように

<?php
return [
    &#39;default&#39; => env(&#39;LOG_TARGET&#39;, &#39;file&#39;),
    &#39;file&#39; => [
        &#39;class&#39; => App\Log\FileLogger::class,
    ],
    &#39;db&#39; => [
        &#39;class&#39; => App\Log\DBLogger::class,
    ],
    &#39;redis&#39; => [
        &#39;class&#39; => App\Log\RedisLogger::class,
    ]
];
ログイン後にコピー
次に、app/Providersパスの下のAppServiceProvider.phpファイルに次のコードを追加します

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $default = config(&#39;log.default&#39;);
        $logger = config("log.{$default}.class");
        $this->app->bind(
            App\Contracts\Logger::class, // the logger interface
            $logger
        );
    }
}
ログイン後にコピー

これにより、logger.php構成からデフォルトのロガーが読み取られます。ファイルを作成し、Logger インターフェイスにバインドします。このようにして、Logger インターフェースを使用すると、コンテナーが解析してデフォルトの Logger インスタンスを返します。

デフォルトのロガーは env() アシスタントを使用して指定されるため、ローカル環境のファイルや運用環境の db など、異なる環境で異なるロガーを使用できます。

概要

インターフェイスを使用すると、結合度の低いコードを記述し、抽象化レイヤーを提供できます。これにより、いつでも実装を変更できます。したがって、アプリケーションの可変部分はできる限りインターフェイス指向の方法で実装するようにしてください。

推奨チュートリアル: 「

PHP チュートリアル

以上が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)

session_start()関数の重要性は何ですか? session_start()関数の重要性は何ですか? May 03, 2025 am 12:18 AM

session_start()iscrucialinphpformangingusersions.1)itInitiateSanewsessionifnoneExists、2)resumesanexistingsession、および3)SetSessionCookieforcontinuityAcrossRequests、ApplicationslicationSliviseSlikeUserauthicationAnticatent。

PHPフレームワークLaravelとYiiの違いは何ですか PHPフレームワークLaravelとYiiの違いは何ですか Apr 30, 2025 pm 02:24 PM

LaravelとYiiの主な違いは、デザインの概念、機能的特性、使用シナリオです。 1.Laravelは、開発のシンプルさと喜びに焦点を当てており、迅速な開発や初心者に適したEloquentormやArtisan Toolsなどの豊富な機能を提供します。 2.YIIはパフォーマンスと効率を強調し、高負荷アプリケーションに適しており、効率的なActiverCordおよびキャッシュシステムを提供しますが、急な学習曲線があります。

データ処理と計算にMySQL関数を使用する方法 データ処理と計算にMySQL関数を使用する方法 Apr 29, 2025 pm 04:21 PM

MySQL関数は、データ処理と計算に使用できます。 1.基本的な使用には、文字列処理、日付計算、数学操作が含まれます。 2。高度な使用法には、複数の関数を組み合わせて複雑な操作を実装することが含まれます。 3.パフォーマンスの最適化では、Where句での機能の使用を回避し、GroupByおよび一時テーブルを使用する必要があります。

Laravelの最高の拡張パックを推奨:2024 Essential Tools Laravelの最高の拡張パックを推奨:2024 Essential Tools Apr 30, 2025 pm 02:18 PM

2024年の必須のLaravel拡張パッケージには、次のものが含まれます。 2。LaravelteLescope、詳細なアプリケーション監視を提供します。 3。RARAVELHORIZON、Redisキュータスクの管理。これらの拡張パックは、開発効率とアプリケーションのパフォーマンスを向上させることができます。

作曲家:PHP開発者のパッケージマネージャー 作曲家:PHP開発者のパッケージマネージャー May 02, 2025 am 12:23 AM

Composerは、PHPの依存関係管理ツールであり、Composer.jsonファイルを介してプロジェクトの依存関係を管理しています。 1)依存関係情報を取得するためのComposer.jsonを解析する。 2)依存関係を解析して、依存性ツリーを形成します。 3)PackagistからVendorディレクトリへの依存関係をダウンロードしてインストールします。 4)Composer.Lockファイルを生成して、依存関係バージョンをロックして、チームの一貫性とプロジェクトの保守性を確保します。

Laravelログとエラー監視:SentryとBugsnagの統合 Laravelログとエラー監視:SentryとBugsnagの統合 Apr 30, 2025 pm 02:39 PM

SentryとBugsnagをLaravelに統合すると、アプリケーションの安定性とパフォーマンスが向上する可能性があります。 1. Composer.jsonにSentrysdkを追加します。 2. config/app.phpにSentryサービスプロバイダーを追加します。 3。.envファイルでsentrydsnを構成します。 4. app \ exceptions \ handler.phpにセントリーエラーレポートを追加します。 5. Sentryを使用して例外をキャッチおよび報告し、追加のコンテキスト情報を追加します。 6. app \ exceptions \ handler.phpにbugsnagエラーレポートを追加します。 7. bugsnag監視を使用します

Laravelライブチャットアプリケーション:WebSocketとPusher Laravelライブチャットアプリケーション:WebSocketとPusher Apr 30, 2025 pm 02:33 PM

Laravelでライブチャットアプリケーションを構築するには、WebSocketとPusherを使用する必要があります。特定の手順には次のものが含まれます。1).envファイルでプッシャー情報を構成します。 2)broadcasting.phpファイルの放送ドライバーをプッシャーに設定します。 3)Pusherチャンネルを購読し、Laravelechoを使用してイベントを聴きます。 4)Pusher APIを介してメッセージを送信します。 5)プライベートチャネルとユーザー認証を実装します。 6)パフォーマンスの最適化とデバッグを実行します。

mysqlの文字セットと照合ルールを構成する方法 mysqlの文字セットと照合ルールを構成する方法 Apr 29, 2025 pm 04:06 PM

MySQLで文字セットと照合を構成する方法は次のとおりです。1。サーバーレベルでの文字セットとコレクションの設定:setNames'utf8 '; setCharacterSetutf8; setCollat​​ion_connection = 'utf8_general_ci'; 2。特定の文字セットと照合を使用するデータベースを作成します:createdatabaseexample_dbcharactersetutf8collat​​eutf8_general_ci; 3.テーブルを作成するときに文字セットとコレクションを指定:createTableExample_table(idint

See all articles