Pola MVC sangat umum dalam arsitektur website. Hal ini memungkinkan kita untuk membangun aplikasi tiga tingkat, memisahkan lapisan yang berguna dari kode, membantu desainer dan pengembang bekerja sama dan meningkatkan kemampuan kita untuk memelihara dan memperluas aplikasi yang ada.
Tampilan
"Tampilan" terutama mengacu pada hasil akhir yang kami kirimkan ke browser web - seperti HTML yang dihasilkan oleh skrip kami. Ketika berbicara tentang tampilan, banyak orang memikirkan template, namun kebenaran menyebut solusi template tampilan dipertanyakan.
Mungkin hal yang paling penting tentang sebuah pandangan adalah bahwa ia harus "sadar diri". Ketika pandangan tersebut dirender, elemen-elemennya menyadari perannya dalam kerangka yang lebih besar.
Mengambil XML sebagai contoh, dapat dikatakan bahwa ketika XML diurai, DOM API memiliki pengetahuan sedemikian rupa sehingga sebuah node di pohon DOM mengetahui di mana ia berada dan apa isinya. (Ketika sebuah node dalam dokumen XML diurai dengan SAX, hal ini hanya masuk akal ketika node tersebut diurai.)
Kebanyakan skema templat menggunakan bahasa prosedural sederhana dan tag templat seperti ini:
<p>{some_text}</p >
<p>{some_more_text}</p>
Kata-kata tersebut tidak ada artinya di dalam dokumen, maksudnya hanyalah PHP akan menggantinya dengan yang lain.
Jika Anda setuju dengan deskripsi tampilan yang longgar ini, Anda juga akan setuju bahwa sebagian besar solusi templat tidak secara efektif memisahkan tampilan dan model. Tag template akan diganti dengan apa pun yang disimpan dalam model.
Ajukan beberapa pertanyaan pada diri Anda saat Anda mengimplementasikan tampilan: "Apakah mudah untuk mengganti seluruh tampilan?" "Berapa lama waktu yang dibutuhkan untuk mengimplementasikan tampilan baru?" "Apakah mudah untuk mengganti bahasa deskripsi tampilan? (Misalnya, menggunakan SOAP dalam tampilan yang sama Dokumen menggantikan dokumen HTML)"
Model (Model)
Model mewakili logika program. (Sering disebut lapisan bisnis dalam program tingkat perusahaan)
Secara umum, tugas model adalah mengubah data asli menjadi data yang mengandung beberapa makna, yang akan ditampilkan oleh tampilan. Biasanya, model akan merangkum kueri data, mungkin melalui beberapa kelas data abstrak (lapisan akses data) untuk mengimplementasikan kueri. Misalnya, jika Anda ingin menghitung curah hujan tahunan di Inggris (hanya untuk mencari tempat liburan yang menyenangkan), model akan menerima curah hujan harian selama sepuluh tahun, menghitung rata-ratanya, dan meneruskannya ke tampilan.
Pengontrol (controller)
secara sederhana berarti bahwa pengontrol adalah bagian pertama dari permintaan HTTP yang masuk dalam aplikasi web. Ia memeriksa permintaan yang diterima, seperti beberapa variabel GET, dan membuat umpan balik yang sesuai. Sulit untuk mulai menulis kode PHP lain sampai Anda menulis pengontrol pertama Anda. Penggunaan yang paling umum adalah struktur seperti pernyataan switch di index.php:
<?php
beralih ($_GET['lihathalaman']) {
kasus "berita":
$page=Renderer Berita baru;
merusak;
kasus "tautan":
$page=Renderer Tautan baru;
merusak;
bawaan:
$page=HomePageRenderer baru;
merusak;
}
$halaman->tampilan();
?>
Kode ini menggabungkan kode prosedural dan berorientasi objek, tetapi untuk situs kecil, ini biasanya merupakan pilihan terbaik. Walaupun kode diatas masih bisa dioptimasi.
Pengontrol sebenarnya adalah kontrol yang digunakan untuk memicu pengikatan antara data model dan elemen tampilan.
Contoh
Berikut adalah contoh sederhana menggunakan pola MVC.
Pertama kita membutuhkan kelas akses database, yang merupakan kelas biasa.
<?php
/**
* Kelas sederhana untuk menanyakan MySQL
*/
kelas Akses Data {
/**
*Pribadi
* $db menyimpan sumber daya basis data
*/
var $db;
/**
*Pribadi
* $query menyimpan sumber kueri
*/
var $query; // Sumber daya kueri
//! Konstruktor.
/**
* Membuat objek DataAccess baru
* @param $host string nama host untuk dbserver
* @param $pengguna string pengguna dbserver
* @param $pass kata sandi pengguna dbserver string
* @param $db nama basis data string
*/
fungsi Akses Data ($host,$pengguna,$pass,$db) {
$ini->db=mysql_pconnect($host,$pengguna,$pass);
mysql_select_db($db,$ini->db);
}
//! Seorang pengakses
/**
* Mengambil sumber daya kueri dan menyimpannya di anggota lokal
* @param $sql merangkai kueri basis data yang akan dijalankan
* @pengembalian batal
*/
fungsi mengambil($sql) {
$this->query=mysql_unbuffered_query($sql,$this->db); // Lakukan kueri di sini
}
//! Seorang pengakses
/**
* Mengembalikan array asosiatif dari baris kueri
* @kembali dicampur
*/
fungsi getRow () {
jika ( $row=mysql_fetch_array($ini->kueri,MYSQL_ASSOC) )
kembalikan $baris;
kalau tidak
kembali salah;
}
}
?>
Letakkan model di atasnya.
<?php
/**
* Mengambil "produk" dari database
*/
kelas Model Produk {
/**
*Pribadi
* $dao turunan dari kelas DataAccess
*/
var $dao;
//! Sebuah konstruktor.
/**
* Membuat objek ProductModel baru
* @param $dobject sebuah instance dari kelas DataAccess
*/
fungsi Model Produk (&$dao) {
$ini->dao=& $dao;
}
//! Seorang manipulator
/**
* Memberitahu $dboject untuk menyimpan kueri ini sebagai sumber daya
* @param $mulai baris untuk memulai
* @param $rows jumlah baris yang akan diambil
* @pengembalian batal
*/
daftar fungsiProduk($mulai=1,$baris=50) {
$this->dao->fetch("SELECT * FROM produk LIMIT ".$start.", ".$rows);
}
//! Seorang manipulator
/**
* Memberitahu $dboject untuk menyimpan kueri ini sebagai sumber daya
* @param $id kunci utama untuk satu baris
* @pengembalian batal
*/
daftar fungsiProduk($id) {
$this->dao->fetch("PILIH * DARI produk WHERE productID='".$id."'");
}
//! Seorang manipulator
/**
* Mengambil produk sebagai array asosiatif dari $dbobject
* @kembali dicampur
*/
fungsi dapatkanProduk() {
jika ( $produk=$ini->dao->getRow() )
kembalikan $produk;
kalau tidak
kembali salah;
}
}
?>
Satu hal yang perlu diperhatikan adalah interaksi antara model dan kelas akses data tidak pernah lebih dari satu baris - tidak ada beberapa baris yang dikirim, yang akan memperlambat program dengan cepat. Program yang sama hanya perlu menyimpan satu baris (Row) dalam memori untuk kelas yang menggunakan skema - sisanya diberikan ke sumber daya kueri yang disimpan (sumber daya kueri) - dengan kata lain, kita membiarkan MYSQL mempertahankan hasilnya untuk kita.
Selanjutnya adalah tampilan - Saya menghapus HTML untuk menghemat ruang, Anda dapat melihat kode lengkapnya di postingan ini.
<?php
/**
* Mengikat data produk ke rendering HTML
*/
kelas Tampilan Produk {
/**
*Pribadi
* $model sebuah turunan dari kelas ProductModel
*/
var $model;
/**
*Pribadi
* $output HTML yang dirender disimpan di sini untuk ditampilkan
*/
var $output;
//! Sebuah konstruktor.
/**
* Membuat objek ProductView baru
* @param $model sebuah turunan dari kelas ProductModel
*/
fungsi Tampilan Produk (&$model) {
$ini->model=& $model;
}
//! Seorang manipulator
/**
* Membangun bagian atas halaman HTML
* @pengembalian batal
*/
header fungsi () {
} }
//! Seorang manipulator
/**
* Membangun bagian bawah halaman HTML
* @pengembalian batal
*/
fungsi footer () {
}
//! Seorang manipulator
/**
* Menampilkan satu produk
* @pengembalian batal
*/
fungsi item produk($id=1) {
$ini->model->daftarProduk($id);
sementara ( $produk=$ini->model->getProduk() ) {
// Ikat data ke HTML
}
}
//! Seorang manipulator
/**
* Membangun tabel produk
* @pengembalian batal
*/
fungsi tabel produk($angka baris=1) {
$barisperhalaman='20';
$ini->model->daftarProduk($jumlah baris,$barisperhalaman);
sementara ( $produk=$ini->model->getProduk() ) {
// Ikat data ke HTML
}
}
//! Seorang pengakses
/**
* Mengembalikan HTML yang dirender
* @mengembalikan string
*/
tampilan fungsi () {
kembalikan $ini->keluaran;
}
}
?>
Ringkasan: Pola MVC sangat umum dalam arsitektur situs web. Hal ini memungkinkan kita untuk membangun aplikasi tiga tingkat, memisahkan lapisan yang berguna dari kode, membantu desainer dan pengembang bekerja sama dan meningkatkan kemampuan kita untuk memelihara dan memperluas aplikasi yang ada. Artikel ini akan memperkenalkan Anda pada implementasi pola MVC di PHP.
Tag: PHP MVC Pola MVC Situs web PHP
Oracle membantu Anda mendapatkan wawasan akurat tentang setiap tautan logistik
Oracle membantu Anda mendapatkan wawasan akurat tentang setiap tautan logistik. Terakhir, pengontrol, kami akan mengimplementasikan tampilan sebagai subkelas.
<?php
/**
* Mengontrol aplikasi
*/
class ProductController memperluas ProductView {
//! Sebuah konstruktor.
/**
* Membuat objek ProductController baru
* @param $model sebuah turunan dari kelas ProductModel
* @param $getvars variabel metode HTTP GET yang masuk
*/
fungsi Pengontrol Produk (&$model,$getvars=null) {
Tampilan Produk::Tampilan Produk($model);
$ini->tajuk();
beralih ( $getvars['view'] ) {
kasus "produk":
$ini->productItem($getvars['id']);
merusak;
bawaan:
if ( kosong ($getvars['rownum']) ) {
$ini->produkTable();
} kalau tidak {
$ini->productTable($getvars['rownum']);
}
merusak;
}
$ini->footer();
}
}
?>
Perhatikan bahwa ini bukan satu-satunya cara untuk mengimplementasikan MVC - misalnya Anda dapat menggunakan pengontrol untuk mengimplementasikan model dan mengintegrasikan tampilan pada saat yang bersamaan. Ini hanyalah salah satu cara untuk menunjukkan polanya.
File index.php kita terlihat seperti ini:
<?php
require_once('lib/DataAccess.php');
require_once('lib/ProductModel.php');
require_once('lib/ProductView.php');
require_once('lib/ProductController.php');
$dao=& Akses Data baru ('localhost','pengguna','pass','dbname');
$productModel=& Model Produk baru($dao);
$productController=& ProductController baru($productModel,$_GET);
echo $productController->tampilan();
?>
Cantik dan sederhana.
Kami memiliki beberapa trik untuk menggunakan pengontrol, di PHP Anda dapat melakukan ini:
$this->{$_GET['method']}($_GET['param']);
Salah satu sarannya adalah Anda sebaiknya mendefinisikan formulir Namespace URL program (namespace), maka akan lebih terstandarisasi, misalnya:
"index.php?class=ProductView&method=productItem&id=4"
Melalui itu kita dapat memproses controller kita seperti ini:
$view=new $_GET['class'];
$view->{$_GET['method']($_GET['id']);
Terkadang, membuat pengontrol itu sulit, seperti saat Anda mengorbankan kecepatan pengembangan dan kemampuan beradaptasi. Tempat yang baik untuk mendapatkan inspirasi adalah Java Struts dari grup Apache, yang pengontrolnya sepenuhnya ditentukan oleh dokumen XML.