ホームページ PHPフレームワーク Laravel コード内でコンテナインスタンスを取得する(Laravel)

コード内でコンテナインスタンスを取得する(Laravel)

Aug 06, 2021 am 09:35 AM
laravel

この記事は、laravel のチュートリアルコラムで、コード内でコンテナインスタンスを取得する方法を紹介する記事です。

laravel コンテナインスタンスはリクエストライフサイクル全体を通じて一意であり、すべてのサービスコンポーネントインスタンスを管理します。それでは、laravelコンテナのインスタンスを取得するにはどのような方法があるのでしょうか?以下の方法が一般的に使用されます:

1) アプリのヘルプ機能経由:

$app = app();
ログイン後にコピー

アプリの補助機能は

コード内でコンテナインスタンスを取得する(Laravel)

# で定義されています。 ## このファイルでは、多くのヘルプ関数が定義されており、composer を通じてプロジェクトに自動的にロードされます。したがって、関数には、app() などの http リクエスト処理に関係する任意のコードの場所からアクセスできます。

2) アプリ ファサード経由

<?php
Route::get(&#39;/&#39;, function () {
    dd(App::basePath());
    return &#39;&#39;;
});
ログイン後にコピー
ログイン後にコピー

アプリ ファサード経由でコンテナ インスタンスを取得する方法は上記とは異なります。最初にアプリを変数に割り当ててからコンテナを呼び出すことはできません変数を通じて。これは、App は単なるクラス名であり、クラス名を変数にコピーできないためです。 $app = App; は正当な実行可能ステートメントではありませんが、 $app = app(); の後に関数呼び出しを表す app() が続くため、正当な実行可能ステートメントとなります。 App::basePath(); も正当なステートメントであり、クラスの静的メソッドを呼び出しています。

さらに 2 つのポイントを追加します:

最初のポイント: Facade は、laravel フレームワークの特別な機能です。各 Facade は、コンテナー内のインスタンス オブジェクトに関連付けられます。Facade を直接渡すことができます。クラスの静的メソッド呼び出しは、関連付けられたインスタンス オブジェクトのメソッドを呼び出すために使用されます。たとえば、App::basePath() を呼び出すときの App のファサードは、実際には app()->basePath() と同等です。

この基礎となるメカニズムは、PHP 言語の特性にも依存します。各 Facade に静的メンバーを設定し、それをサービスのインスタンス オブジェクトに関連付ける必要があります。Facade クラスの静的メソッドを呼び出すとき、呼び出されたメソッド名を解析し、関連付けられたサービス インスタンスの同じ名前のメソッドを呼び出し、最後に結果を返します。

Facade がどのような役割を果たし得るのかを理解するだけで十分だと思います。実装の詳細を理解するために最下層を掘り下げる必要はありません。結局のところ、実際の開発では、Facade は使用されません。 laravelフレームワークの使用には全く影響しません。また、実際のコーディングでは、Facade のカスタマイズが非常に簡単で、laravel でカプセル化された Facade 基本クラスを継承するだけです:

<?php
namespace ThirdProviders\CasServer\Facades;
use Illuminate\Support\Facades\Facade;
use ThirdProviders\CasServer\CasServerManager;
class CasServer extends Facade
{
    protected static function getFacadeAccessor()
    {
        return CasServerManager::class;
    }
}
ログイン後にコピー

Facade 基本クラスの getFacadeAccessor メソッドを実装すると、laravel フレームワークが何を認識するかがわかります。この Facade クラスは、どのサービス インスタンスが関連付けられているかのようになる必要があります。実際、この getFacadeAccess メソッドによって返される名前は、後で紹介するサービス バインディング名です。 laravelコンテナでは、サービスインスタンスには固定のバインド名があり、この名前を通じてインスタンスを見つけることができます。では、なぜ Facade クラスはサービス バインディング名を返すだけでよいのでしょうか。

App Facade クラスのコードを見てみましょう:

<?php
namespace Illuminate\Support\Facades;
/**
 * @see \Illuminate\Foundation\Application
 */
class App extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return &#39;app&#39;;
    }
}
ログイン後にコピー

その getFacadeAccessor は文字列「app」を返します。これは、laravel コンテナーがそれ自体をバインドするために使用する名前です。

2 番目のポイント: 前のポイントの App Facade のソース コードから、App Facade の完全なクラス名が実際には Illuminate\Support\Facades\App であることがわかります。コード内で直接使用できますか? アプリにはショート ネームでアクセスできます:

<?php
Route::get(&#39;/&#39;, function () {
    dd(App::basePath());
    return &#39;&#39;;
});
ログイン後にコピー
ログイン後にコピー

