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 cookiethinkConsoleconsolethinkDbdbthinkDebugdebugeventhttplanglogmiddlewarethinkRequest sethinkFile systemthinkRoute thinkSessionthinkValidatethinkView

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) {
    // ...
});


thinkEvent
thinkH ttp
thinkLang
thinkLog
thinkMiddleware
thinkRequest
respon
filesystem
laluan
session
validate