php - laravelはどのようにコンテナ経由でカスタムクラスを取得し、パラメータを渡しますか?
滿天的星座
滿天的星座 2017-05-16 12:59:28
0
3
727

会社のビジネスでは、ビジネス処理の一部のコントローラーを置き換えるために、C レイヤーに基づいてサービス レイヤーを追加する必要があります。
そこで、アプリ ディレクトリに新しい Services フォルダーを作成し、C レイヤーを呼び出しました。レイヤーコントローラー:
$services = App::make('呼び出すサービスの完全なクラス名');
servicesフォルダ内に指定したクラスは取得できますが、このクラスのコンストラクタにパラメータが必要な場合は全く渡すことができません。
次のように書いてみました:
コントローラ層:

リーリー

app/services ディレクトリの Servicetest.php に次のように記述します。

リーリー

非常に奇妙ですが、インスタンス化されたオブジェクト $services が make メソッドを通じて取得されるとき、その __construct() コンストラクターはトリガーされず、$a、$b、および 111 は出力されませんが、$services->test()正常に実行され、「成功」と出力されました。
その場合、コントローラー内のサービスフォルダー内のクラスを導入して実行し、負荷を分散するかどうか教えてください。ビジネス ロジックの一部の実装を導入するにはどうすればよいですか? App::make() メソッドは、手動の require を必要とせず、インスタンス化されたオブジェクトを直接取得するのに非常に優れていると思います。しかし、インスタンス化されたオブジェクトが正常に取得されるのはなぜでしょうか。コンストラクターを実行すると 111 が出力されます。C 層の App::make() を介してサービス層のコンストラクターにパラメーターを渡すにはどうすればよいですか?
ご協力をお待ちしております。ありがとうございます。

滿天的星座
滿天的星座

全員に返信(3)
淡淡烟草味

どうやって成功したのかわかりませんが、少なくとも私はあなたのアプローチに従ってローカルでテストしましたが、失敗しました(私のLaravelはバージョン5.4です)。

関連するコードも調べました。まず、このメソッドはコンストラクターへのパラメーターの受け渡しをサポートしていません。 App::make('className')

コンストラクターにパラメータを渡す必要がある場合は、

を使用してください。 App::makeWith('className', [param1, param2, ...])

コード実装は、コンストラクターがパラメーターを渡す必要があるかどうかをチェックするためにリフレクションを使用します。

1. パラメーターが必要ない場合は、直接インスタンス化します。
2. パラメーターを渡す必要があり、パラメーターがインスタンス化可能なクラスである場合は、このクラスのインスタンス化を試みます (ループ)
のロジックに追加し、インスタンス化されたクラスをパラメーターとして App::makeApp::makeWith() に渡します。3. パラメーターを渡す必要があり、パラメーターがインスタンス化できないパラメーター (型ヒントのない変数など、型ヒントは整数) の場合は、文字列、浮動小数点など)、デフォルト パラメータがあるかどうかをさらに確認し、デフォルト パラメータが存在しない場合は、以下に示すように例外がスローされます。

いいねを押す +0
黄舟

静的クラスのことは忘れてください。後で、毎回インスタンス化する必要があることがわかりました。自動インスタンス化はコントローラーに挿入されますが、他の場所での呼び出しは手動で行う必要があるため、すべて静的クラス化されています。 。 。 。 。

いいねを押す +0
刘奇

依存性注入では解決できないのでしょうか?

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート