cari
Rumahrangka kerja phpLaravelApakah suntikan pergantungan laravel

Apakah suntikan pergantungan laravel

Dec 22, 2021 am 11:32 AM
laravelsuntikan pergantungan

Istilah suntikan kebergantungan laravel ialah istilah yang dicadangkan oleh Martin Fowler Ia adalah tingkah laku menyuntik komponen ke dalam aplikasi Suntikan Ketergantungan ialah elemen utama dalam seni bina tangkas. dilindungi $sambungan...}".

Apakah suntikan pergantungan laravel

Apakah suntikan pergantungan laravel?

Penjelasan terperinci tentang suntikan pergantungan dan IoC dalam Laravel:

Sebagai pembangun, kami Sentiasa cuba mencari cara baharu untuk menulis kod yang direka bentuk dengan baik dan teguh dengan menggunakan corak reka bentuk dan mencuba rangka kerja teguh baharu. Dalam artikel ini, kami akan meneroka corak reka bentuk Suntikan Ketergantungan dengan komponen IoC Laravel dan melihat cara ia boleh menambah baik reka bentuk kami.

Suntikan Kebergantungan

Istilah suntikan kebergantungan ialah istilah yang dicadangkan oleh Martin Fowler, iaitu tindakan menyuntik komponen ke dalam aplikasi. Seperti kata Ward Cunningham:

Suntikan kebergantungan ialah elemen utama dalam seni bina tangkas.

Mari kita lihat contoh:

Jika anda ingin menguji atau mengekalkan kelas ini, anda perlu mengakses contoh pangkalan data untuk melaksanakan beberapa pertanyaan. Untuk mengelak daripada melakukan ini, anda boleh
class UserProvider{
    protected $connection;

    public function __construct(){
        $this->connection = new Connection;
    }

    public function retrieveByCredentials( array $credentials ){
        $user = $this->connection
                        ->where( 'email', $credentials['email'])
                        ->where( 'password', $credentials['password'])
                        ->first();

        return $user;
    }
}
decouple

kelas ini daripada kelas lain, anda mempunyai satu daripada tiga pilihan untuk menyuntik kelas tanpa menggunakannya secara langsung. ConnectionApabila menyuntik komponen ke dalam kelas, anda boleh menggunakan salah satu daripada tiga pilihan berikut:

Suntikan kaedah pembina

Suntikan kaedah penetap
class UserProvider{
    protected $connection;

    public function __construct( Connection $con ){
        $this->connection = $con;
    }
    ...

Begitu juga, Kami juga boleh menggunakan kaedah Setter untuk menyuntik kebergantungan:

Suntikan antara muka
class UserProvider{
    protected $connection;
    public function __construct(){
        ...
    }

    public function setConnection( Connection $con ){
        $this->connection = $con;
    }
    ...

Apabila kelas melaksanakan antara muka kami, kami mentakrifkan kaedah
interface ConnectionInjector{
    public function injectConnection( Connection $con );
}

class UserProvider implements ConnectionInjector{
    protected $connection;

    public function __construct(){
        ...
    }

