Telanjang Zend_Layout dan Zend_View
Pada artikel ini saya melihat menggunakan Zend_Layout dan Zend_View bersama-sama dengan front controller sederhana untuk menunjukkan bagaimana mungkin untuk memulakan pemisahan logik perniagaan dan persembahan dalam aplikasi anda. kod Semua sedia di github:
Telanjang Zend_Layout dan Zend_View pada Github .
MVC
Sebuah umum pola desain untuk aplikasi web moden adalah pola MVC. The Zend Framework mode 'full stack' dalam merupakan salah satu implementasi MVC di PHP dan terdiri daripada tiga bahagian:
- Model (M)
- Lihat (V)
- Controller (C)
Pola ini direka sedemikian rupa sehingga logik perniagaan dan persembahan yang sepenuhnya terpisah dari satu sama lain (dengan logik perniagaan dalam model, dan persembahan dalam pandangan) dan kontroler duduk di tengah-tengah pelaksanaan "orkestra".
Persembahan dan Logik
Dalam Zend Framework melihat dikendalikan oleh dua komponen utama: Zend_View dan Zend_Layout. Zend_Layout seperti namanya terlihat setelah aspek tata letak halaman (biasanya header, footer, sidebar, dll). Zend_View memfokuskan pada penyajian data yang model anda telah bekerja untuk menghasilkan atau berasal.
Sebagai pemaju, dan aplikasi mereka, berkembang kita cenderung untuk bergerak melalui pelbagai tahap, masing-masing umumnya perbaikan pada maintainability, sebelumnya meningkatkan dan dipanjangkan. Salah satu isu utama adalah bahawa penyajian dan logik masih mendapatkan bercampur dan sederhana untuk tidak memulakan memisahkan keduanya.
Apa yang salah dengan mencampur dua?
Ada beberapa alasan mengapa pencampuran bahagian yang berbeza dari aplikasi, misalnya seorang desainer yang bekerja di laman anda mungkin tidak mahu (atau pengetahuan) untuk mengimbas sekitar dalam kod cuba bekerja di mana untuk membuat perubahan persembahan. Dengan cara yang sama seorang pemaju (jika anda seperti saya yang memiliki kemampuan desain dari burung unta) boleh pecah keluar keringat dingin ketika anda menyebutkan desain atau bekerja UI.
Selain itu bagaimana jika nanti anda ingin menyajikan halaman anda di media yang berbeza, seperti telefon bimbit, tablet PC, atau mengekspos data melalui perkhidmatan web (XML / JSON / dll)? Setelah persembahan dicampur dan logik anda berdiri hampir tidak ada harapan tanpa beberapa hacks sangat jelek untuk menarik kembali persembahan daripada kod anda, sebelum menyuntikkan sesuatu yang baru. Jika data dan persembahan telah terpisah membuat perubahan ini hampir sepele, membuat script pandangan baru untuk format baru dan permintaan langsung yang sesuai.
Memisahkan dua
Dalam sebuah aplikasi yang selalu berkembang tidak ekonomik untuk memulakan menerapkan penyelesaian MVC penuh dan aplikasi harus berhijrah lambat - kadang-kadang menjalankan kod lama secara selari dengan yang baru. Ini mungkin bahawa ada massa dari logik (seperti setup Sambungan pangkalan data, pengesahan, pengendalian cookies, dll) yang tidak bersedia untuk mencetak untuk setup rangka kerja yang anda pilih, maka kod lama dan dikenali-to-be-kerja dapat terus digunakan sampai waktu tersebut dapat ditulis semula / refactored.
Nota: Zend_Layout Menggunakan dan Zend_View seperti ini benar-benar diterima dalam bidang Zend Framework dan rangka kerja telah dirancang sedemikian rupa sehingga masing-masing komponen boleh digunakan tanpa sisa kerangka. Sebuah keuntungan besar dalam aplikasi yang berkembang dan mungkin salah satu alasan utama untuk penyerapan yang tinggi dalam aplikasi enterprise.
Front Controller
Di bawah ini saya membuat front controller - sebuah fail tunggal yang direka bentuk untuk mengambil setiap permintaan yang tidak sesuai untuk fail pada sistem-fail. Hal ini sering dicapai dengan menggunakan fail. Htaccess seperti yang digunakan dalam Zend Framework default install. Dalam controller depan aku akan menyiapkan tata letak kami dan melihat dan menunjukkan mana bahagian-bahagian yang berbeza dari slip aplikasi ke dalamnya.
define ('APP_PATH', dirname (__FILE__ ).'/..'); / / Output buffering Mula ob_start (); / / Membuat contoh Zend_View Zend_Layout:: startMvc (); $ Layout Zend_Layout =:: getMvcInstance (); $ Layout-> setLayoutPath (APP_PATH. '/ Tata letak / script') -> SetViewSuffix ('phtml') -> SetLayout ('index'); $ View = $ getView layout-> () -> SetScriptPath (APP_PATH '/ view / scripts'.) - AddHelperPath> (. APP_PATH '/ library / Zend / Lihat / Penolong', 'Zend_View_Helper'); / / Set Base URL - ok * hampir * telanjang, tetapi anda tidak perlu ini! Zend_Controller_Front:: getInstance () -> setBaseUrl ($ ['HTTP_HOST'] _SERVER); try { / ** * Lakukan beberapa aplikasi routing ... * - Bisa jadi menggunakan ini sebagai controller depan dan memimpin semua permintaan * Melalui gambar ini satu (disediakan fail tidak ada di sistem fail * - Nota kaedah di bawah ini hanya benar-benar untuk demonstrasi, akan * Mengerikan dengan laman web yang besar * / switch ($ ['page'] _GET) { kes 'Indeks': kes 'pengecualian': $ NamaHalaman = $ ['page'] _GET; break; default: $ NamaHalaman = false; break; } / / Contoh halaman tidak dijumpai ... if (false === $ NamaHalaman) { $ ResponseHeader = 'HTTP/1.1 404 Laman Tidak Ditemui'; melemparkan Pengecualian baru ('Laman tidak Ditemukan'); } / ** * Tambah data untuk melihat anda objek di sini * Anda mungkin mempunyai pelaksanaan kawalan anda sendiri atau beberapa termasuk fail * Mana logik perniagaan sebahagian berasingan dari logik view * / $ View-> DisplayText = 'Halo dari Lloyd'; buttonText $ view-> = 'Aku \' m tidak aktif '!; $ Layout-> isi = memberikan $ view-> (". {$ NamaHalaman} phtml"); echo $ membuat layout-> (); } Catch (Exception $ e) { / / Pembersihan sudah buffered kandungan - kami tidak mahu memaparkan itu! ob_clean (); if (! isset ($ responseHeader)) { $ ResponseHeader = 'HTTP/1.1 500 Internal Server Error'; } header ($ responseHeader); $ View-> pengecualian = $ e; $ Layout-> isi = memberikan $ view-> ('error.phtml'); echo $ membuat layout-> (); }
Pertama kita mulai buffering output, dengan melakukan ini kita dapat menetapkan header kami di setiap titik dalam permintaan dan tahu bahawa adalah mungkin untuk menghantar mereka. Haruskah pengecualian akan dilemparkan pada setiap tahap pelaksanaan kod yang kami membersihkan buffer ini dan menulis keluar atau kesalahan isi mesej dan layout. Hal ini memastikan bahawa kami tidak memberikan bahagian yang diberikan kandungan yang mengandungi kesalahan kepada pengguna akhir.
Kemudian contoh MVC baru Zend_Layout dihasilkan dan kami memberitahu bahawa keluar script layout mempunyai sambungan phtml, harus ditemui dalam direktori di luar pusat awam, dan bahawa layout default kita disebut dengan indeks (phtml.). Dari tata letak kita kemudian ekstrak objek pandangan (yang kita menetapkan data kami untuk disajikan) dan melaksanakan persediaan serupa.
Selanjutnya kita setup objek paparan dengan merujuk pada standard helper Zend_View. pembantu View pada set kefungsian tambahan kemudahan. Sebagai contoh, menuliskan float dalam format kewangan, atau membuat jadual bergaris zebra (mereka dapat membaca tentang di sini ). Dengan memperluaskan Zend_View_Helper_Abstract dan menambah perpustakaan anda sendiri pada saat ini mungkin untuk menggunakan aplikasi pembantu pandangan anda sendiri.
Sisa daripada kod aplikasi sekarang dibungkus dengan {cuba} {blok catch}. Jika sesuatu melemparkan eksepsi tidak tertangkap kita boleh menangkap dan memaparkan mesej ralat yang bagus bagi pengguna akhir.
Tugas pertama kami dalam cuba menangkap {} {} adalah meminta laluan kami, apakah pengguna ingin melihat? Di sini saya telah melaksanakan beberapa kod demonstrasi yang sangat sederhana di mana saya cek nilai dari 'laman' mendapatkan pembolehubah. Anda routing boleh sangat jauh lebih kompleks. Routing tersebut digunakan untuk memanggil kod apa yang pernah harus dijalankan untuk mendapatkan / mengendalikan data yang disediakan oleh pengguna dan untuk memberitahu sistem apa paparan (dan mungkin script layout) yang digunakan.
Akhirnya jika router kita tidak sesuai dengan laman itu menetapkan kod respon 404 dan memaparkan laman yang bagus tidak dijumpai mesej kepada pengguna akhir. Di sini, kita melempar dan menangkap kecuali kita sendiri (dan pengecualian yang sangat generik pada saat itu) tetapi mungkin anda akan melemparkan pengecualian anda sendiri dari dalam kod router.
Setelah kami berjaya disalurkan permintaan kami kita boleh mula melakukan sesuatu dengan kod. Mungkin saja bahawa anda mempunyai controller sendiri / model dilaksanakan atau anda menyertakan beberapa kod yang sudah dipisahkan agak. Di sini saya menetapkan beberapa pembolehubah sederhana untuk melihat objek.
Setelah ini selesai kita hanya membuat pandangan dengan data kami. Jika kod membaling pengecualian tidak tertangkap dengan alasan apapun ini adalah terperangkap di dekat bahagian bawah script. Di sini kita jelas sudah buffered output, menetapkan header respon 500, dan memberitahu aplikasi kita untuk membuat script melihat 'kesalahan' (yang umumnya versi yang lebih dipreteli tata letak muzik / melihat dan log kesalahan untuk menyemak kemudian).
Sebagai view dirender pertama dan disuntik ke dalam tata letak adalah mungkin untuk menukar layout dari dalam paparan, dan memang menetapkan tambahan yang diperlukan, misalnya,
- Laman judul
- Meta tag
- Skrip (URL atau kod) ke bahagian <head>
- Tambah gaya tambahan, dll
Selain itu yang bahkan mungkin untuk menukar susun letak semua dari dalam paparan dengan menggunakan ...
layout () <php $ this-?> -> setLayout ('alternativeLayout')>? ... Jika diperlukan.
Akhirnya ...
Saya berharap hal ini telah menjadi pengantar kepada untuk Zend_Layout dan Zend_View dan akan membolehkan anda untuk mula menerapkan MVC asas anda sendiri dan meningkatkan maintainibility / diperpanjang kod anda. Sila lihat di kod sumber untuk contoh penggunaan (melihat fail README untuk penggunaan).
Kod menganggap bahawa anda sudah punya autoloading bekerja (atau anda telah memasukkan kelas wajib). Selain itu, saya tidak akan mengesyorkan bahawa anda melaksanakan routing atau data tatacara seperti di atas, ini sangat jauh dimudahkan untuk demonstrasi. Untuk melihat kod penuh melihat kod sumber berkaitan di bahagian atas artikel ini.
Zend Framework versi: 1.10.6


















































Ditulis dengan baik dan paling bermaklumat, thanks!