php - laravel如何通过容器获取自定义类并且传递参数?
滿天的星座
滿天的星座 2017-05-16 12:59:28
0
3
712

现在公司业务需要在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层的构造函数呢?
期待大家的帮助,谢谢各位大神了.

滿天的星座
滿天的星座

membalas semua(3)
淡淡烟草味

Saya tidak tahu bagaimana anda berjaya Sekurang-kurangnya saya mengikuti pendekatan anda dan mengujinya secara tempatan, tetapi ia tidak berjaya (Laravel saya ialah versi 5.4).

Saya juga melihat kod yang berkaitan App::make('className') Pertama sekali, kaedah ini tidak menyokong menghantar parameter kepada kaedah pembina. App::make('className')相关的代码, 首先该方法不支持为构造方法传参数。

如果需要向构造方法传参数,请使用App::makeWith('className', [param1, param2, ...])

其代码实现是利用反射,检查构造函数是否需要传参数:
1,如果不需要传参数,则直接实例化
2,如果需要传参数,且参数为可实例化的类,则尝试实例化该类(循环进入App::makeApp::makeWith()
Jika anda perlu menghantar parameter kepada pembina, sila gunakan App::makeWith('className', [param1, param2, ...]).
Pelaksanaan kod menggunakan pantulan untuk menyemak sama ada pembina perlu lulus parameter: 1 Jika tiada parameter diperlukan, instantiate terus 2 Jika parameter perlu dihantar dan parameter adalah kelas boleh segera, cuba buat instantiate Kelas ini (gelung ke dalam logik App::make atau App::makeWith()), dan lulus kelas instantiated sebagai parameter

3, jika perlu Jika parameter diluluskan, dan parameter ialah parameter yang tidak boleh dijadikan instantiated (contohnya, pembolehubah tanpa pembayang jenis, pembayang jenis ialah integer, rentetan, titik terapung, dsb.), kemudian semak lagi sama ada terdapat parameter lalai dan jika terdapat parameter lalai, lulus parameter lalai Pergi ke pembina, jika tiada parameter lalai, pengecualian akan dilemparkan, seperti yang ditunjukkan di bawah: 🎜🎜🎜🎜🎜
黄舟

Lupakan tentang kelas statik secara langsung Saya kemudiannya mendapati bahawa ia perlu disegerakan setiap kali Walaupun instantiasi automatik disuntik ke dalam pengawal, memanggilnya di tempat lain perlu dilakukan secara manual, jadi semuanya dikelaskan oleh saya. . . . .

刘奇

Tidak dapatkah suntikan pergantungan menyelesaikannya

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!