    public function injectConnection( Connection $con ){
        $this->connection = $con;
    }
}
untuk menyelesaikan masalah hubungan pergantungan.

injectConnectionKelebihan

Kini apabila menguji kelas kami, kami boleh mengejek kelas bergantung dan melepasinya sebagai parameter. Setiap kelas mesti menumpukan pada tugas tertentu dan tidak seharusnya bimbang dengan menyelesaikan kebergantungan mereka. Dengan cara ini, anda akan mempunyai aplikasi yang lebih fokus dan boleh diselenggara.

Jika anda ingin mengetahui lebih lanjut tentang DI, Alejandro Gervassio telah membincangkannya secara meluas dan pakar dalam siri artikel ini, jadi pastikan anda membacanya. Jadi, apakah IoC? IoC (Penyongsangan Kawalan) tidak memerlukan penggunaan suntikan kebergantungan, tetapi ia boleh membantu anda mengurus kebergantungan dengan berkesan.

Penyongsangan Kawalan

Ioc ialah komponen mudah yang memudahkan untuk menyelesaikan kebergantungan. Anda boleh menerangkan objek sebagai bekas, dan setiap kali kelas diselesaikan, kebergantungan disuntik secara automatik.

Laravel Ioc

Laravel Ioc adalah istimewa sedikit dalam cara ia menyelesaikan kebergantungan apabila anda meminta objek:

Apakah suntikan pergantungan laravelKami menggunakan A contoh mudah akan memperbaikinya dalam artikel ini. Kelas

bergantung pada
, jadi kod kami mungkin kelihatan seperti ini: SimpleAuthFileSessionStorage

Ini ialah pendekatan klasik, mari mulakan dengan menggunakan suntikan pembina.
class FileSessionStorage{
  public function __construct(){
    session_start();
  }

  public function get( $key ){
    return $_SESSION[$key];
  }

  public function set( $key, $value ){
    $_SESSION[$key] = $value;
  }
}

class SimpleAuth{
  protected $session;

  public function __construct(){
    $this->session = new FileSessionStorage;
  }
}

//创建一个 SimpleAuth
$auth = new SimpleAuth();

Sekarang kita mencipta objek:
class SimpleAuth{
  protected $session;

  public function __construct( FileSessionStorage $session ){
    $this->session = $session;
  }
}

Sekarang saya mahu menggunakan Laravel Ioc untuk menguruskan semua ini.
$auth = new SimpleAuth( new FileSessionStorage() );

Oleh kerana kelas

mewarisi daripada kelas

, anda boleh mengakses bekas melalui fasad Application. Parameter pertama kaedah ContainerApp

App::bind( 'FileSessionStorage', function(){
    return new FileSessionStorage;
});
ialah ID unik yang akan diikat pada bekas Parameter kedua ialah fungsi panggil balik yang dilaksanakan apabila kelas

dilaksanakan juga lulus rentetan A yang mewakili nama kelas, seperti yang ditunjukkan di bawah. bindFileSessionStorage

Nota:

Jika anda melihat pada pakej Laravel, anda akan melihat bahawa pengikatan kadangkala dikumpulkan, seperti ( , …). viewview.finder Dengan mengandaikan kita menukar storan sesi kepada storan Mysql, kelas kita sepatutnya kelihatan seperti:

Sekarang kita telah menukar kebergantungan, kita juga perlu menukar
class MysqlSessionStorage{

  public function __construct(){
    //...
  }

  public function get($key){
    // do something
  }

  public function set( $key, $value ){
    // do something
  }
}
pembina, dan ikat objek baru ke dalam bekas!

SimpleAuth

Modul peringkat tinggi tidak boleh bergantung pada modul peringkat rendah, kedua-duanya harus bergantung pada objek abstrak.
Abstraksi tidak boleh bergantung pada butiran, butiran harus bergantung pada abstrak.


Robert C. Martin

Kelas
kami seharusnya tidak mengambil berat tentang cara penyimpanan kami dilakukan, sebaliknya ia harus menumpukan pada penggunaan perkhidmatan tersebut.

SimpleAuth Oleh itu, kami boleh melaksanakan storan kami secara abstrak:

Dengan cara ini kami boleh melaksanakan dan meminta contoh antara muka
interface SessionStorage{
  public function get( $key );
  public function set( $key, $value );
}
:

class FileSessionStorage implements SessionStorage{

  public function __construct(){
    //...
  }

  public function get( $key ){
    //...
  }

  public function set( $key, $value ){
    //...
  }
}

class MysqlSessionStorage implements SessionStorage{

  public function __construct(){
    //...
  }

  public function get( $key ){
    //...
  }

  public function set( $key, $value ){
    //...
  }
}

class SimpleAuth{

  protected $session;