上記のコードでは、Illuminate\Support\Facades\App を使用する方法や完全修飾方法を使用していないことがわかります。実際、App は Illuminate\Support\Facades\App と完全に同等ですが、App は Illuminate\Support\Facades\App よりもはるかに短く、使用する必要がないため、使いやすい点が異なります。これは、laravel コンテナーで設定されたエイリアスに関連しています。config/app.php の

には、いくつかのタイプのエイリアスの設定に特に使用されるエイリアスのセクションがあります:

&#39;aliases&#39; => [
    &#39;App&#39; => Illuminate\Support\Facades\App::class,
    &#39;Artisan&#39; => Illuminate\Support\Facades\Artisan::class,
    &#39;Auth&#39; => Illuminate\Support\Facades\Auth::class,
    &#39;Blade&#39; => Illuminate\Support\Facades\Blade::class,
    &#39;Bus&#39; => Illuminate\Support\Facades\Bus::class,
    &#39;Cache&#39; => Illuminate\Support\Facades\Cache::class,
    &#39;Config&#39; => Illuminate\Support\Facades\Config::class,
    &#39;Cookie&#39; => Illuminate\Support\Facades\Cookie::class,
    &#39;Crypt&#39; => Illuminate\Support\Facades\Crypt::class,
    &#39;DB&#39; => Illuminate\Support\Facades\DB::class,
    &#39;Eloquent&#39; => Illuminate\Database\Eloquent\Model::class,
    &#39;Event&#39; => Illuminate\Support\Facades\Event::class,
    &#39;File&#39; => Illuminate\Support\Facades\File::class,
    &#39;Gate&#39; => Illuminate\Support\Facades\Gate::class,
    &#39;Hash&#39; => Illuminate\Support\Facades\Hash::class,
    &#39;Lang&#39; => Illuminate\Support\Facades\Lang::class,
    &#39;Log&#39; => Illuminate\Support\Facades\Log::class,
    &#39;Mail&#39; => Illuminate\Support\Facades\Mail::class,
    &#39;Notification&#39; => Illuminate\Support\Facades\Notification::class,
    &#39;Password&#39; => Illuminate\Support\Facades\Password::class,
    &#39;Queue&#39; => Illuminate\Support\Facades\Queue::class,
    &#39;Redirect&#39; => Illuminate\Support\Facades\Redirect::class,
    &#39;Redis&#39; => Illuminate\Support\Facades\Redis::class,
    &#39;Request&#39; => Illuminate\Support\Facades\Request::class,
    &#39;Response&#39; => Illuminate\Support\Facades\Response::class,
    &#39;Route&#39; => Illuminate\Support\Facades\Route::class,
    &#39;Schema&#39; => Illuminate\Support\Facades\Schema::class,
    &#39;Session&#39; => Illuminate\Support\Facades\Session::class,
    &#39;Storage&#39; => Illuminate\Support\Facades\Storage::class,
    &#39;URL&#39; => Illuminate\Support\Facades\URL::class,
    &#39;Validator&#39; => Illuminate\Support\Facades\Validator::class,
    &#39;View&#39; => Illuminate\Support\Facades\View::class
],
ログイン後にコピー

その後、リクエストは次のようになります。 laravelフレームワークで処理される プロセス中に、これらのエイリアスはIlluminate\Foundation\Bootstrap\RegisterFacadesクラスを通じてグローバル環境に登録されます:

<?php
namespace Illuminate\Foundation\Bootstrap;
use Illuminate\Support\Facades\Facade;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Contracts\Foundation\Application;
class RegisterFacades
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        Facade::clearResolvedInstances();
        Facade::setFacadeApplication($app);
        AliasLoader::getInstance($app->make(&#39;config&#39;)->get(&#39;app.aliases&#39;, []))->register();
    }
}
ログイン後にコピー
したがって、完全な型名の代わりにエイリアスを直接使用して実行できます。同じアクセス機能です。長い名前のクラスを自分で作成し、コード内で頻繁に使用されている場合は、それらを config/app.php エイリアスで構成することも検討できます。そうすれば、laravel がそれらを登録します。

3) laravel コンテナインスタンスを取得するもう 1 つの方法は、サービスプロバイダーで $this->app

を直接使用することです。サービスプロバイダーについては後で紹介しますが、紹介したばかりです。今。サービスプロバイダークラスはlaravelコンテナーによってインスタンス化されるため、これらのクラスはIlluminate\Support\ServiceProviderを継承し、サービスプロバイダーのインスタンス化時にインスタンス属性$app

コード内でコンテナインスタンスを取得する(Laravel)

laravelを定義します。 、laravelコンテナインスタンスが$appに注入されます。したがって、サービスプロバイダーでは、app() 関数や App Facade を使用せずに、$this->$app を通じて常に laravel コンテナインスタンスにアクセスできます。

laravel の技術記事をさらに詳しく知りたい場合は、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)

Laravelで電子メールの送信が失敗したときに返品コードを取得する方法は? Laravelで電子メールの送信が失敗したときに返品コードを取得する方法は? Apr 01, 2025 pm 02:45 PM

Laravelの電子メールの送信が失敗したときに戻りコードを取得する方法。 Laravelを使用してアプリケーションを開発する場合、検証コードを送信する必要がある状況に遭遇することがよくあります。そして実際には...

Laravelスケジュールタスクは実行されません:スケジュール:実行コマンドの後にタスクが実行されていない場合はどうすればよいですか? Laravelスケジュールタスクは実行されません:スケジュール:実行コマンドの後にタスクが実行されていない場合はどうすればよいですか? Mar 31, 2025 pm 11:24 PM

LaravelスケジュールタスクRAN RANSPONSIVEトラブルシューティングRALAVELのスケジュールタスクスケジューリングを使用すると、多くの開発者がこの問題に遭遇します。スケジュール:実行...

Laravelでは、検証コードが電子メールで送信できない状況に対処する方法は? Laravelでは、検証コードが電子メールで送信できない状況に対処する方法は? Mar 31, 2025 pm 11:48 PM

Laravelの電子メールの検証コードの送信の障害を処理する方法は、Laravelを使用することです...

DCAT管理者にデータを追加するためにクリックのカスタムテーブル関数を実装する方法は? DCAT管理者にデータを追加するためにクリックのカスタムテーブル関数を実装する方法は? Apr 01, 2025 am 07:09 AM

DCATを使用するときにDCATADMIN(Laravel-Admin)にデータを追加するためにカスタムクリックのテーブル関数を実装する方法...

Laravel Redis接続共有:選択方法が他の接続に影響するのはなぜですか? Laravel Redis接続共有:選択方法が他の接続に影響するのはなぜですか? Apr 01, 2025 am 07:45 AM

Laravel FrameworkでRedis接続の共有の影響とLaravelフレームワークとRedisを使用する際のメソッドを選択すると、開発者は問題に遭遇する可能性があります。

Laravel Multi-Tenant Extension Stancl/Tenancy:テナントデータベース接続のホストアドレスをカスタマイズする方法は? Laravel Multi-Tenant Extension Stancl/Tenancy:テナントデータベース接続のホストアドレスをカスタマイズする方法は? Apr 01, 2025 am 09:09 AM

Laravel Multi-Tenant拡張機能パッケージStancl/Tenancyのカスタムテナントデータベース接続Laravel Multi-Tenant ExtensionパッケージStancl/Tenancyを使用したマルチテナントアプリケーションを構築する際の...

バングラ部分モデル検索のlaravelEloquent orm) バングラ部分モデル検索のlaravelEloquent orm) Apr 08, 2025 pm 02:06 PM

LaravelEloquentモデルの検索:データベースデータを簡単に取得するEloquentormは、データベースを操作するための簡潔で理解しやすい方法を提供します。この記事では、さまざまな雄弁なモデル検索手法を詳細に紹介して、データベースからのデータを効率的に取得するのに役立ちます。 1.すべてのレコードを取得します。 ALL()メソッドを使用して、データベーステーブルですべてのレコードを取得します:useapp \ models \ post; $ post = post :: all();これにより、コレクションが返されます。 Foreach Loopまたはその他の収集方法を使用してデータにアクセスできます。

Laravelの地理空間:インタラクティブマップと大量のデータの最適化 Laravelの地理空間:インタラクティブマップと大量のデータの最適化 Apr 08, 2025 pm 12:24 PM

700万のレコードを効率的に処理し、地理空間技術を使用したインタラクティブマップを作成します。この記事では、LaravelとMySQLを使用して700万を超えるレコードを効率的に処理し、それらをインタラクティブなマップの視覚化に変換する方法について説明します。最初の課題プロジェクトの要件:MySQLデータベースに700万のレコードを使用して貴重な洞察を抽出します。多くの人は最初に言語をプログラミングすることを検討しますが、データベース自体を無視します。ニーズを満たすことができますか?データ移行または構造調​​整は必要ですか? MySQLはこのような大きなデータ負荷に耐えることができますか?予備分析:キーフィルターとプロパティを特定する必要があります。分析後、ソリューションに関連している属性はわずかであることがわかりました。フィルターの実現可能性を確認し、検索を最適化するためにいくつかの制限を設定しました。都市に基づくマップ検索

See all articles