Suntikan bekas dan pergantungan
Suntikan bekas dan kebergantungan (bekas)
Suntikan kebergantungan dilaksanakan melalui bekas, yang secara automatik boleh memperkenalkan kelas yang dirujuk dan secara automatik memuatkan objek bergantung kepada kelas tersebut
Dependency Ia merujuk secara automatik suntikan kebergantungan pada kelas melalui pembina:
<?php
namespace app\index\controller;
use app\index\model\User;
class Index
{
protected $user;
// 通过依赖注入方式,实现User实例的自动注入到当前对象中
public function __construct(User $user)
{
$this->user = $user;
}
public function hello()
{
return 'Hello,' . $this->user->name . '!';
}
}
Suntikan ketergantungan menyokong berbilang parameter objek dan tiada kaitan dengan pesanan.
Mengikat
Kelas yang disuntik kebergantungan diuruskan secara seragam oleh bekas, dan dalam kebanyakan kes diikat secara automatik dan disegerakan. Walau bagaimanapun, anda boleh mengikat kelas secara manual ke bekas pada bila-bila masa (biasanya dalam kaedah daftar kelas perkhidmatan), dan berbilang kaedah mengikat disokong.
Ikat pengecam kelas
Anda boleh mengikat pengecam (unik) ke perpustakaan kelas sedia ada untuk panggilan pantas.
// 绑定类库标识
$this->app->bind('cache', 'think\Cache');
Atau gunakan fungsi pembantu
// 绑定类库标识
bind('cache', 'think\Cache');
untuk menentukan sendiri pengecam kelas terikat (selagi tiada konflik).
bind closure
Anda boleh mengikat penutupan ke container
bind('sayHello', function ($name) {
return 'hello,' . $name;
});
e
bind contoh anda juga boleh mengikat secara langsung satu contoh classrreeee
bind ke pelaksanaan antara muka
untuk ketergantungan suntikan menggunakan kelas antara muka, kita perlu memberitahu sistem kelas pelaksanaan antara muka tertentu untuk digunakan untuk suntikan Penggunaan ini boleh mengikat kelas tertentu ke antara muka
$cache = new think\Cache;
// 绑定类实例
bind('cache', $cache);
Gunakan antara muka sebagai jenis suntikan pergantungan// 绑定think\LoggerInterface接口实现到think\Log
bind('think\LoggerInterface','think\Log');
Pengikat kumpulan
.
Dalam proses pembangunan aplikasi sebenar, pengikatan manual tidak diperlukan Kami hanya perlu mentakrifkan fail provider.php di bawah direktori aplikasi (mengembalikan tatasusunan), dan sistem akan secara automatik mengikat perpustakaan kelas ke bekas dalam kelompok.
<?php
namespace app\index\controller;
use think\LoggerInterface;
class Index
{
public function hello(LoggerInterface $log)
{
$log->record('hello,world!');
}
}
Pengecam pengikat sensitif huruf besar/kecil apabila dipanggil Sistem ini mempunyai pengikatan terbina dalam perpustakaan kelas biasa teras, jadi tidak perlu mengikatnya berulang kali Pustaka kelas terbina dalam sistem yang terikat pada bekas perpustakaan kelas sistem
thinkConfig
config
thinkCookie cookie | | thinkConsole
console | thinkDb | db
| thinkDebug | debug
| |
| |
| thinkEvent |
event | thinkH ttp |
http | thinkLang |
lang | thinkLog |
log | thinkMiddleware |
middleware | thinkRequest | thinkRequest
serespon | |
thinkFile systemfilesystem | |
thinkRoute laluan | |
thinkSession session | |
thinkValidatevalidate | |
thinkView | |
Menghuraikan
Gunakan fungsi pembantu apl untuk melaksanakan panggilan penghuraian kelas dalam bekas Untuk pengecam kelas terikat, ia akan disegerakan secara automatik dan pantas
return [
'route' => \think\Route::class,
'session' => \think\Session::class,
'url' => \think\Url::class,
];
Panggilan penyegerakan dengan parameter
$cache = app('cache');
juga Boleh dihuraikan. terus
$cache = app('cache',['file']);
Pengecam panggilan dan pengikatan mestilah konsisten (termasuk huruf besar dan kecil)
Kelas yang telah dipanggil dalam bekas akan menggunakan singleton secara automatik, melainkan anda menggunakan kaedah berikut untuk memaksa penginstitian semula.
$arrayItem = app('org\utils\ArrayItem');
Panggilan berobjektif
Gunakan fungsi pembantu aplikasi untuk mendapatkan contoh objek dalam bekas (menyokong suntikan kebergantungan).
// 每次调用都会重新实例化
$cache = app('cache', [], true);
Maksudnya, anda boleh menggunakan kaedah app() di mana-mana sahaja untuk memanggil mana-mana kelas dalam bekas, tetapi dalam kebanyakan kes, kami mengesyorkan menggunakan suntikan kebergantungan.
$app = app();
// 判断对象实例是否存在
isset($app->cache);
// 注册容器对象实例
$app->cache = think\Cache::class;
// 获取容器中的对象实例
$cache = $app->cache;
Suntikan automatik
Bekas digunakan terutamanya untuk suntikan ketergantungan akan terlebih dahulu memeriksa sama ada contoh objek didaftarkan dalam bekas, ia akan disuntik secara automatik.
Kita boleh memberikan Laluan mengikat contoh objek model
// 调用配置类
app()->config->get('app_name');
// 调用session类
app()->session->get('user_name');
dan kemudian secara automatik menyuntik model Pengguna dalam kaedah operasi
Route::get('user/:id','index/Index/hello')
->model('\app\index\model\User');
Instalasi tersuai
Instantiasi objek dalam bekas menyokong penyesuaian dan boleh ditambah kepada penyesuaian objek yang anda perlukan suntikan kebergantungan __buat definisi kaedah, contohnya:
Jika anda mahu kelas model Pengguna menggunakan instantiasi tersuai semasa suntikan kebergantungan, anda boleh menggunakan kaedah berikut.
<?php
namespace app\index\controller;
use app\index\model\User;
class Index
{
public function hello(User $user)
{
return 'Hello,'.$user->name;
}
}
Mekanisme panggil balik objek kontena
Selepas objek dalam bekas dibuat instantiated, ia menyokong mekanisme panggil balik, yang boleh digunakan untuk melaksanakan fungsi berkaitan seperti fungsi anotasi.
Anda boleh mendaftarkan panggilan balik global melalui kaedah penyelesaian
<?php
namespace app\index\model;
use think\Model;
use think\db\Query;
class User extends Model
{
public static function __make(Query $query)
{
return (new self())->setQuery($query);
}
}
Kaedah panggil balik menyokong dua parameter, parameter pertama ialah contoh objek kontena, dan parameter kedua ialah tika bekas itu sendiri.
Atau secara berasingan daftar panggilan balik untuk objek kontena tertentu
Container::getInstance()->resolving(function($instance,$container) {
// ...
});