  public function __construct( SessionStorage $session ){
    $this->session = $session;
  }

}

如果我们使用 App::make('SimpleAuth') 通过容器解析 SimpleAuth
类,容器将会抛出 BindingResolutionException ,尝试从绑定解析类之后,返回到反射方法并解析所有依赖项。

Uncaught exception 'Illuminate\Container\BindingResolutionException' with message 'Target [SessionStorage] is not instantiable.'

容器正试图将接口实例化。我们可以为该接口做一个具体的绑定。

App:bind( 'SessionStorage', 'MysqlSessionStorage' );

现在每次我们尝试从容器解析该接口时,我们会得到一个 MysqlSessionStorage 实例。如果我们想要切换我们的存储服务,我们只要变更一下这个绑定。

Note: 如果你想要查看一个类是否已经在容器中被绑定,你可以使用 App::bound('ClassName') ,或者可以使用 App::bindIf('ClassName') 来注册一个还未被注册过的绑定。

Laravel Ioc 也提供 App::singleton('ClassName', 'resolver') 来处理单例的绑定。
你也可以使用 App::instance('ClassName', 'instance') 来创建单例的绑定。
如果容器不能解析依赖项就会抛出 ReflectionException ,但是我们可以使用 App::resolvingAny(Closure) 方法以回调函数的形式来解析任何指定的类型。

Note: 如果你为某个类型已经注册了一个解析方式 resolvingAny 方法仍然会被调用,但它会直接返回 bind 方法的返回值。

小贴士

  • 这些绑定写在哪儿:
    如果只是一个小型应用你可以写在一个全局的起始文件 global/start.php 中,但如果项目变得越来越庞大就有必要使用 Service Provider 。

  • 测试:
    当需要快速简易的测试可以考虑使用 php artisan tinker ,它十分强大,且能帮你提升你的 Laravel 测试流程。

  • Reflection API:
    PHP 的 Reflection API 是非常强大的,如果你想要深入 Laravel Ioc 你需要熟悉 Reflection API ,可以先看下这个 教程 来获得更多的信息。

相关推荐:最新的五个Laravel视频教程

Atas ialah kandungan terperinci Apakah suntikan pergantungan laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
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
Laravel (PHP) vs Python: Kes penggunaan dan aplikasi yang berbezaLaravel (PHP) vs Python: Kes penggunaan dan aplikasi yang berbezaApr 18, 2025 am 12:16 AM

Memilih Laravel atau Python bergantung kepada keperluan projek: 1) Jika anda perlu dengan cepat membangunkan aplikasi web dan menggunakan ORM dan sistem pengesahan, pilih Laravel; 2) Jika ia melibatkan analisis data, pembelajaran mesin atau pengkomputeran saintifik, pilih Python.

Laravel dan Python: Mencari alat yang betulLaravel dan Python: Mencari alat yang betulApr 18, 2025 am 12:14 AM

Laravel sesuai untuk membina aplikasi web dengan cepat, dan Python sesuai untuk projek yang memerlukan fleksibiliti dan fleksibiliti. 1) Laravel menyediakan ciri -ciri yang kaya seperti ORM dan Routing, sesuai untuk ekosistem PHP. 2) Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kuat, dan sesuai untuk bidang seperti pembangunan web dan sains data.

Laravel dan PHP: Membuat laman web dinamikLaravel dan PHP: Membuat laman web dinamikApr 18, 2025 am 12:12 AM

Gunakan Laravel dan PHP untuk membuat laman web dinamik dengan cekap dan menyeronokkan. 1) Laravel mengikuti seni bina MVC, dan enjin templat bilah memudahkan penulisan HTML. 2) Sistem penghalaan dan mekanisme pemprosesan permintaan membuat definisi URL dan pemprosesan input pengguna mudah. 3) Eloquentorm memudahkan operasi pangkalan data. 4) Penggunaan penghijrahan pangkalan data, operasi CRUD dan templat bilah ditunjukkan melalui contoh sistem blog. 5) Laravel menyediakan fungsi pengesahan dan kebenaran pengguna yang kuat. 6) Kemahiran penyahpepijatan termasuk menggunakan sistem pembalakan dan alat artisan. 7) Cadangan pengoptimuman prestasi termasuk pemuatan malas dan caching.

Laravel dan timbunan penuh: depan dan belakang bersamaLaravel dan timbunan penuh: depan dan belakang bersamaApr 18, 2025 am 12:07 AM

Laravel menyedari perkembangan stack penuh melalui enjin templat bilah, eloquentorm, alat artisan dan Laravelmix: 1. Blade memudahkan pembangunan front-end; 2. Eloquent memudahkan operasi pangkalan data; 3 Artisan meningkatkan kecekapan pembangunan; 4. Laravelmix menguruskan sumber hadapan.

Laravel: Rangka kerja untuk pembangunan web modenLaravel: Rangka kerja untuk pembangunan web modenApr 18, 2025 am 12:05 AM

Laravel adalah rangka kerja berasaskan PHP moden yang mengikuti model seni bina MVC, menyediakan alat dan fungsi yang kaya, dan memudahkan proses pembangunan web. 1) Ia mengandungi eloquentorm untuk interaksi pangkalan data, 2) antara muka baris arahan artisan untuk penjanaan kod cepat, 3) enjin templat bilah untuk pembangunan pandangan yang cekap, 4) sistem penghalaan yang kuat untuk menentukan struktur URL, 5) sistem pengesahan untuk pengurusan pengguna, 6)

Laravel (PHP) vs Python: Menimbang kebaikan dan keburukanLaravel (PHP) vs Python: Menimbang kebaikan dan keburukanApr 17, 2025 am 12:18 AM

Laravel sesuai untuk membina aplikasi web dengan cepat, sementara Python sesuai untuk pelbagai senario aplikasi yang lebih luas. 1. Laravel Menyediakan Eloquentorm, Enjin Template Blade dan Alat Artisan Untuk Memudahkan Pembangunan Web. 2. Python terkenal dengan jenis dinamiknya, perpustakaan standard yang kaya dan ekosistem pihak ketiga, dan sesuai untuk pembangunan web, sains data dan bidang lain.

Laravel vs Python: Membandingkan kerangka dan perpustakaanLaravel vs Python: Membandingkan kerangka dan perpustakaanApr 17, 2025 am 12:16 AM

Laravel dan Python masing-masing mempunyai kelebihan mereka sendiri: Laravel sesuai untuk membina aplikasi web yang kaya dengan ciri-ciri, dan Python berfungsi dengan baik dalam bidang sains data dan pengaturcaraan umum. 1. Laravel menyediakan enjin template eloquentorm dan bilah, sesuai untuk membina aplikasi web moden. 2. Python mempunyai perpustakaan standard yang kaya dan perpustakaan pihak ketiga, dan rangka kerja Django dan Flask memenuhi keperluan pembangunan yang berbeza.

Tujuan Laravel: Membina aplikasi web yang mantap dan eleganTujuan Laravel: Membina aplikasi web yang mantap dan eleganApr 17, 2025 am 12:13 AM

Laravel bernilai memilih kerana ia boleh menjadikan struktur kod jelas dan proses pembangunan lebih artistik. 1) Laravel didasarkan pada PHP, mengikuti seni bina MVC, dan memudahkan pembangunan web. 2) Fungsi terasnya seperti eloquentorm, alat artisan dan templat bilah meningkatkan keanggunan dan kekukuhan pembangunan. 3) Melalui penghalaan, pengawal, model dan pandangan, pemaju dapat membina aplikasi dengan cekap. 4) Fungsi lanjutan seperti giliran dan pemantauan acara meningkatkan prestasi aplikasi.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver Mac版

Dreamweaver Mac版

Alat pembangunan web visual

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.