Points Core
Buat koleksi objek Realm
Seperti yang dinyatakan sebelum ini, ejen maya biasanya dibuat apabila mendapat akar agregat yang terikat pada pengumpulan objek Realm yang mendasari dari lapisan ketekunan. Oleh kerana sifat koleksi, dalam banyak kes, pra-penetapan koleksi adalah mahal, menjadikan mereka calon yang baik untuk memuatkan permintaan untuk mengurangkan pangkalan data pusingan di atas kepala. Selain itu, memandangkan hubungan "satu-ke-banyak" antara jawatan blog dan komen yang sepadannya agak setia dalam kes penggunaan ini, ia akan menjadi instruktif untuk memodelkan hubungan pertama melalui beberapa kelas domain yang mudah sebelum berurusan dengan ejen tertentu. Untuk membuat perkara lebih mudah difahami, kedua -dua peserta yang saya akan tambah semasa fasa ujian akan menjadi antara muka terpencil dan pelaksana asas. Kedua -dua ini bergabung untuk menentukan kontrak dan pelaksanaan objek pos blog generik:
<?php namespace Model; use ModelCollectionCommentCollectionInterface; interface PostInterface { public function setId($id); public function getId(); public function setTitle($title); public function getTitle(); public function setContent($content); public function getContent(); public function setComments(CommentCollectionInterface $comments); public function getComments(); }
<?php namespace Model; use ModelCollectionCommentCollectionInterface; class Post implements PostInterface { protected $id; protected $title; protected $content; protected $comments; public function __construct($title, $content, CommentCollectionInterface $comments = null) { $this->setTitle($title); $this->setContent($content); $this->comments = $comments; } // ... (Post class methods remain largely unchanged) ... }
Memahami logik kelas pasca di atas adalah proses yang mudah dan tidak memerlukan penjelasan yang nyata. Walau bagaimanapun, di sini adalah perincian yang berkaitan dengan yang perlu diberi perhatian: Kelas secara eksplisit mengisytiharkan kebergantungan pada koleksi komen yang belum ditakrifkan dalam pembina. Sekarang mari kita buat kelas yang menghasilkan komen pos:
<?php namespace Model; interface CommentInterface { public function setId($id); public function getId(); public function setContent($content); public function getContent(); public function setPoster($poster); public function getPoster(); }
<?php namespace Model; class Comment implements CommentInterface { protected $id; protected $content; protected $poster; public function __construct($content, $poster) { $this->setContent($content); $this->setPoster($poster); } // ... (Comment class methods remain largely unchanged) ... }
Setakat ini, semuanya telah berjalan lancar. Selain daripada blok nipis model domain asas, tidak ada yang boleh dikatakan mengenai kelas domain di atas, di mana setiap objek pos blog membuka persatuan "satu-ke-banyak" dengan komen yang berkaitan. Anda boleh memanggil saya seorang pemurni jika anda mahu, tetapi seolah -olah saya bahawa jika pelaksanaan model semasa tidak dipertingkatkan dengan koleksi komen, ia kelihatan tidak lengkap dan canggung. Mari buat model lebih kaya dengan menambahkan komponen tambahan ini:
<?php namespace ModelCollection; interface CommentCollectionInterface extends Countable, IteratorAggregate { public function getComments(); }
<?php namespace ModelCollection; use ModelCommentInterface; class CommentCollection implements CommentCollectionInterface { protected $comments = array(); public function __construct(array $comments = array()) { // ... (CommentCollection class methods remain largely unchanged) ... } }
Jika anda melihat dengan teliti dan melayari kelas CommentCollection, anda akan terlebih dahulu menyedari bahawa ia tidak lebih daripada pembungkus array yang boleh diselaraskan di belakang penyamaran cantik. Malah, koleksi array datang dalam pelbagai bentuk dan gaya, tetapi kebanyakan masa mereka hanya penggunaan mudah dari kelas Iterator dan Arrayaccess SPL. Dalam kes ini, saya ingin menyelamatkan diri saya (dan anda) dari tugas yang membosankan dan menjadikan kelas pelaksana iteratoraggregate. Dengan koleksi komen, kita boleh melangkah lebih jauh dan membiarkan model domain melakukan apa yang perlu dilakukan -bekerjasama dengan beberapa objek pos blog, atau bahkan menghubungkannya dengan satu kumpulan komen dengan penuh semangat diambil dari pangkalan data. Tetapi berbuat demikian hanya akan menipu diri kita tanpa memanfaatkan sepenuhnya keupayaan yang disediakan oleh proksi maya. Memandangkan dalam pelaksanaan tipikal, proksi mendedahkan API yang sama sebagai objek domain sebenar, proksi yang berinteraksi dengan kelas CommentCollection sebelumnya juga harus melaksanakan CommentCollectionInterface untuk mematuhi kontrak dengan kod klien tanpa memperkenalkan sekumpulan pernyataan bersyarat yang bermasalah.
Interaksi dengan koleksi objek domain melalui ejen maya Secara terang -terangan bercakap, koleksi tatasusunan pembalut, seperti yang disebutkan sebelumnya, boleh wujud secara bebas tanpa bergantung kepada sebarang kebergantungan lain. . Persoalan yang perlu ditanya ialah: Bagaimana anda mengekstrak komen dari pangkalan data dan memasukkannya ke dalam koleksi sebelumnya? Terdapat beberapa cara untuk mencapai matlamat ini, tetapi saya fikir yang paling menarik adalah melalui pemetaan data kerana ia meningkatkan ketidakpatuhan kegigihan. Mapper di bawah menjadikannya bagus untuk mendapatkan koleksi komen dari penyimpanan. Sila periksa: Walaupun pencari yang terdedah oleh kelas CommentMapper biasanya berpegang pada API yang mungkin dijangka dalam pelaksanaan pemetaan data standard, kaedah Fetchall () adalah kaedah yang paling menarik. Ia mula -mula mengekstrak semua komen blog pos dari storan dan meletakkannya ke dalam koleksi, dan akhirnya mengembalikan koleksi ke kod klien. Sekiranya anda seperti saya, anda mungkin mempunyai panggilan bangun dalam fikiran anda kerana koleksi itu ditimbulkan secara langsung di dalam kaedah. Malah, tidak perlu panik mengenai pengendali baru yang menyelinap di luar kilang, sekurang -kurangnya dalam kes ini, kerana koleksi itu sebenarnya merupakan struktur umum yang berada di bawah kategori "dicipta", bukannya kategori "suntikan". Bagaimanapun, jangan ragu untuk melakukannya jika anda merasa sedikit kurang bersalah dengan menyuntik koleksi ke dalam pembina pemetaan. Dengan Mapper Komen, sudah tiba masanya untuk mengalami epiphany sebenar dan membina kelas proksi yang mengantara dengan set sebelumnya: Seperti yang anda harapkan, CommentCollectionProxy melaksanakan antara muka yang sama sebagai koleksi komen sebenar. Walau bagaimanapun, kaedah GetComments () melakukan kerja sebenar di belakang tabir dan menangguhkan pemuatan komen dari pangkalan data melalui mapper yang diluluskan dalam pembina. Kaedah yang mudah dan berkesan ini membolehkan anda melakukan semua jenis tindakan pintar pada komen anda tanpa terlalu banyak kerja. Adakah anda ingin melihat kaedah apa yang anda mahu lihat? Katakan anda perlu mendapatkan semua komen yang terikat pada catatan blog tertentu dari pangkalan data. Coretan kod berikut boleh melakukan ini: Kelemahan pendekatan ini adalah bahawa komen pertama diekstrak dari storan dan kemudian disuntik ke dalam objek pos. Bagaimana untuk melakukannya dengan cara yang lain, tetapi kali ini ia adalah "spoof" kod klien dengan proksi? Komen bukan sahaja melambatkan pemuatan secara telus dari pangkalan data selepas proksi diletakkan di dalam gelung foreach, tetapi API yang terdedah kepada kod klien menyimpan struktur asalnya tidak berubah sepanjang proses. Adakah kita berani meminta sesuatu yang lebih baik? Kecuali anda sangat tamak, sukar bagi saya untuk berfikir demikian. Dalam kedua -dua kes, anda harus memahami realiti di sebalik tabir ejen maya dan bagaimana untuk memanfaatkan kemampuannya dalam meningkatkan kecekapan operasi objek domain dan lapisan kegigihan yang mendasari. Kesimpulan Walaupun mudah, terutamanya jika anda cukup berani untuk menggunakannya dalam persekitaran pengeluaran, contoh sebelumnya secara ringkas menunjukkan beberapa konsep yang menarik. Pertama, ejen maya bukan sahaja mudah untuk ditubuhkan dan digunakan, tetapi tidak dapat ditandingi dalam mencampurkan pelaksanaan yang berbeza pada masa runtime untuk menangguhkan melakukan tugas yang mahal (mis., Menangguhkan memuatkan sejumlah besar data dalam peringkat penyimpanan atau membuat graf objek kelas berat). Kedua, mereka adalah contoh klasik bagaimana polimorfisme dapat menjadi vaksin yang berkesan yang mengurangkan masalah ketegaran dan kelemahan yang banyak yang banyak aplikasi berorientasikan objek. Selain itu, kerana model objek PHP adalah mudah dan menyokong penutupan, adalah mungkin untuk mencampurkan ciri -ciri ini dengan bijak dan membina proksi yang logik asasnya didorong oleh kelebihan penutupan. Jika anda ingin menangani cabaran ini sendiri, saya berharap anda semua yang terbaik terlebih dahulu. (gambar dari imredesiuk / shutterstock) Atas ialah kandungan terperinci Pengenalan kepada Proksi Maya, Bahagian 2. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!<?php namespace Model;
use ModelCollectionCommentCollectionInterface;
interface PostInterface
{
public function setId($id);
public function getId();
public function setTitle($title);
public function getTitle();
public function setContent($content);
public function getContent();
public function setComments(CommentCollectionInterface $comments);
public function getComments();
}
<?php namespace Model;
use ModelCollectionCommentCollectionInterface;
class Post implements PostInterface
{
protected $id;
protected $title;
protected $content;
protected $comments;
public function __construct($title, $content, CommentCollectionInterface $comments = null) {
$this->setTitle($title);
$this->setContent($content);
$this->comments = $comments;
}
// ... (Post class methods remain largely unchanged) ...
}
<?php namespace Model;
interface CommentInterface
{
public function setId($id);
public function getId();
public function setContent($content);
public function getContent();
public function setPoster($poster);
public function getPoster();
}
<?php namespace Model;
class Comment implements CommentInterface
{
protected $id;
protected $content;
protected $poster;
public function __construct($content, $poster) {
$this->setContent($content);
$this->setPoster($poster);
}
// ... (Comment class methods remain largely unchanged) ...
}
<?php namespace ModelCollection;
interface CommentCollectionInterface extends Countable, IteratorAggregate
{
public function getComments();
}