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.
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);
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 } }
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(); } }
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); }
$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) ); }
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; }
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); } }
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!

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于单点登录的相关问题,单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于Laravel的生命周期相关问题,Laravel 的生命周期从public\index.php开始,从public\index.php结束,希望对大家有帮助。

在laravel中,guard是一个用于用户认证的插件;guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套自己的认证体系。

laravel中asset()方法的用法:1、用于引入静态文件,语法为“src="{{asset(‘需要引入的文件路径’)}}"”;2、用于给当前请求的scheme前端资源生成一个url,语法为“$url = asset('前端资源')”。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于使用中间件记录用户请求日志的相关问题,包括了创建中间件、注册中间件、记录用户访问等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于中间件的相关问题,包括了什么是中间件、自定义中间件等等,中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制,下面一起来看一下,希望对大家有帮助。

在laravel中,fill方法是一个给Eloquent实例赋值属性的方法,该方法可以理解为用于过滤前端传输过来的与模型中对应的多余字段;当调用该方法时,会先去检测当前Model的状态,根据fillable数组的设置,Model会处于不同的状态。

laravel路由文件在“routes”目录里。Laravel中所有的路由文件定义在routes目录下,它里面的内容会自动被框架加载;该目录下默认有四个路由文件用于给不同的入口使用:web.php、api.php、console.php等。


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

VSCode Windows 64-bit Muat Turun
Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

SublimeText3 Linux versi baharu
SublimeText3 Linux versi terkini

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

EditPlus versi Cina retak
Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa
