Rumah >pembangunan bahagian belakang >tutorial php >Disko dengan corak reka bentuk: melihat suntikan ketergantungan segar

Disko dengan corak reka bentuk: melihat suntikan ketergantungan segar

Christopher Nolan
Christopher Nolanasal
2025-02-15 13:14:13597semak imbas

Disco with Design Patterns: A Fresh Look at Dependency Injection

mata teras

    Suntikan Ketergantungan (DI) membolehkan pengurusan ketergantungan yang fleksibel dengan memisahkan penciptaan dan penggunaan objek.
  • Suntikan Suntikan Ketergantungan Memudahkan pengurusan kebergantungan objek, terutamanya apabila bilangan kebergantungan adalah besar, ia dilaksanakan dengan mengautomasikan penciptaan objek dan konfigurasi.
  • Disco, sebuah kontena di anotasi, memudahkan konfigurasi dengan anotasi seperti
  • dan @Bean, dengan itu memudahkan persediaan perkhidmatan. @Configuration
  • Disco menyokong ciri -ciri canggih seperti instantiasi singleton, pemuatan tertunda, dan pengurusan skop sesi/permintaan untuk mengoptimumkan penggunaan sumber dan kitaran hayat perkhidmatan.
  • Integrasi Disco dengan komponen Symfony membantu mewujudkan rangka kerja berasaskan HTTP asas yang menunjukkan keserasian dan kepraktisan disko dalam pembangunan aplikasi web moden.
  • Artikel ini menunjukkan contoh praktikal menggunakan disko untuk melaksanakan corak DI, meletakkan asas bagi pemaju untuk membina aplikasi web yang cekap, berskala, dan mudah untuk dikekalkan.
Inti suntikan ketergantungan terletak pada kebolehgunaan semula kod. Ia adalah corak reka bentuk yang direka untuk meningkatkan kebolehgunaan semula kod lanjutan dengan memisahkan penciptaan objek/konfigurasi dari penggunaan.

Disco with Design Patterns: A Fresh Look at Dependency Injection Pertimbangkan kod berikut:

Seperti yang anda lihat, bukannya membuat objek PDO di dalam kelas, kami menciptanya di luar kelas dan lulus sebagai kebergantungan melalui pembina. Dengan cara ini, kita boleh menggunakan pemacu pilihan kita tanpa perlu menggunakan pemandu yang ditakrifkan di dalam kelas.
<code class="language-php">class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);</code>

Alejandro Gervasio dan Fabien Potencier kedua -duanya memberikan penjelasan yang indah tentang konsep DI.

Walau bagaimanapun, corak ini mempunyai satu kelemahan: apabila bilangan kebergantungan meningkat, adalah perlu untuk membuat/mengkonfigurasi banyak objek sebelum menyampaikannya ke objek yang bergantung. Ia mungkin menghasilkan banyak kod boilerplate, serta barisan panjang parameter dalam pembina. Pada masa ini, anda perlu bekas suntikan ketergantungan!

bekas suntikan ketergantungan (Container DI untuk pendek) adalah objek yang tahu bagaimana untuk membuat perkhidmatan dan mengendalikan kebergantungannya.

Dalam artikel ini, kami akan menggunakan bekas di Container, Disco, untuk menunjukkan lagi konsep ini.

Untuk maklumat lanjut mengenai bekas suntikan ketergantungan, lihat artikel kami yang lain mengenai topik ini.

Kerana rangka kerja adalah contoh yang baik untuk menggunakan bekas DI, kami akan membuat rangka kerja berasaskan HTTP asas pada akhir artikel dengan Disco dan beberapa komponen Symfony.

Pemasangan

Untuk memasang disko, kami menggunakan komposer seperti biasa:

Untuk menguji kod, kami akan menggunakan pelayan web terbina dalam PHP:

<code class="language-php">class Test {

    protected $dbh;

    public function __construct(\PDO $dbh)
    {
        $this->dbh = $dbh;
    }

}

$dbh  = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$test = new Test($dbh);</code>
Akibatnya, permohonan itu akan dapat mengakses

