Rumah > rangka kerja php > Laravel > teks badan

Apakah prinsip pelaksanaan suntikan pergantungan dalam Laravel?

WBOY
Lepaskan: 2022-02-18 11:06:44
asal
6120 orang telah melayarinya

Dalam Laravel, prinsip pelaksanaan suntikan kebergantungan ialah menggunakan refleksi kaedah kelas untuk mendapatkan jenis parameter, kemudian gunakan bekas untuk membina contoh, dan kemudian gunakan fungsi panggil balik untuk memanggil objek yang disuntik pembina tidak boleh mempunyai parameter, jika tidak ralat akan dilaporkan , Suntikan Ketergantungan mesti dimulakan oleh kelas Router, jika tidak, suntikan tidak boleh dicapai secara langsung menggunakan kaedah baharu.

Apakah prinsip pelaksanaan suntikan pergantungan dalam Laravel?

Persekitaran pengendalian artikel ini: sistem Windows 10, Laravel versi 6, komputer Dell G3.

Apakah prinsip pelaksanaan suntikan kebergantungan Laravel?

Bekas laravel mengandungi penyongsangan kawalan dan suntikan kebergantungan Untuk menggunakannya, hanya ikat objek dahulu, dan anda boleh terus menggunakan make to mendapatkannya apabila diperlukan.

Untuk analisis khusus, sila rujuk: http://laravelacademy.org/post/769.html

Biasanya panggilan kami adalah seperti berikut.

$config = $container->make('config');
$connection = new Connection($this->config);
Salin selepas log masuk

Lebih mudah untuk difahami Kelebihan ini ialah anda tidak perlu memperbaharui kejadian secara langsung berbilang tempat.

Tetapi apakah kaitannya dengan suntikan kebergantungan sebenar tidak memerlukan sebarang nilai parameter ke kaedah tersebut Anda hanya perlu menentukan jenis parameter kaedah dan kod akan mencari secara automatik perhubungan dan secara automatik menyuntik pergantungan.

Ciri ini boleh dicerminkan dalam Pengawal laravel, Kerja, dsb., seperti berikut:

class TestController extends Controller
{
    public function anyConsole(Request $request, Auth $input)
    {
        //todo
    }
}
Salin selepas log masuk

Mari kita lihat cara ia melaksanakan suntikan pergantungan automatik:

Dengan index.PHP memanggil Kernel, memanggil melalui saluran paip Kernel berbilang lapisan, dan kemudian ke Router, dipanggil melalui saluran paip middleware berbilang lapisan. Akhirnya terletak di baris 124

Illuminate/Routing/Route.php.

public function run(Request $request)
{
    $this->container = $this->container ?: new Container;
    try {
        if (! is_string($this->action['uses'])) {
            return $this->runCallable($request);
        }
        if ($this->customDispatcherIsBound()) {
            return $this->runWithCustomDispatcher($request);
        }
        return $this->runController($request);
    } catch (HttpResponseException $e) {
        return $e->getResponse();
    }
}
Salin selepas log masuk

Tentukan sama ada $this->action['uses'] (baris format seperti: AppHttpControllerDatacenterRealTimeController@anyConsole) ialah rentetan dan $this->customDispatcherIsBound menentukan sama ada laluan yang ditentukan pengguna terikat. Kemudian lompat ke $this->runController($request).

protected function runController(Request $request)
{
    list($class, $method) = explode('@', $this->action['uses']);
    $parameters = $this->resolveClassMethodDependencies(
        $this->parametersWithoutNulls(), $class, $method
    );
    if (! method_exists($instance = $this->container->make($class), $method)) {
        throw new NotFoundHttpException;
    }
    return call_user_func_array([$instance, $method], $parameters);
}
Salin selepas log masuk

$this->resolveClassMethodDependencies Kaedah ini adalah kaedah yang kami cari sebaik sahaja kami melihat nama. $this->parametersWithoutNulls() adalah untuk menapis aksara null $class dan $method adalah seperti berikut: AppHttpControllerDatacenterRealTimeController dan anyConsole masing-masing.

protected function resolveClassMethodDependencies(array $parameters, $instance, $method)
{
    if (! method_exists($instance, $method)) {
        return $parameters;
    }
    return $this->resolveMethodDependencies(
        $parameters, new ReflectionMethod($instance, $method)
    );
}
Salin selepas log masuk

ReflectionMethod($instance, $method) ialah objek pantulan yang mendapat kaedah kelas, lihat dokumen: http://www.php.net/manual/zh/class.reflectionmethod. php

Yang berikut melompat ke baris 54 Illuminate/Routing/RouteDependencyResolverTrait.php.

public function resolveMethodDependencies(array $parameters, ReflectionFunctionAbstract $reflector)
{
    $originalParameters = $parameters;
    foreach ($reflector->getParameters() as $key => $parameter) {
        $instance = $this->transformDependency(
            $parameter, $parameters, $originalParameters
        );
        if (! is_null($instance)) {
            $this->spliceIntoParameters($parameters, $key, $instance);
        }
    }
    return $parameters;
}
Salin selepas log masuk

Dapatkan tatasusunan parameter kelas melalui kaedah kelas pantulan, kemudian lintasinya dan hantar ke kaedah $this->transformDependency. Jika contoh tidak dapat diperoleh, panggil $this->spliceIntoParameters untuk mengosongkan parameter.

protected function transformDependency(ReflectionParameter $parameter, $parameters, $originalParameters)
{
    $class = $parameter->getClass();
    if ($class && ! $this->alreadyInParameters($class->name, $parameters)) {
        return $this->container->make($class->name);
    }
}
Salin selepas log masuk

Akhirnya nampak bayang bekas Ya, objek terakhir dibawa keluar melalui kaedah membuat bekas. Pada ketika ini, parameter dibina, dan akhirnya akan dipanggil semula oleh call_user_func_array kaedah runController.

Ringkasan:

Prinsip suntikan kebergantungan sebenarnya adalah menggunakan refleksi kaedah kelas untuk mendapatkan jenis parameter, dan kemudian gunakan bekas untuk membina contoh. Kemudian gunakan fungsi panggil balik untuk memanggilnya.

Pembina objek yang disuntik tidak boleh mempunyai parameter. Jika tidak, ralat akan dilaporkan. Hilang argumen 1

Suntikan kebergantungan adalah baik, tetapi ia mesti digunakan oleh kelas Router, jika tidak, suntikan tidak boleh dicapai secara langsung menggunakan kaedah baharu. Jadi inilah sebabnya hanya kelas Pengawal dan Pekerjaan boleh menggunakan ciri ini.

[Cadangan berkaitan: tutorial video laravel]

Atas ialah kandungan terperinci Apakah prinsip pelaksanaan suntikan pergantungan dalam Laravel?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
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!