検索

ホームページ  >  に質問  >  本文

php - laravel如何通过容器获取自定义类并且传递参数?

现在公司业务需要在C层的基础上添加一个services层,代替controller进行一部分业务处理.
所以我在app目录下新建了一个Services文件夹,然后在c层控制器里调用:
$services = App::make('要调用的service的完整类名');
这样虽然可以获取到services文件夹里指定的类了,但是如果这个类的构造函数需要参数则完全无法传递.
我尝试过这样写:
controller层:

public function test(){
    $services = \App::make('App\Services\Servicetest',[1,2]);
    $services->test();
}

在app/services目录下的Servicetest.php里这样写:

public function __construct($a, $b){
    echo $a;
    echo $b;
    echo 111;
    exit;
}
public function test(){
    echo '成功';
}

很奇怪,在通过make方法获取实例化对象$services的时候,没有触发他的__construct()构造函数,没有输出$a,$b和111,但是$services->test()却成功执行了,输出了'成功'.
如果是这样,请问各位大神,如果我希望在controller中引入和执行services文件夹下的类来分担一部分业务逻辑的实现,我要怎么引入呢?我觉得App::make()这个方法是很好的,不需要手动require,直接获取到了实例化对象,可是为什么成功得到了实例化对象但是却没有执行构造函数输出111呢?我到底怎么才能在c层通过App::make()来传入参数给services层的构造函数呢?
期待大家的帮助,谢谢各位大神了.

滿天的星座滿天的星座2738日前717

全員に返信(3)返信します

  • 淡淡烟草味

    淡淡烟草味2017-05-16 13:01:28

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

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

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

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

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

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

    返事
    0
  • 黄舟

    黄舟2017-05-16 13:01:28

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

    返事
    0
  • 怪我咯

    怪我咯2017-05-16 13:01:28

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

    返事
    0
  • キャンセル返事