https://www.php.cn/link/7d7b04e989115e193107af57ad662dd2 Fail terletak. -t index.php pemula

Disco adalah bekas di yang boleh saling beroperasi dengan bekas. Disco adalah kontroversial di dalam bekas berdasarkan anotasi.

Perhatikan bahawa pakej

mengandungi satu set antara muka untuk menyeragamkan ciri -ciri objek kontena. Untuk memahami bagaimana ia berfungsi, lihat tutorial kami untuk membina bekas suntikan ketergantungan SitePoint kami sendiri, yang juga berdasarkan

. container-interop container-interop Untuk menambah perkhidmatan ke bekas, kita perlu membuat kelas konfigurasi. Jenis ini harus menggunakan tanda anotasi :

@Configuration Setiap perkhidmatan kontena hendaklah ditakrifkan sebagai kaedah awam atau dilindungi dalam kelas konfigurasi. Disco memanggil setiap perkhidmatan kacang, yang berasal dari budaya Jawa.

<code class="language-bash">composer require bitexpert/disco</code>
Di dalam setiap kaedah, kami menentukan bagaimana perkhidmatan dibuat. Setiap kaedah mesti ditandakan dengan

(yang bermaksud ini adalah perkhidmatan) dan jenis objek kembali ditandakan dengan anotasi

.

@Bean ini adalah contoh kelas konfigurasi disko yang mudah yang mengandungi "kacang": @return

Anotasi menerima beberapa parameter konfigurasi untuk menentukan sifat perkhidmatan. Parameter-parameter ini menentukan sama ada perkhidmatan itu harus menjadi objek singleton, pemuatan kelewatan (jika objek itu berintensifkan sumber), atau berterusan keadaannya sepanjang hayat sesi.
<code class="language-bash">php -S localhost:8000 -t web</code>

Secara lalai, semua perkhidmatan ditakrifkan sebagai perkhidmatan singleton. @Bean

Sebagai contoh, kacang berikut mencipta perkhidmatan pemuatan malas singleton:

Disco menggunakan ProxyManager untuk menangguhkan pemuatan perkhidmatan. Ia juga menggunakannya untuk menyuntik tingkah laku tambahan (ditakrifkan oleh anotasi) ke dalam kaedah kelas konfigurasi.

<code class="language-php"><?php
/**
 * @Configuration
 */
class Services {
    // ...
}</code>
Selepas membuat kelas konfigurasi, kita perlu membuat contoh

dan lulus kelas konfigurasi kepadanya. Ini akan menjadi bekas kami.

Akhirnya, kami mendaftarkan bekas ke AnnotationBeanFactory:

BeanFactoryRegistry bagaimana untuk mendapatkan perkhidmatan dari bekas

<code class="language-php"><?php
/**
 * @Configuration
 */
class Configuration {

    /**
     * @Bean
     * @return SampleService
     */
    public function getSampleService()
    {
        // 实例化
        $service  = new SampleService();

        // 配置
        $service->setParameter('key', 'value');
        return $service;
    }
}</code>
Kerana disko serasi dengan kontena/interoperabilitas, kita boleh menggunakan

dan

kaedah pada objek kontena:

get() has()

(Kandungan berikut adalah serupa dengan teks asal. Untuk mengekalkan ruang, beberapa butiran ditinggalkan di sini, tetapi maklumat dan struktur utama dikekalkan)
<code class="language-php"><?php
// ...

/**
 * @Bean({"singleton"=true, "lazy"=true})
 * @return \Acme\SampleService
 */
public function getSampleService()
{
    return new SampleService();
}

// ...</code>

Skop Perkhidmatan

parameter kontena

Aplikasi praktikal disko

Buat pendengar respons

Kesimpulan

Artikel ini hanya pemprosesan pseudo-asal teks asal, dan membuat pelarasan halus dan kandungan yang ditulis semula, berusaha untuk menjadikan artikel itu lebih lancar dan lebih semula jadi tanpa mengubah makna umum teks asal. Format dan kedudukan imej kekal tidak berubah.

Atas ialah kandungan terperinci Disko dengan corak reka bentuk: melihat suntikan ketergantungan segar. 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