Rumah >pembangunan bahagian belakang >tutorial php >PHP Master | Suntikan pergantungan dengan jerawat
mata teras
KEPENTINGAN KEPUTUSAN KEPUTUSAN
Kelas A bergantung pada Kelas B. Jika Kelas B tidak tersedia, kod di atas tidak akan berfungsi. Selain itu, setiap kali kita mengikat kod penciptaan objek di dalam kelas, kita akan mempunyai kebergantungan khusus pada kelas. Ketergantungan khusus adalah penghalang untuk menulis kod yang boleh diuji. Pendekatan yang lebih baik adalah untuk menyediakan objek Kelas B ke Kelas A. Objek ini boleh disediakan oleh pembina atau kaedah setter A. Sebelum kita membincangkan lagi, mari kita lihat senario yang lebih realistik.
Perkongsian kandungan di laman rangkaian sosial sangat biasa pada hari ini, dan kebanyakan laman web secara langsung memaparkan suapan profil sosial mereka di laman web mereka. Katakan kami mempunyai kelas yang dipanggil SocialFeeds yang menjana suapan dari laman sosial seperti Twitter, Facebook, Google, dll. Buat kelas berasingan untuk mengendalikan setiap perkhidmatan ini. Di sini kita akan melihat kelas twitterservice yang berinteraksi dengan Twitter. Kelas SocialFeeds menggunakan Twitterservice untuk meminta suapan Twitter. Twitterservice berinteraksi dengan pangkalan data untuk mendapatkan token pengguna tertentu yang mengakses API. Tanda itu diserahkan kepada kelas OAuth, yang mengambil makanan menggunakan token yang disediakan dan mengembalikannya ke kelas SocialFeeds.
<code class="language-php"><?php class A { public function a1() { $b = new B(); $b->b1(); } }</code>
<code class="language-php"><?php class SocialFeeds { public function getSocialFeeds() { $twService = new TwitterService(); echo $twService->getTweets(); } }</code>
<code class="language-php"><?php class TwitterService { public function getTweets() { $db = new DB(); $query = "Query to get user token from database"; $token = $db->getQueryResults($query); $oauth = new OAuth(); return $oauth->requestTwitterFeed($token); } }</code>
<code class="language-php"><?php class OAuth { public function requestTwitterFeed($token) { // Retrieve and return twitter feed using the token } }</code>
Adalah jelas bahawa sosialfeeds bergantung pada twitterservice. Tetapi Twitterservice bergantung kepada DB dan OAuth, jadi sosial -sosial bergantung kepada DB dan OAuth secara tidak langsung. Jadi apa masalahnya? SocialFeeds bergantung kepada pelaksanaan konkrit tiga kelas, jadi mustahil untuk menguji sosial secara berasingan tanpa pelaksanaan sebenar kelas lain. Atau, katakan kami ingin menggunakan pangkalan data yang berbeza atau pembekal OAuth yang berbeza. Dalam kes ini, kita perlu menggantikan kelas sedia ada dengan kelas baru sepanjang kod.
Betulkan kebergantungan tertentu
Penyelesaian kepada kebergantungan ini adalah mudah, iaitu secara dinamik menyediakan objek apabila perlu tanpa menggunakan pelaksanaan konkrit. Terdapat dua jenis teknik yang boleh menyuntik kebergantungan: suntikan ketergantungan berasaskan pembina dan suntikan berasaskan setter.
suntikan berasaskan pembina
Menggunakan suntikan ketergantungan berasaskan pembina, objek ketergantungan dicipta secara luaran dan diluluskan sebagai parameter kepada pembina kelas. Kita boleh menetapkan objek ini kepada pembolehubah kelas dan menggunakannya di mana -mana sahaja di dalam kelas. Suntikan berasaskan pembina kelas SocialFeeds adalah seperti berikut:
<code class="language-php"><?php class DB { public function getQueryResults($query) { // Get results from database and return token } }</code>
Contoh Twitterservice diluluskan sebagai objek kepada pembina. SocialFeeds masih bergantung pada Twitterservice, tetapi sekarang kami bebas untuk menyediakan versi penyedia perkhidmatan Twitter yang berlainan, dan juga objek mengejek untuk tujuan ujian. Mengenai kelas Twitterservice, DB dan OAuth juga ditakrifkan dengan cara yang sama.
<code class="language-php"><?php class SocialFeeds { public $twService; public function __construct($twService) { $this->twService = $twService; } public function getSocialFeeds() { echo $this->twService->getTweets(); } }</code>
suntikan berasaskan seter
Menggunakan suntikan berasaskan setter, objek disediakan oleh kaedah setter dan bukannya pembina. Berikut adalah pelaksanaan suntikan ketergantungan berasaskan setter kelas SocialFeeds:
<code class="language-php"><?php $db = new DB(); $oauth = new OAuth(); $twService = new TwitterService($db, $oauth); $socialFeeds = new SocialFeeds($twService); $socialFeeds->getSocialFeeds();</code>
kod inisialisasi sekarang termasuk db dan oauth kelihatan seperti ini:
<code class="language-php"><?php class SocialFeeds { public $twService; public function getSocialFeeds() { echo $this->twService->getTweets(); } public function setTwitterService($twService) { $this->twService = $twService; } }</code>
suntikan pembina dan setter
Pro
peranan jerawat dalam di
Penggunaan jerawat lanjutan Dalam senario di atas, Pimple mengembalikan contoh baru setiap kelas dari penutupan setiap kali ia diminta. Dalam sesetengah kes, kita perlu menggunakan objek yang sama tanpa memulakan contoh baru setiap kali, seperti menyambung ke pangkalan data adalah contoh yang sempurna. Pimple menyediakan keupayaan untuk mengembalikan contoh yang sama menggunakan objek yang dikongsi.
Ringkasan
Apakah jerawat dan mengapa ia digunakan dalam php? bagaimana jerawat berfungsi? bagaimana memasang jerawat? Dalam jerawat, anda boleh menentukan perkhidmatan dengan memberikan objek yang boleh dipanggil ke kunci dalam bekas. Objek yang boleh dipanggil harus mengembalikan contoh perkhidmatan. Sebagai contoh, anda boleh menentukan perkhidmatan untuk kelas pengirim mel seperti ini:
. Apabila anda mengakses perkhidmatan, Pimple melaksanakan definisi perkhidmatan dan mengembalikan objek perkhidmatan. . Sebagai contoh, anda boleh berkongsi perkhidmatan pengirim mel seperti ini: untuk melanjutkan perkhidmatan dalam jerawat. Ini membolehkan anda mengubah suai perkhidmatan selepas mendefinisikannya. Sebagai contoh, anda boleh melanjutkan perkhidmatan pengirim mel seperti ini untuk menambah konfigurasi tambahan: sebagai parameter. . Apakah faedah menggunakan jerawat?
Selepas memahami suntikan pergantungan dan pelbagai teknik suntikan, sudah tiba masanya untuk melihat jerawat dan bagaimana ia sesuai dengannya. Jangan ulangi diri anda (kering) adalah prinsip dalam pembangunan perisian yang bertujuan untuk mengurangkan duplikasi pelbagai maklumat, yang sangat berguna dalam seni bina pelbagai lapisan. Pernyataan prinsip kering adalah bahawa "setiap serpihan pengetahuan mesti mempunyai perwakilan tunggal, jelas, berwibawa dalam sistem" - Wikipedia
Pertimbangkan contoh suntikan berasaskan pembina. Setiap kali kita menginginkan objek kelas SocialFeed, kita perlu mengulangi keseluruhan proses persediaan instantiating dan lulus kebergantungannya. Menurut Dry, kod tersebut harus dielakkan untuk mencegah masalah penyelenggaraan. Jerawat bertindak sebagai bekas yang mentakrifkan kebergantungan sedemikian untuk mengelakkan pertindihan. Mari kita lihat contoh mudah untuk melihat bagaimana jerawat berfungsi. <code class="language-php"><?php
class A
{
public function a1() {
$b = new B();
$b->b1();
}
}</code>
Buat contoh jerawat sebagai bekas untuk menyimpan dependensi. Ia melaksanakan antara muka SPL Arrayaccess, jadi menggunakannya sangat serupa dengan menggunakan tatasusunan. Pertama, kita menentukan kunci yang memegang nama mana -mana kelas yang kita mahu. Kami kemudian menentukan penutupan untuk mengembalikan contoh kelas yang ditentukan yang bertindak sebagai perkhidmatan. Perhatikan bahawa contoh bekas akan diluluskan kepada $ C, jadi kita boleh merujuk kepada kunci yang ditakrifkan seperti yang diperlukan; Sekarang, apabila kita mahu contoh kelas, kita boleh merujuk kunci untuk mendapatkan objek tersebut. Mari kita menukar contoh sosial untuk jerawat. Contoh-contoh di laman web Pimple Rasmi menunjukkan suntikan berasaskan pembina, jadi di sini kami akan menggambarkan suntikan berasaskan setter. Ingat bahawa untuk menggunakan jerawat, kita tidak perlu mengubah suai kaedah setter atau kod yang ditakrifkan sebelum ini - kita hanya merangkum logik. <code class="language-php"><?php
class SocialFeeds
{
public function getSocialFeeds() {
$twService = new TwitterService();
echo $twService->getTweets();
}
}</code>
db dan kelas OAuth adalah modul bebas, jadi kami mengembalikan contoh baru mereka secara langsung dalam penutupan. Kami kemudian menggunakan suntikan berasaskan setter untuk menambah kebergantungan ke kelas Twitterservice. Kami telah menambah kelas DB dan OAuth ke bekas, jadi kami boleh mengaksesnya secara langsung di dalam fungsi menggunakan $ C ['DB'] dan $ C ['OAUTH']. Sekarang, kebergantungan dikemas dalam bekas sebagai perkhidmatan. Setiap kali kita mahu menggunakan kelas DB yang berbeza atau perkhidmatan OAuth yang berbeza, kita hanya menggantikan kelas dalam pernyataan kontena dan semuanya akan berjalan dengan sempurna. Dengan jerawat, anda hanya perlu menambah kebergantungan baru di satu tempat. <code class="language-php"><?php
class A
{
public function a1() {
$b = new B();
$b->b1();
}
}</code>
Juga, setakat ini kami telah menentukan semua kebergantungan dalam satu lokasi dalam bekas jerawat. Walau bagaimanapun, pertimbangkan satu kes di mana kita memerlukan perkhidmatan yang mempunyai kebergantungannya tetapi dikonfigurasikan sedikit berbeza dari perkhidmatan asal. Sebagai contoh, katakan kita perlu mengakses ORM untuk melaksanakan beberapa fungsi kelas Twitterservice. Kita tidak boleh mengubah penutupan yang sedia ada kerana ia memaksa semua fungsi sedia ada untuk menggunakan ORM. Pimple menyediakan kaedah lanjutan () untuk mengubahsuai penutupan yang sedia ada secara dinamik tanpa menjejaskan pelaksanaan asal. Pertimbangkan kod berikut: <code class="language-php"><?php
class SocialFeeds
{
public function getSocialFeeds() {
$twService = new TwitterService();
echo $twService->getTweets();
}
}</code>
Sekarang, kami dapat menggunakan versi lanjutan yang berbeza dari tweet_service dalam kes -kes khas. Parameter pertama adalah nama perkhidmatan, dan parameter kedua adalah fungsi yang dapat mengakses contoh objek dan bekas. Malah, lanjutan () adalah cara yang kuat untuk menambah kebergantungan secara dinamik untuk memenuhi situasi yang berbeza, tetapi pastikan untuk mengehadkan versi perkhidmatan yang dilanjutkan dengan minimum, kerana ia meningkatkan jumlah kod pendua. Soalan Lazim mengenai Suntikan Ketergantungan dengan Jerawat (Soalan Lazim) Pimple adalah bekas suntikan pergantungan PHP yang mudah yang membolehkan anda mengurus dan memusatkan perkhidmatan dalam aplikasi anda. Ia digunakan dalam PHP, menjadikan kod lebih fleksibel, boleh diguna semula dan lebih mudah untuk diuji. Dengan menggunakan jerawat, anda boleh memberi objek objek di satu tempat dan menyuntiknya ke bahagian -bahagian yang berlainan dari aplikasi anda, mengurangkan keperluan untuk keadaan global dan menjadikan kod anda lebih mudah untuk mengekalkan dan menguji.
Pimple berfungsi dengan menyimpan definisi perkhidmatan dalam bekas. Definisi ini boleh dipanggil (fungsi atau kaedah) dan mereka mengembalikan contoh perkhidmatan. Apabila anda mengakses perkhidmatan dari bekas, Pimple melaksanakan definisi perkhidmatan untuk membuat objek perkhidmatan. Ini membolehkan anda menguruskan perkhidmatan dengan cara berpusat dan berkongsi perkhidmatan sepanjang permohonan.
jerawat boleh dipasang menggunakan komposer (alat pengurusan pergantungan PHP). Anda boleh memasang komposer secara global pada sistem anda dan kemudian memperkenalkan jerawat dalam projek anda dengan menjalankan perintah
.
bagaimana untuk menentukan perkhidmatan dalam jerawat?
$container['mailer'] = function ($c) { return new Mailer($c['smtp']); };
anda boleh mengakses perkhidmatan dalam jerawat menggunakan notasi array dengan kekunci perkhidmatan. Sebagai contoh, anda boleh mengakses perkhidmatan pengirim mel seperti ini: $mailer = $container['mailer'];
Secara lalai, Pimple mengembalikan contoh perkhidmatan baru setiap kali ia mengakses perkhidmatan. Jika anda ingin berkongsi perkhidmatan dan mengembalikan contoh yang sama setiap kali, anda boleh menggunakan kaedah share()
. $container['mailer'] = $container->share(function ($c) { return new Mailer($c['smtp']); });
Ya, anda boleh menggunakan kaedah extend()
$container['mailer'] = $container->extend('mailer', function ($mailer, $c) { $mailer->setFrom($c['email.from']); return $mailer; });
Dalam contoh ini, kaedah setFrom()
email.from
Bagaimana untuk melindungi parameter dalam jerawat? Dalam jerawat, anda boleh menggunakan kaedah
untuk melindungi parameter (yang tidak boleh dianggap sebagai parameter perkhidmatan). Ini membolehkan anda menyimpan nilai dalam bekas tanpa merawatnya sebagai definisi perkhidmatan. Sebagai contoh, anda boleh melindungi nilai konfigurasi seperti ini: protect()
$container['config.value'] = $container->protect(function () { return 'value'; });
Bagaimana menggunakan jerawat dalam projek? Anda boleh menggunakan jerawat dalam projek dengan membuat contoh baru kelas Pimplecontainer dan menentukan perkhidmatan di sana. Anda kemudian boleh mengakses perkhidmatan dari bekas di mana anda memerlukannya dalam permohonan. Ini membolehkan anda menguruskan perkhidmatan secara berpusat dan menyuntiknya ke bahagian -bahagian yang berlainan dari aplikasi anda.
Pimple menyediakan banyak manfaat untuk pembangunan PHP. Ia menjadikan kod anda lebih fleksibel kerana ia membolehkan anda menguruskan perkhidmatan dengan cara yang berpusat. Ia menjadikan kod anda lebih mudah untuk digunakan semula kerana ia membolehkan anda berkongsi perkhidmatan sepanjang aplikasi anda. Ia menjadikan kod anda lebih mudah untuk diuji kerana ia membolehkan anda menyuntik perkhidmatan mengejek untuk ujian. Dengan menggunakan jerawat, anda boleh meningkatkan kualiti kod anda dan memudahkan untuk mengekalkan dan menguji.
Atas ialah kandungan terperinci PHP Master | Suntikan pergantungan dengan jerawat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!