Zend Framework - Panduan Cepat
Kerangka Web PHP adalah kumpulan kelas yang membantu mengembangkan aplikasi web. Zend adalah salah satu framework PHP paling populer. Ini adalah sebuahopen-source MVC frameworkuntuk aplikasi web modern yang berkembang pesat. Zend Framework memiliki beberapa komponen yang digabungkan secara longgar, sehingga disebut sebagai "Pustaka Komponen". Zend Framework menyediakan tumpukan PHP dan server Zend untuk menjalankan aplikasi kerangka kerja Zend.
Zend Studio adalah IDE yang menyertakan fitur untuk diintegrasikan dengan Zend Framework. Ini menyediakan tampilan MVC dan pembuatan kode. Zend framework 3.0 saat ini menyertakan komponen baru seperti server JSON RPC, konverter XML ke JSON, fungsionalitas PSR-7, dan kompatibilitas dengan PHP 7.
Zend Framework 2 adalah kerangka kerja sumber terbuka untuk mengembangkan aplikasi dan layanan web menggunakan PHP 5.3+. Zend Framework 2 menggunakan 100% kode berorientasi objek dan memanfaatkan sebagian besar fitur baru PHP 5.3, yaituNamespaces, Lambda Functions dan Closures.
Zend Framework 2 berevolusi dari Zend Framework 1, framework PHP yang sukses dengan lebih dari 15 juta unduhan. Zend Server memiliki versi komunitas gratis dan versi komersial.
Fitur Zend Framework
Beberapa fitur penting dari Zend Framework adalah sebagai berikut -
- Kerangka aplikasi web berorientasi objek murni
- Implementasi MVC tingkat lanjut
- Mendukung multi database termasuk PostgreSQL, SQLite dll.,
- Cloud API sederhana
- Manajemen sesi
- Enkripsi data
- Perutean URI Fleksibel
- Zend menyediakan dukungan pengembangan API RESTful.
- Kode dapat digunakan kembali dan lebih mudah dirawat.
Mengapa Zend Framework?
Apa yang membuat Zend Framework salah satu kerangka kerja utama yang digunakan oleh pengembang PHP adalah - ia menyediakan kode yang bersih dan stabil lengkap dengan hak kekayaan intelektual. Itu juga membuat pemrograman lebih mudah. Ini cepat, mudah dipelajari dan kerangka kerja yang nyaman. Zend mendukung alat kriptografi yang kuat dan teknik hashing kata sandi.
Zend Tujuan
Berikut adalah tujuan dari Zend Framework.
- Flexibility
- Sederhana dan produktif
- Compatibility
- Ekstensibilitas - Programmer dapat dengan mudah memperluas semua kelas kerangka kerja.
- Portabilitas - Mendukung banyak lingkungan
Aplikasi Zend
Produk populer berikut dikembangkan dengan menggunakan Zend Framework.
- Situs web McAfee Company
- Situs web Perusahaan IBM
- Magento - salah satu situs keranjang belanja populer.
Keuntungan dari Zend Framework
Beberapa keuntungan Zend Framework tercantum di bawah ini.
Loosely Coupled - Zend menyediakan opsi untuk menghapus modul atau komponen yang tidak kita perlukan di aplikasi.
Performance- Zend Framework sangat dioptimalkan untuk kinerja. Zend Framework 3 4x lebih cepat dari versi sebelumnya.
Security - Kerangka mendukung enkripsi standar industri.
Testing - PHPUnit terintegrasi dengan Zend sehingga Anda dapat dengan mudah menguji frameworknya.
Di bab selanjutnya, kita akan belajar cara menginstal Zend Framework.
Untuk menginstal Zend Framework, kita harus menginstal Composer dan versi PHP terbaru seperti yang ditunjukkan pada langkah-langkah berikut.
Install Composer- Zend menggunakan Composer untuk mengelola dependensinya, jadi pastikan Anda telah menginstal Composer di mesin Anda. Jika Composer belum diinstal, kunjungi situs resmi Composer dan instal.
Install the latest version of PHP- Untuk mendapatkan manfaat maksimal dari Zend Framework, instal versi PHP terbaru. Versi minimum yang dibutuhkan untuk Zend Framework 3 adalah PHP 5.6 atau yang lebih baru.
Instal Zend Framework
Zend Framework dapat diinstal dengan dua cara. Mereka adalah sebagai berikut -
- Instalasi manual
- Instalasi berbasis komposer
Mari kita bahas kedua instalasi ini secara detail.
Instalasi Manual
Unduh versi terbaru Zend Framework dengan mengunjungi tautan berikut - https://framework.zend.com/downloads/archives
Ekstrak konten file arsip yang diunduh ke folder yang Anda inginkan untuk menyimpannya. Setelah Anda memiliki salinan Zend Framework yang tersedia di komputer lokal Anda, aplikasi web berbasis Zend Framework Anda dapat mengakses kelas framework. Meskipun ada beberapa cara untuk mencapai ini, PHP Andainclude_pathperlu memuat jalur ke kelas Zend Framework di bawah direktori / library dalam distribusi. Metode ini hanya berlaku untuk Zend Framework versi 2.4 dan sebelumnya.
Instalasi Berbasis Komposer
Untuk menginstal Zend Framework dengan mudah, gunakan alat Komposer. Ini adalah metode yang disukai untuk menginstal versi terbaru Zend Framework. Untuk menginstal semua komponen Zend Framework, gunakan perintah Composer berikut -
$ composer require zendframework/zendframework
Setiap modul / komponen Zend Framework juga dapat diinstal secara individual. Misalnya, untuk menginstal fileMVC component dari Zend Framework, gunakan yang berikut ini composer perintah -
$ composer require zendframework/zend-mvc
Mari kita buat aplikasi kerangka menggunakan lapisan Zend Framework MVC dan sistem modul.
Instalasi menggunakan Composer
Cara termudah untuk membuat proyek Zend Framework baru adalah dengan menggunakan Komposer. Ini didefinisikan seperti di bawah ini -
$ cd /path/to/install $ composer create-project -n -sdev zendframework/skeleton-application myapp
Anda akan melihat hasil berikut di layar Anda -
Installing zendframework/skeleton-application (dev-master
941da45b407e4f09e264f000fb537928badb96ed)
- Installing zendframework/skeleton-application (dev-master master)
Cloning master
Created project in myapp
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
- Installing zendframework/zend-component-installer (0.3.0)
Loading from cache
- Installing zendframework/zend-stdlib (3.0.1)
Loading from cache
- Installing zendframework/zend-config (2.6.0)
Loading from cache
- Installing zendframework/zend-loader (2.5.1)
Loading from cache
- Installing zendframework/zend-eventmanager (3.0.1)
Loading from cache
- Installing zendframework/zend-view (2.8.0)
Loading from cache
- Installing container-interop/container-interop (1.1.0)
Loading from cache
- Installing zendframework/zend-servicemanager (3.1.0)
Loading from cache
- Installing zendframework/zend-validator (2.8.1)
Loading from cache
- Installing zendframework/zend-escaper (2.5.1)
Loading from cache
- Installing zendframework/zend-uri (2.5.2)
Loading from cache
- Installing zendframework/zend-http (2.5.4)
Loading from cache
- Installing zendframework/zend-router (3.0.2)
Loading from cache
- Installing zendframework/zend-modulemanager (2.7.2)
Loading from cache
- Installing zendframework/zend-mvc (3.0.1)
Loading from cache
- Installing zendframework/zend-skeleton-installer (0.1.3)
Loading from cache
- Installing zfcampus/zf-development-mode (3.0.0)
Loading from cache
zendframework/zend-config suggests installing zendframework/zend-filter
(Zend\Filter component)
zendframework/zend-config suggests installing zendframework/zend-i18n
(Zend\I18n component)
zendframework/zend-config suggests installing zendframework/zend-json
(Zend\Json to use the Json reader or writer classes)
zendframework/zend-view suggests installing zendframework/zend-authentication
(Zend\Authentication component)
zendframework/zend-view suggests installing zendframework/zend-feed
(Zend\Feed component)
zendframework/zend-view suggests installing zendframework/zend-filter
(Zend\Filter component)
zendframework/zend-view suggests installing zendframework/zend-i18n
(Zend\I18n component)
zendframework/zend-view suggests installing zendframework/zend-json
(Zend\Json component)
zendframework/zend-view suggests installing zendframework/zend-navigation
(Zend\Navigation component)
zendframework/zend-view suggests installing zendframework/zend-paginator
(Zend\Paginator component)
zendframework/zend-view suggests installing zendframework/zend-permissions-acl
(Zend\Permissions\Acl component)
zendframework/zend-servicemanager suggests installing ocramius/proxy-manager
(ProxyManager 1.* to handle lazy initialization of services)
zendframework/zend-validator suggests installing zendframework/zend-db
(Zend\Db component)
zendframework/zend-validator suggests installing zendframework/zend-filter
(Zend\Filter component, required by the Digits validator)
zendframework/zend-validator suggests installing zendframework/zend-i18n
(Zend\I18n component to allow translation of validation error messages as well as
to use the various Date validators)
zendframework/zend-validator suggests installing zendframework/zend-i18nresources
(Translations of validator messages)
zendframework/zend-validator suggests installing zendframework/zend-math
(Zend\Math component)
zendframework/zend-validator suggests installing zendframework/zend-session
(Zend\Session component)
zendframework/zend-router suggests installing zendframework/zend-i18n
(^2.6, if defining translatable HTTP path segments)
zendframework/zend-modulemanager suggests installing zendframework/zend-console
(Zend\Console component)
zendframework/zend-mvc suggests installing zendframework/zend-json ((^2.6.1 ||
^3.0) To auto-deserialize JSON body content in AbstractRestfulController
extensions, when json_decode is unavailable)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-console
(zend-mvc-console provides the ability to expose zend-mvc as a console application)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-i18n
(zendmvc-i18n provides integration with zend-i18n, including a translation bridge
and translatable route segments)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-pluginfileprg
(To provide Post/Redirect/Get functionality around forms that container
file uploads)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-pluginflashmessenger
(To provide flash messaging capabilities between requests)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-pluginidentity
(To access the authenticated identity (per zend-authentication) in controllers)
zendframework/zend-mvc suggests installing zendframework/zend-mvc-plugin-prg
(To provide Post/Redirect/Get functionality within controllers)
zendframework/zend-mvc suggests installing zendframework/zend-psr7bridge
((^0.2) To consume PSR-7 middleware within the MVC workflow)
zendframework/zend-mvc suggests installing zendframework/zend-servicemanager-di
(zend-servicemanager-di provides utilities for integrating zend-di and
zendservicemanager in your zend-mvc application)
Generating autoload files
Removing optional packages from composer.json
Updating composer.json
Removing zendframework/zend-skeleton-installer...
- Removing zendframework/zend-skeleton-installer (0.1.3)
Removed plugin zendframework/zend-skeleton-installer.
Removing from composer.json
Complete!
> zf-development-mode enable
You are now in development mode.
Sekarang setelah aplikasi terinstal, Anda dapat mengujinya segera menggunakan PHP's built-in web server -
$ cd path/to/install/myapp $ composer serve
Kemudian Anda akan melihat tanggapan berikut -
> php -S 0.0.0.0:8080 -t public/ public/index.php
Ini akan memulai server CLI built-in PHP pada port 8080. Setelah server pengembangan dimulai, Anda dapat mengunjungi situs di (http://localhost:8080/). Server CLI built-in hanya untuk pengembangan.
Tes Unit
Untuk menjalankan tes unit kerangka, ketik perintah berikut di terminal Anda.
$ composer require --dev zendframework/zend-test
Ini akan menghasilkan respons berikut -
Using version ^3.0 for zendframework/zend-test
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing zendframework/zend-dom (2.6.0)
Loading from cache
- Installing zendframework/zend-console (2.6.0)
Loading from cache
- Installing sebastian/version (2.0.1)
Loading from cache
- Installing symfony/yaml (v3.2.1)
Downloading: 100%
- Installing sebastian/resource-operations (1.0.0)
Loading from cache
- Installing sebastian/recursion-context (2.0.0)
Loading from cache
- Installing sebastian/object-enumerator (2.0.0)
Loading from cache
- Installing sebastian/global-state (1.1.1)
Loading from cache
- Installing sebastian/exporter (2.0.0)
Loading from cache
- Installing sebastian/environment (2.0.0)
Loading from cache
- Installing sebastian/diff (1.4.1)
Loading from cache
- Installing sebastian/comparator (1.2.2)
Loading from cache
- Installing phpunit/php-text-template (1.2.1)
Loading from cache
- Installing doctrine/instantiator (1.0.5)
Loading from cache
- Installing phpunit/phpunit-mock-objects (3.4.3)
Downloading: 100%
- Installing phpunit/php-timer (1.0.8)
Loading from cache
- Installing phpunit/php-file-iterator (1.4.2)
Loading from cache
- Installing sebastian/code-unit-reverse-lookup (1.0.0)
Loading from cache
- Installing phpunit/php-token-stream (1.4.9)
Loading from cache
- Installing phpunit/php-code-coverage (4.0.4)
Downloading: 100%
- Installing webmozart/assert (1.2.0)
Loading from cache
- Installing phpdocumentor/reflection-common (1.0)
Loading from cache
- Installing phpdocumentor/type-resolver (0.2.1)
Loading from cache
- Installing phpdocumentor/reflection-docblock (3.1.1)
Loading from cache
- Installing phpspec/prophecy (v1.6.2)
Loading from cache
- Installing myclabs/deep-copy (1.5.5)
Loading from cache
- Installing phpunit/phpunit (5.7.4)
Downloading: 100%
- Installing zendframework/zend-test (3.0.2)
Loading from cache
zendframework/zend-console suggests installing zendframework/zend-filter
(To support DefaultRouteMatcher usage)
symfony/yaml suggests installing symfony/console (For validating YAML files
using the lint command)
sebastian/global-state suggests installing ext-uopz (*)
phpunit/phpunit-mock-objects suggests installing ext-soap (*)
phpunit/php-code-coverage suggests installing ext-xdebug (>=2.4.0)
phpunit/phpunit suggests installing phpunit/php-invoker (~1.1)
phpunit/phpunit suggests installing ext-xdebug (*)
zendframework/zend-test suggests installing zendframework/zend-mvc-console
(^1.1.8, to test MVC <-> console integration)
Writing lock file
Generating autoload files
Sekarang dukungan pengujian diaktifkan sehingga Anda dapat menjalankan pengujian menggunakan perintah berikut.
$ ./vendor/bin/phpunit
Server Web Apache
Menghosting aplikasi berbasis Zend Framework di lingkungan produksi sangat sederhana dan mudah. Buat sajaVirtualHost di file konfigurasi Apache dan arahkan DocumentRoot ke Public folder dari aplikasi Zend Framework.
Contoh konfigurasi (myapp) diberikan di bawah ini -
<VirtualHost *:80>
ServerName myapp.localhost
DocumentRoot /path/to/install/myapp/public
<Directory /path/to/install/myapp/public>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
</VirtualHost>
Sebelum melanjutkan dengan bab ini, marilah kita memiliki pemahaman singkat tentang MVC. SEBUAHModel View Controlleradalah pendekatan perangkat lunak yang memisahkan logika aplikasi dari presentasi. Dalam praktiknya, ini mengizinkan halaman web untuk memuat skrip PHP minimal karena presentasi terpisah darinya.
Deskripsi singkat dari Komponen MVC adalah sebagai berikut
Model- Model merepresentasikan struktur data aplikasi. Biasanya, kelas model berisi fungsi yang membanturetrieve, insert dan update business data di database back-end (MySQL, PostgreSQL, dll.).
View- View adalah lapisan presentasi dari Aplikasi MVC. Itu mendapatkan data model melalui Controller dan menampilkannya sesuai kebutuhan. Ini digabungkan secara longgar keController dan Model dan karenanya, dapat diubah tanpa memengaruhi Model dan Kontroler.
Controller- Controller adalah komponen utama dari arsitektur MVC. Setiap permintaan pertama kali mengenai pengontrol. Dengan kata lain, pengontrol memproses semua permintaan dan berfungsi sebagai perantara antara Model, View, dan sumber daya lain yang diperlukan untukprocess the HTTP request dan untuk menghasilkan tanggapan.
Pada bab berikutnya, kita akan memahami berbagai konsep Zend Framework.
Zend Framework adalah kumpulan dari 60+ komponen. Mereka terhubung secara longgar satu sama lain. Mereka dapat digunakan sebagai komponen yang berdiri sendiri serta sekelompok komponen yang bekerja sebagai satu kesatuan.
Zend Framework menyediakan tiga komponen terpenting, yaitu -
- zend-servicemanager
- zend-eventmanager dan
- zend-modulemanager.
Mereka menyediakan komponen Zend kemampuan untuk berintegrasi dengan komponen lain secara efisien.
Event Manager- Ini memberi kemampuan untuk membuat pemrograman berbasis acara. Ini membantu membuat, memasukkan, dan mengelola acara baru.
Service Manager - Ini memberikan kemampuan untuk mengkonsumsi layanan apa pun (kelas PHP) dari mana saja dengan sedikit usaha.
Module Manager - Kemampuan untuk mengubah kumpulan kelas PHP dengan fungsi serupa menjadi satu unit yang disebut sebagai a module. Modul yang baru dibuat dapat digunakan, dipelihara dan dikonfigurasi sebagai satu kesatuan.
Kami akan membahas konsep-konsep ini secara rinci pada bab-bab selanjutnya.
Zend Framework menyertakan implementasi pola pencari lokasi layanan yang disebut zend-servicemanager. Zend framework secara ekstensif menggunakan manajer layanan untuk semua fungsinya. Manajer Layanan menyediakan abstraksi tingkat tinggi untuk Zend Framework. Ini juga terintegrasi dengan baik dengan semua komponen lain dari Zend Framework.
Instal Manajer Layanan
Komponen Service Manager dapat diinstal menggunakan composer alat.
composer require zendframework/zend-servicemanager
Contoh
Pertama, semua layanan harus didaftarkan ke manajer layanan. Setelah layanan didaftarkan ke sistem manajer server, layanan dapat diakses kapan saja dengan sedikit usaha. Manajer layanan menyediakan banyak opsi untuk mendaftarkan layanan. Contoh sederhananya adalah sebagai berikut -
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\InvokableFactory;
use stdClass;
$serviceManager = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class,],
]);
Kode di atas mendaftarkan stdClass ke dalam sistem menggunakan Factorypilihan. Sekarang, kita bisa mendapatkan instance dari stdClass kapan saja menggunakanget() metode manajer layanan seperti yang ditunjukkan di bawah ini.
use Zend\ServiceManager\ServiceManager;
$object = $serviceManager->get(stdClass::class);
Metode get () membagikan objek yang diambil dan karenanya, objek yang dikembalikan dengan memanggil metode get () beberapa kali adalah satu instance yang sama. Untuk mendapatkan contoh yang berbeda setiap saat, manajer layanan menyediakan metode lain, yaitubuild() metode.
use Zend\ServiceManager\ServiceManager;
$a = $serviceManager->build(stdClass::class); $b = $serviceManager->build(stdClass::class);
Pendaftaran Manajer Layanan
Manajer layanan menyediakan sekumpulan metode untuk mendaftarkan sebuah komponen. Beberapa metode terpenting adalah seperti yang diberikan di bawah ini -
- Metode pabrik
- Metode pabrik abstrak
- Metode penginisialisasi
- Metode pabrik pendelegator
Kami akan membahas masing-masing secara rinci di bab-bab selanjutnya.
Metode Pabrik
Pabrik pada dasarnya adalah setiap kelas yang dapat dipanggil atau kelas apa pun yang mengimplementasikan FactoryInterface (Zend \ ServiceManager \ Factory \ FactoryInterface).
FactoryInterface memiliki satu metode -
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
Detail argumen dari FactoryInterface adalah sebagai berikut -
container (ContainerInterface)- Ini adalah antarmuka dasar dari ServiceManager. Ini memberikan opsi untuk mendapatkan layanan lain.
requestedName - Ini adalah nama layanan.
options - Ini memberikan opsi tambahan yang dibutuhkan untuk layanan.
Mari kita buat kelas sederhana yang mengimplementasikan FactoryInterface dan melihat cara mendaftarkan kelas tersebut.
Tes Kelas - Objek yang akan Diperoleh
use stdClass;
class Test {
public function __construct(stdClass $sc) { // use $sc
}
}
Itu Test kelas tergantung pada stdClass tersebut.
Kelas TestFactory - Kelas untuk Menginisialisasi Objek Uji
class TestFactory implements FactoryInterface {
public function __invoke(ContainerInterface $container, $requestedName,
array $options = null) { $dep = $container->get(stdClass::class); return new Test($dep);
}
}
TestFactory menggunakan container untuk mengambil stdClass, membuat instance kelas Test, dan mengembalikannya.
Pendaftaran dan Penggunaan Zend Framework
Sekarang mari kita mengerti cara mendaftar dan menggunakan Zend Framework.
serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class, Test::class => TestFactory::class] ]); $test = $sc->get(Test::class);
Manajer layanan menyediakan pabrik khusus yang disebut InvokableFactoryuntuk mengambil kelas apa pun yang tidak memiliki ketergantungan. Misalnya, filestdClass dapat dikonfigurasi menggunakan InvokableFactory karena stdClass tidak bergantung pada kelas lain.
serviceManager $sc = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class]
]);
$stdC = $sc->get(stdClass::class);
Cara lain untuk mengambil objek tanpa mengimplementasikan FactoryInterface atau menggunakan InvokableFactory menggunakan metode sebaris seperti yang diberikan di bawah ini.
$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class, Test::class => function(ContainerInterface $container, $requestedName) { $dep = $container->get(stdClass::class); return new Test($dep);
},
],
]);
Metode Pabrik Abstrak
Terkadang, kita mungkin perlu membuat objek, yang baru kita ketahui saat runtime. Situasi ini dapat ditangani dengan menggunakanAbstractFactoryInterface, yang diturunkan dari FactoryInterface.
AbstractFactoryInterface mendefinisikan metode untuk memeriksa apakah objek dapat dibuat pada instance yang diminta atau tidak. Jika pembuatan objek dimungkinkan, itu akan membuat objek menggunakan__invokemethod dari FactoryInterface dan mengembalikannya.
Tanda tangan dari AbstractFactoryInterface adalah sebagai berikut -
public function canCreate(ContainerInterface $container, $requestedName)
Metode Penginisialisasi
Metode Penginisialisasi adalah opsi khusus untuk memasukkan ketergantungan tambahan untuk layanan yang sudah dibuat. Ini mengimplementasikanInitializerInterface dan tanda tangan dari satu-satunya metode yang tersedia adalah sebagai berikut -
public function(ContainerInterface $container, $instance)
function(ContainerInterface $container, $instance) {
if (! $instance instanceof EventManagerAwareInterface) { return; } $instance->setEventManager($container->get(EventManager::class));
}
Dalam contoh di atas, metode memeriksa apakah instance berjenis EventManagerAwareInterface. Jika itu tipeEventManagerAwareInterface, ini menyetel objek pengelola acara, jika tidak, tidak. Karena, metode ini mungkin atau mungkin tidak menyetel ketergantungan, metode ini tidak dapat diandalkan dan menghasilkan banyak masalah waktu proses.
Metode Pabrik Delegator
Zend Framework mendukung pola delegator melalui DelegatorFactoryInterface. Ini dapat digunakan untuk mendekorasi layanan.
Tanda tangan dari fungsi ini adalah sebagai berikut -
public function __invoke(ContainerInterface $container,
$name, callable $callback, array $options = null
);
Di sini $callback bertanggung jawab untuk mendekorasi instance layanan.
Layanan Malas
Layanan malas adalah salah satu layanan yang tidak akan sepenuhnya diinisialisasi pada saat pembuatan. Mereka hanya direferensikan dan hanya diinisialisasi ketika benar-benar dibutuhkan. Salah satu contoh terbaik adalah koneksi database, yang mungkin tidak diperlukan di semua tempat. Ini adalah sumber daya yang mahal serta memiliki proses yang memakan waktu untuk membuatnya. Zend framework menyediakanLazyServiceFactory berasal dari DelegatorFactoryInterface, yang dapat menghasilkan layanan malas dengan bantuan Delegator konsep dan pengelola proxy pihak ke-3, yang disebut sebagai ocramius proxy manager.
Manajer Plugin
Manajer Plugin memperluas manajer layanan dan menyediakan fungsionalitas tambahan seperti validasi instance. Zend Framework secara ekstensif menggunakan pengelola plugin.
Misalnya, semua layanan validasi berada di bawah ValidationPluginManager.
Opsi Konfigurasi
Manajer layanan memberikan beberapa opsi untuk memperluas fitur manajer layanan. Merekashared, shared_by_default dan aliases. Seperti yang kita bahas sebelumnya, objek yang diambil dibagikan di antara objek yang diminta secara default dan kita bisa menggunakanbuild()metode untuk mendapatkan objek yang berbeda. Kita juga bisa menggunakansharedopsi untuk menentukan layanan mana yang akan dibagikan. Itushared_by_default sama dengan shared fitur, kecuali itu berlaku untuk semua layanan.
$serviceManager = new ServiceManager([
'factories' => [
stdClass::class => InvokableFactory::class
],
'shared' => [
stdClass::class => false // will not be shared
],
'shared_by_default' => false, // will not be shared and applies to all service
]);
Itu aliasesopsi dapat digunakan untuk memberikan nama alternatif untuk layanan terdaftar. Ini memiliki kelebihan dan kekurangan. Sisi positifnya, kami dapat memberikan nama pendek alternatif untuk layanan. Namun, pada saat yang sama, nama tersebut mungkin keluar dari konteks dan menimbulkan bug.
aliases' => ['std' => stdClass::class, 'standard' => 'std']
Semua aplikasi modern membutuhkan komponen acara yang solid dan fleksibel. Zend Framework menyediakan satu komponen seperti itu,zend-eventmanager. Zend-eventmanager membantu merancang arsitektur tingkat tinggi dan mendukung pola subjek / pengamat dan pemrograman berorientasi aspek.
Instal Manajer Acara
Manajer acara dapat diinstal menggunakan Composer seperti yang ditentukan di bawah ini -
composer require zendframework/zend-eventmanager
Konsep Manajer Acara
Konsep inti dari manajer acara adalah sebagai berikut -
Event - Peristiwa disebut tindakan sewenang-wenang, katakanlah greet.
Listener- Semua panggilan balik PHP. Mereka dilampirkan ke acara dan dipanggil saat acara dipicu. Tanda tangan default Pendengar adalah -
function(EventInterface $e)
EventInterface Class- Digunakan untuk menentukan acara itu sendiri. Ini memiliki metode untuk mengatur dan mendapatkan informasi acara seperti nama (set / getName), target (get / setTarget) dan parameter (get / setParams).
EventManager class- Instance EventManager melacak semua kejadian yang ditentukan dalam aplikasi dan pemrosesnya yang sesuai. EventManager menyediakan metode,attach untuk melampirkan pemroses ke suatu acara dan menyediakan metode, triggeruntuk memicu peristiwa yang telah ditentukan sebelumnya. Setelah pemicu dipanggil, EventManager memanggil listener yang terpasang padanya.
EventManagerAwareInterface- Agar kelas mendukung pemrograman berbasis peristiwa, ia perlu mengimplementasikan EventManagerAwareInterface. Ini menyediakan dua metode,setEventManager dan getEventManager untuk mendapatkan dan menyetel pengelola acara.
Contoh
Mari kita tulis aplikasi konsol PHP sederhana untuk memahami konsep pengelola acara. Ikuti langkah-langkah yang diberikan di bawah ini.
Buat folder "eventapp".
Install zend-eventmanager menggunakan komposer.
Buat file PHP Greeter.php di dalam folder "eventapp".
Buat kelas Greeter dan menerapkan EventManagerAwareInterface.
require __DIR__ . '/vendor/autoload.php';
class Greeter implements EventManagerAwareInterface {
// code
}
Sini, require digunakan untuk memuat otomatis semua komponen yang diinstal komposer.
Tulis setEventManager metode di kelas Greeter seperti yang ditunjukkan di bawah ini -
public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([ __CLASS__, get_called_class(),]);
$this->events = $events;
return $this;
}
Metode ini menyetel kelas saat ini ke dalam pengelola acara yang diberikan (argumen $ peristiwa) dan kemudian menyetel pengelola acara di variabel lokal $events.
Langkah selanjutnya adalah menulis file getEventManager metode di kelas Greeter seperti yang ditunjukkan di bawah ini -
public function getEventManager() {
if (null === $this->events) {
$this->setEventManager(new EventManager()); } return $this->events;
}
Metode ini mendapatkan pengelola acara dari variabel lokal. jika tidak tersedia, maka itu membuat instance pengelola acara dan mengembalikannya.
Tulis metode, greet, di kelas Greeter.
public function greet($message) { printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, $message ]);
}
Metode ini membuat pengelola acara dan mengaktifkan / memicu kejadian yang dilampirkan padanya.
Langkah selanjutnya adalah membuat instance dari Greeter kelas dan lampirkan pendengar ke metodenya, greet.
$greeter = new Greeter();
$greeter->getEventManager()->attach('greet', function($e) {
$event_name = $e->getName();
$target_name = get_class($e->getTarget());
$params_json = json_encode($e->getParams());
printf("\"%s\" event of class \"%s\" is called." .
" The parameter supplied is %s\n",
$event_name, $target_name,
$params_json);
});
Callback pendengar hanya mencetak nama peristiwa, target, dan parameter yang disediakan.
Daftar lengkap dari Greeter.php adalah sebagai berikut -
<?php
require __DIR__ . '/vendor/autoload.php';
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
class Greeter implements EventManagerAwareInterface {
protected $events;
public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([__CLASS__, get_called_class(), ]);
$this->events = $events;
return $this; } public function getEventManager() { if (null === $this->events) {
$this->setEventManager(new EventManager()); } return $this->events;
}
public function greet($message) { printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, [$message ]); } } $greeter = new Greeter();
$greeter->greet("Hello"); $greeter->getEventManager()->attach('greet', function($e) { $event_name = $e->getName(); $target_name = get_class($e->getTarget()); $params_json = json_encode($e->getParams()); printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n", $event_name,
$target_name, $params_json);
});
$greeter->greet("Hello");
Sekarang, jalankan aplikasi di command prompt php Greeter.php dan hasilnya adalah sebagai berikut -
"Hello" from class
"Hello" from class
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]
Aplikasi contoh di atas hanya menjelaskan dasar-dasar pengelola acara. Manajer acara menyediakan lebih banyak opsi lanjutan sepertiListener Priority, Custom Callback Prototype / Signature, Short Circuiting, dll. Manajer acara digunakan secara luas dalam kerangka MVC Zend.
Zend Framework menyediakan sistem modul yang kuat. Sistem modul memiliki tiga komponen. Mereka adalah sebagai berikut -
Module Autoloader- Module Autoloader bertanggung jawab untuk mencari dan memuat modul dari berbagai sumber. Itu dapat memuat modul yang dikemas sebagaiPhar archivesdemikian juga. Implementasi Module Autoloader terletak di myapp / vendor / zendframework / zend-loader / src / ModuleAutoloader.php.
Module Manager- Setelah Module Autoloader menemukan modul, pengelola modul mengaktifkan urutan kejadian untuk setiap modul. Implementasi dari Module Manager terletak di myapp / vendor / zendframework / zendmodulemanager / src / ModuleManager.php.
Module Manager Listeners- Mereka dapat dilampirkan ke acara yang dipicu oleh Manajer Modul. Dengan melampirkan peristiwa manajer modul, mereka dapat melakukan segalanya mulai dari menyelesaikan dan memuat modul hingga melakukan pekerjaan kompleks untuk setiap modul.
Sistem Modul Web MVC
Aplikasi Web MVC di Zend Framework biasanya ditulis sebagai Modul. Sebuah situs web dapat berisi satu atau lebih modul yang dikelompokkan berdasarkan fungsionalitas. Struktur yang direkomendasikan untuk modul Berorientasi MVC adalah sebagai berikut -
module_root/
Module.php
autoload_classmap.php
autoload_function.php
autoload_register.php
config/
module.config.php
public/
images/
css/
js/
src/
<module_namespace>/
<code files>
test/
phpunit.xml
bootstrap.php
<module_namespace>/
<test code files>
view/
<dir-named-after-module-namespace>/
<dir-named-after-a-controller>/
<.phtml files>
Strukturnya sama seperti yang dibahas pada bab sebelumnya, tetapi di sini bersifat umum. Ituautoload_ files dapat digunakan sebagai mekanisme default untuk memuat otomatis kelas yang tersedia dalam modul tanpa menggunakan lanjutan Module Manager tersedia di zend-modulemanager.
autoload_classmap.php - Mengembalikan larik nama kelas dan nama file yang sesuai.
autoload_function.php- Mengembalikan callback PHP. Ini dapat memanfaatkan kelas yang dikembalikan oleh autoload_classmap.php.
autoload_register.php - Mendaftarkan callback PHP yang dikembalikan oleh autoload_function.php.
File muat otomatis ini tidak diperlukan tetapi direkomendasikan. Dalam aplikasi kerangka, kami belum menggunakanautoload_ files.
Kelas Modul
Kelas Modul harus diberi nama Module dan namespace dari kelas modul harus Module name. Ini akan membantu Zend Framework untuk menyelesaikan dan memuat modul dengan mudah. ItuApplication kode modul dalam aplikasi kerangka (myapp), myapp / module / Application / src / Module.php adalah sebagai berikut -
namespace Application;
class Module {
const VERSION = '3.0.2dev';
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
Manajer modul Zend Framework akan memanggil file getConfig() berfungsi secara otomatis dan akan melakukan langkah-langkah yang diperlukan.
Pada bab ini, mari kita pahami struktur aplikasi Zend Framework. Strukturmyapp aplikasi adalah sebagai berikut -
├── composer.json
├── composer.lock
├── CONDUCT.md
├── config
│ ├── application.config.php
│ ├── autoload
│ │ ├── development.local.php
│ │ ├── development.local.php.dist
│ │ ├── global.php
│ │ ├── local.php.dist
│ │ ├── README.md
│ │ └── zend-developer-tools.local-development.php
│ ├── development.config.php
│ ├── development.config.php.dist
│ └── modules.config.php
├── CONTRIBUTING.md
├── data
│ └── cache
│ └── module-classmap-cache.application.module.cache.php ├── docker-compose.yml
├── Dockerfile
├── LICENSE.md
├── module
│ └── Application
│ ├── config
│ ├── src
│ ├── test
│ └── view
├── phpcs.xml
├── phpunit.xml.dist
├── public
│ ├── css
│ │ ├── bootstrap.css
│ │ ├── bootstrap.css.map
│ │ ├── bootstrap.min.css
│ │ ├── bootstrap.min.css.map
│ │ ├── bootstrap-theme.css
│ │ ├── bootstrap-theme.css.map
│ │ ├── bootstrap-theme.min.css
│ │ ├── bootstrap-theme.min.css.map
│ │ └── style.css
│ ├── fonts
│ │ ├── glyphicons-halflings-regular.eot
│ │ ├── glyphicons-halflings-regular.svg
│ │ ├── glyphicons-halflings-regular.ttf
│ │ ├── glyphicons-halflings-regular.woff
│ │ └── glyphicons-halflings-regular.woff2
│ ├── img
│ │ ├── favicon.ico
│ │ └── zf-logo-mark.svg
│ ├── index.php
│ ├── js
│ │ ├── bootstrap.js
│ │ ├── bootstrap.min.js
│ │ └── jquery-3.1.0.min.js
│ └── web.config
├── README.md
├── TODO.md
├── Vagrantfile
└── vendor
├── autoload.php
├── bin
│ ├── phpunit -> ../phpunit/phpunit/phpunit
│ ├── templatemap_generator.php -> ../zendframework/zend-
view/bin/templatemap_generator.php
│ └── zf-development-mode -> ../zfcampus/zf-development-mode/bin/zf-
development-mode
├── composer
│ ├── autoload_classmap.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
├── container-interop
│ └── container-interop
├── doctrine
│ └── instantiator
├── myclabs
│ └── deep-copy
├── phpdocumentor
│ ├── reflection-common
│ ├── reflection-docblock
│ └── type-resolver
├── phpspec
│ └── prophecy
├── phpunit
│ ├── php-code-coverage
│ ├── php-file-iterator
│ ├── php-text-template
│ ├── php-timer
│ ├── php-token-stream
│ ├── phpunit
│ └── phpunit-mock-objects
├── sebastian
│ ├── code-unit-reverse-lookup
│ ├── comparator
│ ├── diff
│ ├── environment
│ ├── exporter
│ ├── global-state
│ ├── object-enumerator
│ ├── recursion-context
│ ├── resource-operations
│ └── version
├── symfony
│ └── yaml
├── webmozart
│ └── assert
├── zendframework
│ ├── zend-component-installer
│ ├── zend-config
│ ├── zend-console
│ ├── zend-dom
│ ├── zend-escaper
│ ├── zend-eventmanager
│ ├── zend-http
│ ├── zend-loader
│ ├── zend-modulemanager
│ ├── zend-mvc
│ ├── zend-router
│ ├── zend-servicemanager
│ ├── zend-stdlib
│ ├── zend-test
│ ├── zend-uri
│ ├── zend-validator
│ └── zend-view
└── zfcampus
└── zf-development-mode
73 directories, 55 files
Aplikasi Zend Framework terdiri dari folder yang berbeda. Mereka adalah sebagai berikut -
Application- Direktori ini berisi aplikasi Anda. Ini akan menampung sistem MVC, serta konfigurasi, layanan yang digunakan dan file bootstrap Anda.
Config - Direktori ini berisi file konfigurasi aplikasi.
Data - Direktori ini menyediakan tempat untuk menyimpan data aplikasi yang tidak stabil dan mungkin bersifat sementara.
Module - Modul memungkinkan pengembang untuk mengelompokkan sekumpulan pengontrol terkait ke dalam grup yang diatur secara logis.
Public- Ini adalah dokumen root aplikasi. Ini memulai aplikasi Zend. Ini juga berisi aset aplikasi seperti JavaScript, CSS, Gambar, dll.
Vendor - Direktori ini berisi dependensi komposer.
Struktur Modul Aplikasi
Ini adalah direktori utama aplikasi Anda. Zend Framework 2 memperkenalkan sistem modul yang kuat dan fleksibel untuk mengatur aplikasi secara efisien. ItuApplicationmodul aplikasi kerangka (myapp) menyediakan konfigurasi bootstrap, kesalahan, dan perutean ke seluruh aplikasi. StrukturApplication modul seperti yang ditunjukkan di bawah ini -
├── module
│ └── Application
│ ├── config
│ │ └── module.config.php
│ ├── src
│ │ ├── Controller
│ │ │ └── IndexController.php
│ │ └── Module.php
│ ├── test
│ │ └── Controller
│ │ └── IndexControllerTest.php
│ └── view
│ ├── application
│ │ └── index
│ │ └── index.phtml
│ ├── error
│ │ ├── 404.phtml
│ │ └── index.phtml
│ └── layout
│ └── layout.phtml
Mari kita bahas setiap direktori modul ini secara rinci -
Application- Ini adalah direktori root dari modul. Nama folder akan cocok dengan nama modul dan namanya juga digunakan sebagai namespace PHP dari semua kelas yang ditentukan di dalam modul. Ini akan menampung sistem MVC, serta konfigurasi, layanan yang digunakan, dan file bootstrap Anda.
Config - Konfigurasi modul independen.
Src - Logika bisnis utama aplikasi.
View- Berisi file desain / presentasi (HTML). Misalnya, index.phtml.
src/Module.php- Ini adalah inti dari modul. Ia bekerja sebagai "pengontrol depan" untuk modul. Proses Zendsrc/Module.php file sebelum memproses Kelas PHP apa pun dalam modul ini.
Application/config/module.config.php - Ini diimplementasikan untuk konfigurasi router dan file pemuatan otomatis.
Application/view/layout- Tata letak mewakili bagian umum dari beberapa tampilan. Misalnya, header dan footer halaman. Secara default, tata letak harus disimpan diviews/layoutsfolder.
Semua modul memiliki struktur yang sama atau mirip seperti modul Aplikasi di atas .
Pada bab ini, kita akan mempelajari cara membuat modul berbasis MVC di Zend Framework. Mari kita buat modul bernamaTutorial untuk memahami proses pembuatan modul.
Buat kelas PHP baru bernama Module di dalam direktori –myapp / module / Tutorial / src / dan implementasikan ConfigProviderInterface.
Set Tutorial sebagai namespace untuk Module kelas.
Tulis fungsi publik getConfig dalam Module kelas dan mengembalikan file konfigurasi untuk Tutorial Modul.
Kode lengkap untuk Module kelas adalah sebagai berikut -
<?php
namespace Tutorial;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
Konfigurasikan Tutorial modul di composer.json di bawah autoload bagian dengan menggunakan kode berikut.
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Tutorial\\": "module/Tutorial/src/"
}
}
Perbarui aplikasi menggunakan komposer update perintah seperti yang ditunjukkan di bawah ini.
composer update
Itu composer perintah akan melakukan perubahan yang diperlukan pada aplikasi dan menampilkan log di command prompt seperti yang ditunjukkan di bawah ini -
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Removing zendframework/zend-component-installer (0.3.0)
- Installing zendframework/zend-component-installer (0.3.1)
Downloading: 100%
- Removing zendframework/zend-stdlib (3.0.1)
- Installing zendframework/zend-stdlib (3.1.0)
Loading from cache
- Removing zendframework/zend-eventmanager (3.0.1)
- Installing zendframework/zend-eventmanager (3.1.0)
Downloading: 100%
- Removing zendframework/zend-view (2.8.0)
- Installing zendframework/zend-view (2.8.1)
Loading from cache
- Removing zendframework/zend-servicemanager (3.1.0)
- Installing zendframework/zend-servicemanager (3.2.0)
Downloading: 100%
- Removing zendframework/zend-escaper (2.5.1)
- Installing zendframework/zend-escaper (2.5.2)
Loading from cache
- Removing zendframework/zend-http (2.5.4)
- Installing zendframework/zend-http (2.5.5)
Loading from cache
- Removing zendframework/zend-mvc (3.0.1)
- Installing zendframework/zend-mvc (3.0.4)
Downloading: 100%
- Removing phpunit/phpunit (5.7.4)
- Installing phpunit/phpunit (5.7.5)
Downloading: 100%
Writing lock file
Generating autoload files
Buat file konfigurasi modul, "module.config.php" di /config/ dengan kode berikut -
<?php
namespace Tutorial;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [Controller\TutorialController::class => InvokableFactory::class,],
],
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
],
];
File konfigurasi memiliki tiga bagian dan sebagai berikut -
Controller configuration - Tentukan pengontrol yang tersedia di dalam Modul.
Routing configuration - Tentukan bagaimana pengontrol dalam modul harus diselesaikan menjadi URL.
View configuration - Tentukan konfigurasi yang terkait dengan tampilan mesin seperti lokasi tampilan, dll.
Konfigurasikan Tutorial modul dalam file konfigurasi tingkat aplikasi - myapp / config / modules.config.php.
return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial'];
Jalankan aplikasi dengan menjalankan composer serve di root folder aplikasi.
Kami telah berhasil menambahkan modul baru, tetapi kami masih perlu menambahkan Controller, Routing dan Views agar berhasil menjalankan Tutorial modul.
Seperti yang telah dibahas sebelumnya, file controllermemainkan peran penting dalam Zend MVC Framework. Semua halaman web dalam aplikasi perlu ditangani oleh pengontrol.
Dalam Zend MVC Framework, pengontrol adalah objek yang mengimplementasikan - Zend / Stdlib / DispatchableInterface. ItuDispatchableInterface memiliki satu metode, dispatch, yang mendapatkan Request objek sebagai masukan, lakukan beberapa logika dan pengembalian Response sebuah objek sebagai keluaran.
dispatch(Request $request, Response $response = null)
Contoh sederhana dari objek Controller untuk mengembalikan "Hello World" adalah sebagai berikut -
use Zend\Stdlib\DispatchableInterface;
use Zend\Stdlib\RequestInterface as Request;
use Zend\Stdlib\ResponseInterface as Response;
class HelloWorld implements DispatchableInterface {
public function dispatch(Request $request, Response $response = null) { $response->setContent("Hello World!");
}
}
Itu DispatchableInterfaceadalah dasar dan membutuhkan banyak antarmuka lain untuk menulis pengontrol tingkat tinggi. Beberapa antarmuka tersebut adalah sebagai berikut -
InjectApplicationEventInterface - Digunakan untuk menyuntikkan acara (Zend EventManager)
ServiceLocatorAwareInterface - Digunakan untuk mencari Layanan (Zend ServiceManager)
EventManagerAwareInterface - Digunakan untuk mengelola acara (Zend EventManager)
Dengan mengingat hal-hal ini, Zend Framework menyediakan banyak pengontrol siap pakai yang mengimplementasikan antarmuka ini. Pengontrol yang paling penting dijelaskan di bawah ini.
AbstractActionController
AbstractActionController (Zend / Mvc / Controller / AbstractActionController) adalah pengontrol yang paling banyak digunakan dalam Zend MVC Framework. Ia memiliki semua fitur yang diperlukan untuk menulis halaman web yang khas. Ini memungkinkan rute (Routing mencocokkan url permintaan ke pengontrol dan salah satu metodenya) untuk mencocokkanaction. Jika cocok, metode yang dinamai setelah tindakan akan dipanggil oleh pengontrol.
Misalnya jika sebuah rute test cocok dan rutenya, test kembali hello untuk tindakan, lalu helloAction metode akan dipanggil.
Mari kita tulis TutorialController menggunakan AbstractActionController.
Buat kelas PHP baru bernama TutorialController dengan memperpanjang AbstractActionController dan letakkan di module/Tutorial/src/Controller/ direktori.
Mengatur Tutorial\Controller sebagai namespace.
Menulis sebuah indexAction metode.
Kembalikan ViewModel objek dari indexActionmetode. ItuViewModel object digunakan untuk mengirim data dari controller ke view engine, yang akan kita lihat pada bab-bab selanjutnya.
Daftar kode lengkapnya adalah sebagai berikut -
?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
Kami telah berhasil menambahkan yang baru TutorialController.
AbstractRestfulController
AbstractRestfulController (Zend \ Mvc \ Controller \ AbstractRestfulController) memeriksa HTTP method dari permintaan yang masuk dan mencocokkan tindakan (metode) dengan mempertimbangkan metode HTTP
Misalnya, permintaan dengan metode HTTP GET cocok dengan getList() metode atau get() metode, jika id parameter ditemukan dalam permintaan.
AbstractConsoleController
AbstractConsoleController (Zend \ Mvc \ Controller \ AbstractConsoleController) seperti AbstractActionController kecuali bahwa ia hanya berjalan di lingkungan konsol, bukan di browser.
Peta perutean Request URIke metode pengontrol tertentu. Pada bab ini, kita akan melihat bagaimana mengimplementasikan rute dalam Zend Framework.
Secara umum, setiap URI memiliki tiga bagian -
- Segmen nama host,
- Segmen jalur, dan
- Segmen kueri.
Misalnya, di URI / URL - http://www.example.com/index?q=data, www.example.com adalah Segmen Nama Inang, index adalah Segmen Jalan dan q=dataadalah Segmen Kueri. Umumnya, routing memeriksa filePage segmentterhadap satu set kendala. Jika ada batasan yang cocok, maka itu mengembalikan satu set nilai. Salah satu nilai utamanya adalah pengontrol.
Routing juga memeriksa segmen host, segmen query, metode HTTP permintaan, header HTTP permintaan, dll., Dalam situasi tertentu.
Route & RouteStack
Rute adalah objek utama dalam perutean. Zend Framework memiliki antarmuka khusus untuk objek rute,RouteInterface. Semua objek rute perlu mengimplementasikan RouteInterface. Daftar lengkap RouteInterface adalah sebagai berikut -
namespace Zend\Mvc\Router;
use Zend\Stdlib\RequestInterface as Request;
interface RouteInterface {
public static function factory(array $options = []); public function match(Request $request);
public function assemble(array $params = [], array $options = []);
}
Metode utamanya adalah match. Metode pencocokan ini memeriksa permintaan yang diberikan terhadap batasan yang ditentukan di dalamnya. Jika ada kecocokan yang ditemukan, itu mengembalikanRouteMatchobyek. Objek RouteMatch ini memberikan detail permintaan yang cocok sebagai parameter. Parameter ini dapat diekstraksi dariRouteObject menggunakan getParams metode.
Daftar lengkap RouteObject adalah sebagai berikut -
namespace Zend\Mvc\Router;
class RouteMatch {
public function __construct(array $params); public function setMatchedRouteName($name);
public function getMatchedRouteName();
public function setParam($name, $value);
public function getParams();
public function getParam($name, $default = null);
}
Secara umum, aplikasi MVC memiliki banyak rute. Setiap rute ini akan diproses dalam urutan LIFO dan satu rute akan dicocokkan dan dikembalikan. Jika tidak ada rute yang cocok / dikembalikan, maka aplikasi mengembalikan kesalahan "Halaman tidak ditemukan". Zend Framework menyediakan antarmuka untuk memproses rute,RouteStackInterface. RouteStackInterface ini memiliki opsi untuk menambah / menghapus rute.
Daftar lengkap RouteStackInterface adalah sebagai berikut -
namespace Zend\Mvc\Router;
interface RouteStackInterface extends RouteInterface {
public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes);
public function removeRoute($name); public function setRoutes(array $routes);
}
Zend framework menyediakan dua implementasi dari RouteStack antarmuka dan mereka adalah sebagai berikut -
- SimpleRouteStack
- TreeRouteStack
Jenis Rute
Zend framework menyediakan banyak objek rute yang sudah jadi untuk semua situasi di bawah namespace "Zend \ Mvc \ Router \ Http". Cukup memilih dan menggunakan objek rute yang tepat untuk situasi tertentu.
Rute yang tersedia adalah sebagai berikut -
Hostname - Digunakan untuk mencocokkan bagian host dari URI.
Literal - Digunakan untuk mencocokkan URI persis.
Method - Digunakan untuk mencocokkan metode HTTP dari permintaan yang masuk.
Part - Digunakan untuk mencocokkan bagian segmen jalur URI menggunakan logika khusus.
Regex - Digunakan untuk mencocokkan segmen jalur URI menurut Pola Regex.
Schema - Digunakan untuk mencocokkan Skema URI seperti http, https, dll.
Segment - Digunakan untuk mencocokkan jalur URI dengan membaginya menjadi beberapa segmen.
Mari kita lihat bagaimana menulis Rute literal dan segmen yang paling umum digunakan. Rute biasanya ditentukan di setiap file konfigurasi modul -module.config.php.
Rute Literal
Biasanya, rute dikueri dalam urutan LIFO. Rute literal adalah untuk melakukan pencocokan tepat dari jalur URI.
Ini didefinisikan seperti yang ditunjukkan di bawah ini -
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
Rute di atas cocok dengan /path di url permintaan dan kembali index sebagai action dan IndexController sebagai pengontrol.
Rute Segmen
Rute tersegmentasi digunakan kapan pun url Anda seharusnya berisi parameter variabel.
Ini dijelaskan seperti yang diberikan di bawah ini -
$route = Segment::factory(array(
'route' => '/:controller[/:action]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
'action' => '[a-zA-Z][a-zA-Z0-9_-]+',
),
'defaults' => array(
'controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
Di sini, Segmen dilambangkan dengan titik dua dan diikuti oleh karakter alfanumerik. Jika Anda mempertahankan segmen adalah opsional maka itu diapit oleh tanda kurung. Setiap segmen mungkin memiliki batasan yang terkait dengannya. Setiap batasan adalah ekspresi reguler.
Konfigurasi Rute di Modul Tutorial
Mari kita tambahkan rute segmen dalam modul Tutorial kita. Perbarui file konfigurasi modul tutorial -module.config.php Tersedia di myapp/module/Tutorial/config.
<?php
namespace Tutorial;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\TutorialController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'tutorial' => [
'type' => Segment::class,
'options' => [
'route' => '/tutorial[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\TutorialController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
],
];
Kami telah berhasil menambahkan perutean untuk kami Tutorialmodul. Kami hanya satu langkah di belakang dalam menyelesaikan modul Tutorial kami. Kita perlu menambahkanView untuk modul kita, yang akan kita pelajari di bab selanjutnya.
Sebuah View Layer adalah lapisan presentasi dari aplikasi MVC. Ini memisahkan logika aplikasi dari logika presentasi. Dalam aplikasi web PHP yang khas, semua logika bisnis dan desain saling bercampur. Pencampuran memungkinkan pengembangan yang lebih cepat dalam proyek kecil. Tapi, itu gagal total dalam proyek besar, di mana banyak arsitektur tingkat tinggi terlibat. Untuk mengubah desain aplikasi web, pengembang perlu mengerjakan logika bisnis juga. Ini mungkin bencana yang mengakibatkan putusnya logika bisnis.
Zend Framework menyediakan lapisan Tampilan yang dipikirkan dengan matang, bersih, fleksibel, dan dapat diperpanjang. Lapisan Tampilan tersedia sebagai modul terpisah,Zend/View dan terintegrasi dengan baik Zend/Mvcmodul. Zend View Layer dipisahkan menjadi beberapa komponen yang berinteraksi dengan baik satu sama lain.
Berbagai komponennya adalah sebagai berikut -
Variables Containers - Menyimpan data lapisan tampilan.
View Models - Memegang Variable Containers dan template desain.
Renderers - Memproses data dan template dari View Model dan mengeluarkan representasi desain, mungkin keluaran html akhir.
Resolvers - Mengatasi template yang tersedia di Model Tampilan sedemikian rupa sehingga Renderer dapat menggunakan.
View (Zend\View\View) - Memetakan permintaan ke perender dan kemudian perender untuk merespons.
Rendering Strategies - Digunakan oleh View untuk memetakan permintaan ke penyaji.
Response Strategies - Digunakan oleh View untuk memetakan renderer ke respon.
Lapisan tampilan, View memproses ViewModel, menyelesaikan template menggunakan file Resolver, render menggunakan Rendering Strategy dan akhirnya mengeluarkannya menggunakan Response Renderer.
Lihat Konfigurasi Lapisan
Seperti pengontrol, lapisan Tampilan dapat dikonfigurasi dalam file konfigurasi modul yang disebut sebagai - module.config.php. Konfigurasi utama adalah untuk menentukan dimana template akan ditempatkan. Ini dapat dilakukan dengan menambahkan konfigurasi berikut di "module.config.php".
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
]
Secara default, lapisan Tampilan memiliki perilaku default untuk semua komponennya. Misalnya, aViewModelmenyelesaikan nama template dari tindakan pengontrol di dalam root template dengan aturan "huruf kecil-modul-nama / huruf kecil-pengendali-nama / huruf kecil-tindakan-nama". Namun, ini dapat diganti olehsetTemplate() metode ViewModel.
Pengontrol dan Lapisan Tampilan
Secara default, pengontrol tidak perlu mengirim data apa pun ke lapisan tampilan. Cukup menulis template di tempat yang tepat.
Misalnya, dalam contoh kita, TutorialController, template harus ditempatkan di myapp/module/Tutorial/view/tutorial/tutorial/index.phtml. Ituindex.phtmlmengacu pada template berbasis PHP dan itu akan dirender oleh PHPRenderer. Ada penyaji lain sepertiJsonRenderer untuk json keluaran dan FeedRenderer untuk rss dan atom keluaran.
Daftar lengkapnya adalah sebagai berikut -
<?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
}
}
Template Aplikasi Zend
<div class = "row content">
<h3>This is my first Zend application</h3>
</div>
Akhirnya, kami berhasil menyelesaikan Tutorial modul dan kita dapat mengaksesnya menggunakan url - http://localhost:8080/tutorial.
Meneruskan Data ke View Layer
Cara termudah untuk mengirim data ke lapisan tampilan adalah dengan menggunakan ViewModelargumen. BerubahindexAction metode adalah sebagai berikut -
public function indexAction() {
$view = new ViewModel([ 'message' => 'Hello, Tutorial' ]); return $view;
}
Sekarang, ubah index.phtml mengajukan sebagai berikut -
<div class = "row content">
<h3>This is my first Zend application</h3>
<h4><?php echo $this->message?></h4>
</div>
Lihat Pembantu
Sebuah View Helper digunakan untuk menulis fungsi atomik kecil untuk digunakan dalam template. Zend framework menyediakan antarmuka, Zend \ View \ Helper \ HelperInterface untuk menulis pembantu tampilan standar.
HelperInterface hanya memiliki dua metode,
setView() - Metode ini menerima instance / implementasi Zend \ View \ Renderer \ RendererInterface.
getView() - Ini digunakan untuk mengambil contoh itu.
Daftar kode lengkap HelperInterface adalah sebagai berikut -
namespace Zend\View\Helper;
use Zend\View\Renderer\RendererInterface as Renderer;
interface HelperInterface {
/**
* Set the View object
*
* @param Renderer $view
* @return HelperInterface
*/
public function setView(Renderer $view);
/**
* Get the View object
*
* @return Renderer
*/
public function getView();
}
Untuk menggunakan helper dalam skrip tampilan Anda, akses menggunakan $this->helperName().
Pembantu Bawaan
Zend Framework menyediakan banyak fungsi pembantu bawaan untuk berbagai keperluan. Beberapa View Helpers tersedia dizend-mvc adalah sebagai berikut -
URL
Pembantu URL digunakan untuk menghasilkan URL yang cocok dengan rute yang ditentukan dalam aplikasi.
Definisi pembantu URL adalah -
$this->url($name, $params, $options, $reuseMatchedParameters)
Misalnya, dalam modul tutorial, rute tersebut dinamai sebagai tutorial dan memiliki dua parameter action dan id. Kita dapat menggunakan URL helper untuk menghasilkan dua URL berbeda seperti yang ditunjukkan di bawah ini -
<a href = "<? = $this->url('tutorial'); ?>">Tutorial Index</a>
<a href = "<? = $this->url('tutorial', ['action' => 'show', 'id' =>10]); ?>">
Details of Tutorial #10
</a>
Hasilnya adalah sebagai berikut -
<a href = "/tutorial">Tutorial Index</a>
<a href = "/tutorial/show/10"> Details of Tutorial #10</a>
Placeholder
Pembantu placeholder digunakan untuk mempertahankan konten antara skrip tampilan dan contoh tampilan. Ini memberikan opsi untuk mengatur data pada awalnya dan kemudian menggunakannya di tahap selanjutnya.
Misalnya, kita dapat mengatur, katakanlah company name dan kemudian menggunakannya di semua tempat lain.
<?php $this->placeholder('companyname')->set("TutorialsPoint") ?>
<?= $this->placeholder('companyname'); ?>
Placeholder menyediakan beberapa opsi lanjutan untuk menghasilkan konten kompleks dari array dan objek PHP. Ini juga memiliki opsi untuk menangkap bagian tertentu dari templat itu sendiri.
Misalnya, kode berikut menangkap hasil template di antaranya dan menyimpannya di productlist placeholder.
Class – Product
class Product {
public $name;
public $description;
}
Controller
$p1 = new Product();
$p1->name = 'Car'; $p1->description = 'Car';
$p2 = new Product(); $p2->name = 'Cycle';
$p2->description = 'Cycle'; $view = new ViewModel(['products' => $products]);
Template
<!-- start capture -->
<?php $this->placeholder('productlist')->captureStart();
foreach ($this->products as $product): ?>
<div>
<h2><?= $product->name ?></h2> <p><?= $product->description ?></p>
</div>
<?php endforeach; ?>
<?php $this->placeholder('productlist')->captureEnd() ?> <!-- end capture --> <?= $this->placeholder('productlist') ?>
Result
<div class = "foo">
<h2>Car</h2>
<p>Car</p>
</div>
<div class = "foo">
<h2>Cycle</h2>
<p>Cycle</p>
</div>
Doctype
Pembantu Doctype digunakan untuk menghasilkan berbagai doctypes html. Ini adalah implementasi konkret dariPlaceholderpembantu. Doctype dapat diatur dalam file bootstrap dan file konfigurasi.
Penggunaan dasar ditunjukkan di bawah ini -
Application Bootstrap file
use Zend\View\Helper\Doctype;
$doctypeHelper = new Doctype(); $doctypeHelper->doctype('XHTML5');
Module Configuration
// module/Application/config/module.config.php:
return [
/* ... */
'view_manager' => [
'doctype' => 'html5',
/* ... */
],
];
Template
<?php echo $this->doctype() ?>
HeadTitle
Helper HeadTitle digunakan untuk menghasilkan elemen judul html. Ini adalah implementasi konkret dariPlaceholderpembantu. Zend menyediakan opsi untuk menyetel judul dalam file konfigurasi modul dan dapat disetel di tingkat mana pun seperti situs, modul, pengontrol, tindakan, dll. Kode parsial untuk HeadTitle adalah sebagai berikut -
Module
headTitleHelper->append($action);
$headTitleHelper->append($controller);
$headTitleHelper->append($module);
$headTitleHelper->append($siteName);
Template
<?= $this->headTitle() ?>
Result
action - controller - module - Zend Framework
HeadMeta
Helper HeadMeta digunakan untuk membuat tag meta html. Ini adalah implementasi konkret dari pembantu Placeholder.
Template -
<?php
$this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');
echo $this->headMeta()
?>
Result
<meta name = "keywords" content = "tutorialspoint, zend framework, php" />
HeadLink
Helper HeadLink digunakan untuk membuat tautan html untuk menyertakan sumber daya eksternal. Ini adalah implementasi konkret dari pembantu Placeholder.
Template
<?php
// setting links in a view script:
$this->headLink(['rel' => 'icon', 'href' => '/img/favicon.ico'], 'PREPEND')
->appendStylesheet('/styles/site.css')
->prependStylesheet('/styles/mystyle.css', 'screen', true, ['id' => 'mystyle']);
// rendering the links from the layout:
echo $this->headLink();
?>
Result
<link href = "/styles/mystyle.css" media = "screen" rel = "stylesheet"
type = "text/css" id = "mystyle">
<link href = "/img/favicon.ico" rel = "icon">
<link href = "/styles/site.css" media = "screen" rel = "stylesheet" type = "text/css">
HeadStyle
Helper HeadStyle digunakan untuk menghasilkan gaya CSS sebaris. Ini adalah implementasi konkret dari pembantu Placeholder.
Template
<?php $this->headStyle()->appendStyle($styles); ?> <?php echo $this->headStyle() ?>
HeadScript
HeadScript digunakan untuk menghasilkan skrip sebaris atau untuk menyertakan skrip eksternal. Ini adalah implementasi konkret dari pembantu Placeholder.
Template
<? $this->headScript()->appendFile(‘/js/sample.js’);?> <?php echo $this->headScript() ?>
InlineScript
InlineScript digunakan untuk membuat skrip di bagian head dan body dari template html. Ini berasal dari HeadScript.
HTMLList
HTMLList digunakan untuk menghasilkan daftar berurutan dan tidak berurutan. Definisi dari HTMLList adalah sebagai berikut -
Definition
htmlList($items, $ordered, $attribs, $escape)
Template
$items = [ '2015', ['March', 'November'], '2016', ]; echo $this->htmlList($items);
Result
<ul>
<li>2015
<ul>
<li>March</li>
<li>November</li>
</ul>
</li>
<li>2016</li>
</ul>
Siklus
Siklus digunakan untuk menghasilkan alternatif dalam lingkungan loop. Ini memiliki fungsi assign, next dan prev.
Controller
$view = new ViewModel(['message' => 'Hello, Tutorial', 'data' => array('One', 'Two')]);
Template
<?php $this->cycle()->assign(['#F0F0F0', '#FFF'], 'colors'); ?> <table> <?php foreach ($this->data as $datum): ?> <tr style = "background-color: <?= $this->cycle()->setName('colors')>next() ?>">
<td><?= $this->escapeHtml($datum) ?></td>
</tr>
<?php endforeach ?>
</table>
Result
<table>
<tr style = "background-color: #F0F0F0">
<td>One</td>
</tr>
<tr style = "background-color: #FFF">
<td>Two</td>
</tr>
</table>
Beberapa pembantu penting lainnya adalah sebagai berikut -
BasePath - BasePath digunakan untuk membuat jalur folder publik dari root aplikasi.
Partial - Partial digunakan untuk membuat template tertentu dalam lingkup variabelnya sendiri.
PartialLoop - PartialLoop seperti Partial, tetapi digunakan di lingkungan perulangan.
Identity - Identitas digunakan untuk mengambil identitas pengguna yang masuk dari Layanan Otentikasi.
JSON- JSON digunakan dalam lingkungan yang tenang, dengan keluaran dalam format JSON. Ini memancarkan header HTTP yang tepat dan menonaktifkan konsep tata letak.
Masih banyak pembantu yang tersedia di Zend Framework seperti i18n helper, form helpers, pagination helpers, navigation helpers, dll.
Membuat View Helpers
Zend Framework menyediakan file bawaan AbstractHelper menerapkan HelperInterface untuk menulis view helper.
Langkah-langkah dalam menulis pembantu baru adalah sebagai berikut -
Step 1 - Perluas kelas Zend \ View \ Helper \ AbstractHelper.
Step 2 - Timpa __invoke() fungsi.
Step 3 - Atur konfigurasi di file module.config.php file.
Step 4 - Gunakan view helper dalam skrip tampilan.
Sekarang mari kita buat file TestHelper
Buat folder Helper di myapp/module/Tutorial/src/View directory. MenulisTestHelper di dalam direktori Helper, TestHelper.php.
Daftar lengkapnya adalah sebagai berikut -
<?php
namespace Tutorial\View\Helper;
use Zend\View\Helper\AbstractHelper;
class TestHelper extends AbstractHelper {
public function __invoke() {
$output = "I am from test helper"; return htmlspecialchars($output, ENT_QUOTES, 'UTF-8');
}
}
Setel konfigurasi di module.config.php.
'view_helpers' => [
'aliases' => [
'testHelper' => View\Helper\TestHelper::class,
],
'factories' => [
View\Helper\TestHelper::class => InvokableFactory::class,
],
],
Gunakan yang baru dibuat TestHelper dalam about lihat skrip.
<?= $this->testHelper() ?>
Layout mewakili bagian umum dari beberapa tampilan, misalnya, header dan footer halaman. Secara default, tata letak harus disimpan diview/layout map.
Konfigurasi Tata Letak ditentukan di bawah view_manager bagian di module.config.php.
Konfigurasi default dari aplikasi kerangka adalah sebagai berikut -
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
Di sini template_mapdigunakan untuk menentukan tata letak. Jika tata letak tidak ditemukan, maka itu akan mengembalikan kesalahan. Mari kita lihat tata letak utama aplikasi kerangka.
Layout.phtml
<?= $this->doctype() ?>
<html lang = "en">
<head>
<meta charset = "utf-8">
<?= $this->headTitle('ZF Skeleton Application')->setSeparator(' - ')> setAutoEscape(false) ?> <?= $this->headMeta()
->appendName('viewport', 'width = device-width, initial-scale = 1.0')
->appendHttpEquiv('X-UA-Compatible', 'IE = edge')
?>
<!-- Le styles -->
<?= $this->headLink(['rel' => 'shortcut icon', 'type' => 'image/vnd.microsoft.icon', 'href' => $this->basePath() . '/img/favicon.ico'])
->prependStylesheet($this->basePath('css/style.css')) ->prependStylesheet($this->basePath('css/bootstraptheme.min.css'))
->prependStylesheet($this->basePath('css/bootstrap.min.css')) ?> <!-- Scripts --> <?= $this->headScript()
->prependFile($this->basePath('js/bootstrap.min.js')) ->prependFile($this->basePath('js/jquery-3.1.0.min.js'))
?>
</head>
<body>
<nav class = "navbar navbar-inverse navbar-fixed-top" role = "navigation">
<div class = "container">
<div class = "navbar-header">
<button type = "button" class = "navbar-toggle" data-
toggle = "collapse" data-target = ".navbar-collapse">
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
<span class = "icon-bar"></span>
</button>
<a class = "navbar-brand" href = "<?= $this->url('home') ?>"> <img src = "<?= $this->basePath('img/zf-logo-mark.svg') ?>
" height = "28" alt = "Zend Framework <?= \Application\Module::
VERSION ?>"/> Skeleton Application
</a>
</div>
<div class = "collapse navbar-collapse">
<ul class = "nav navbar-nav">
<li class = "active"><a href = "<?=
$this->url('home') ?>">Home</a></li> </ul> </div> </div> </nav> <div class = "container"> <?= $this->content ?>
<hr>
<footer>
<p>© 2005 - <?= date('Y') ?> by Zend Technologies Ltd.
All rights reserved.</p>
</footer>
</div>
<?= $this->inlineScript() ?>
</body>
</html>
Saat Anda menganalisis tata letak, sebagian besar menggunakan view helper, yang telah kita bahas di bab sebelumnya. Saat kita melihat lebih dekat, tata letak menggunakan variabel khusus,$this->content. Variabel ini penting karena akan digantikan oleh skrip tampilan (template) dari halaman yang sebenarnya diminta.
Membuat tata letak baru
Mari kita buat tata letak baru untuk modul Tutorial kita.
Untuk memulainya, mari kita buat file tutorial.css file di bawah direktori "publik / css".
body {
background-color: lightblue;
}
h1 {
color: white;
text-align: center;
}
Buat file tata letak baru newlayout.phtmldi / myapp / module / Tutorial / view / layout / dan salin konten dari layout yang ada. Kemudian, Tambahkantutorial.css stylesheet menggunakan HeadLink kelas helper di dalam bagian kepala tata letak.
<?php echo $this->headLink()->appendStylesheet('/css/tutorial.css');?>
Tambahkan yang baru about tautan di bagian navigasi menggunakan URL pembantu.
<li><a href = "<?= $this->url('tutorial', ['action' => 'about']) ?>">About</a></li>
Halaman tata letak ini umum untuk aplikasi modul tutorial. Perbaruiview_manager bagian dari file konfigurasi modul tutorial.
'view_manager' => array(
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/newlayout.phtml'),
'template_path_stack' => array('tutorial' => __DIR__ . '/../view',),
)
Tambahkan aboutAction berfungsi di TutorialController.
public function aboutAction() {
}
Tambahkan about.phtml di myapp / module / Tutorial / view / tutorial / tutorial / dengan konten berikut.
<h2>About page</h2>
Sekarang, Anda akhirnya siap untuk menjalankan aplikasi - http://localhost:8080/tutorial/about.
Pada bab ini, kita akan membahas tentang berbagai model dan database Zend Framework.
Model dalam Zend Framework
Model mendefinisikan representasi data logis dari aplikasi. Misalnya, dalam aplikasi keranjang belanja - Produk, Pelanggan, Keranjang dan Pesanan adalah model. Mereka menentukan properti entitas yang dimilikinya. Beberapa konsep model adalah sebagai berikut -
Pengontrol berkomunikasi dengan model dan meminta mereka untuk mengambil informasi yang mereka butuhkan. Informasi yang diambil ini kemudian diteruskan oleh pengontrol ke View. Terakhir, View akan membuat model sebagai data presentasi yang dapat dikonsumsi pengguna.
Sangat jarang model berinteraksi langsung dengan tampilan, tetapi terkadang hal itu dapat terjadi.
Model dapat berbicara satu sama lain dan tidak mandiri. Mereka memiliki hubungan satu sama lain. Hubungan ini mempermudah dan mempercepat pengontrol untuk mendapatkan informasi, karena tidak harus berinteraksi dengan model yang berbeda; model dapat melakukannya sendiri.
Mari kita lihat model sederhana - MyModel
<?php
namespace Tutorial\Model;
class Book {
public $id; public $author;
public $title;
}
Database dalam Zend Framework
Kerangka Zend menyediakan kelas sederhana dan kaya fitur, Zend \ Db \ TableGateway \ TableGateway untuk menemukan, menyisipkan, memperbarui, dan menghapus data dari tabel database.
Mari kita lihat bagaimana menghubungkan MySqlservice melalui driver PDO PHP dalam kerangka Zend melalui langkah-langkah berikut.
Langkah 1: Buat database di MySQL
Buat database tutorialsdi server MySQL lokal. Kita bisa gunakanphpmyadminatau alat GUI MySQL lainnya untuk tujuan ini. Mari kita gunakanMySQL clientdi prompt perintah. Sambungkan ke server mysql dan jalankan perintah berikut untuk membuat filetutorial database.
create database tutorials
Langkah 2: Buat tabel di tutorial db
Sekarang mari kita buat database book dalam tutorials db menggunakan perintah SQL berikut.
use tutorials;
CREATE TABLE book (
id int(11) NOT NULL auto_increment,
author varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
Langkah 3: Isi data di tabel buku
Isi booktabel dengan data sampel. Gunakan perintah SQL berikut.
INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming');
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming');
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');
Langkah 4: Perbarui Koneksi Database
Perbarui file konfigurasi global, yaitu - myapp / config / autoload / global.php dengan informasi drive database yang diperlukan.
<?php
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname = tutorials;host = localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
);
Langkah 5: Perbarui Kredensial Database
Perbarui kredensial database di file konfigurasi lokal, yaitu - myapp / config / autoload / local.php. Dengan cara ini, kita dapat memisahkan kredensial koneksi database lokal dan langsung.
<?php
return array(
'db' => array(
'username' => '<user_name>',
'password' => '<password>',
),
);
Langkah 6: Buat Model untuk Buku
Mari kita buat Model, Book dalam modul kami srcdirektori. Umumnya, model dikelompokkan dalam folder Model - /myapp/module/Tutorial/src/Model/Book.php.
<?php
namespace Tutorial\Model;
class Book {
public $id;
public $author; public $title;
}
Langkah 7: Menerapkan exchangeArray dalam model buku
Itu TableGateway berinteraksi dengan model melalui exchangeArrayfungsi. Argumen standar dari fungsi exchangeArray adalah kumpulan hasil database yang disimpan sebagai array PHP. MenggunakanexchangeArrayfunction, properti model dapat dengan mudah disinkronkan dengan tabel database yang sesuai.
Perbarui model, Book seperti yang ditunjukkan di bawah ini -
<?php
namespace Tutorial\Model;
class Book {
public $id; public $author;
public $title; public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null; $this->Author = (!empty($data['author'])) ? $data['author'] : null;
$this->Title = (!empty($data['title'])) ? $data['title'] : null;
}
}
Langkah 8: Gunakan TableGateway untuk mengambil buku
Buat kelas, BookTableuntuk mengambil informasi buku dari database. Buat kelas, BookTable diModel folder itu sendiri.
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet;
}
}
Kami telah menggunakan select()metode kelas TableGateway untuk mengambil informasi buku dari database. Tapi, kami belum menggunakan referensi apa pun ke tabel -bookdi dalam kode. TableGateway bersifat generik dan dapat mengambil data dari tabel mana pun dengan menggunakan konfigurasi tertentu. Biasanya, konfigurasi ini dilakukan di filemodule.config.php file, yang akan kita bahas pada langkah selanjutnya.
Langkah 9: Konfigurasi kelas BookTable
Perbarui modul tutorial, Module.php dengan getServiceConfig() metode.
<?php
namespace Tutorial;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
public function getServiceConfig() {
return [
'factories' => [
Model\BookTable::class => function ($container) { $tableGateway = $container->get(Model\BookTableGateway::class); $table = new Model\BookTable($tableGateway); return $table;
},
Model\BookTableGateway::class => function ($container) { $dbAdapter = $container->get(AdapterInterface::class); $resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Model\Book()); return new TableGateway('book', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
}
Di sini, kami telah mendaftarkan BookTablekelas menggunakan manajer layanan. Kelas BookTable digunakan untuk mengambil informasi buku dan dengan mendaftarkannya, kita dapat mengaksesnya dimanapun dibutuhkan. Karena, layanan terdaftar dibagikan, mereka meningkatkan kinerja, mengurangi konsumsi memori, dll.
Item lain, Model \ BookTableGateway :: class adalah objek TableGateway yang dikhususkan untuk file Book model dan merupakan ketergantungan dari BookTable.
Langkah 10: Perbarui Konfigurasi TutorialController
Kami membutuhkan BookTablelayanan di pengontrol tutorial untuk mengambil informasi buku. Untuk mendapatkan layanan BookTable, daftarkan sebagai dependensi konstruktor di TutorialController.
Ketergantungan Pembuat ini membantu mendapatkan layanan BookTable sementara pengontrol itu sendiri dalam tahap inisialisasi. Perbarui bagian pengontrol dari konfigurasi modul tutorial,module.config.php seperti gambar dibawah.
'controllers' => [
'factories' => [
Controller\TutorialController::class => function($container) {
return new Controller\TutorialController(
$container->get(Model\BookTable::class)
);
},
],
],
Langkah 11: Perbarui Pengontrol Tutorial
Ini dilakukan dengan mengikuti tiga langkah berikut.
- Tambahkan konstruktor dengan BookTable sebagai argumen.
private $table;
public function __construct(BookTable $table) { $this->table = $table;
}
Ambil informasi buku menggunakan BookTable's fetchAll() metode dan mendaftarkannya ke tampilan.
public function indexAction() {
$view = new ViewModel([
'data' => $this->table->fetchAll(), ]); return $view;
}
Tampilkan informasi buku dalam skrip view.
<table class = "table">
<tr>
<th>Author</th>
<th>Title</th>
<th> </th>
</tr>
<?php foreach ($data as $sampledata) : ?>
<tr>
<td><?php echo $this->escapeHtml($data->author);?></td>
<td><?php echo $this->escapeHtml($data->title);?></td>
</tr>
<?php endforeach ?>
</table>
Langkah 12: Jalankan aplikasi
Periksa aplikasi dengan menjalankan - http://localhost:8080/tutorial.
Seperti yang telah dibahas di bab terakhir, Zend framework menyediakan cara umum untuk mengakses database menggunakan Database Driverkonsep. Bekerja dengan database hanya bergantung pada informasi driver dan karenanya, menghubungkan dengan database yang berbeda hanya melibatkan perubahan informasi driver.
Sekarang mari kita ubah book contoh untuk menyambung ke postgresql database dengan langkah-langkah berikut.
Step 1 - Buat database, tutorial di database postgresql lokal menggunakan perintah berikut -
CREATE DATABASE tutorials
Step 2 - Tambahkan bookmeja. Pindah ke database baru dan jalankan skrip pembuatan tabel.
\c tutorials
CREATE TABLE book (
id SERIAL NOT NULL,
author varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
Step 3 - Tambahkan informasi buku contoh menggunakan skrip berikut -
INSERT INTO book (author, title) VALUES ('Dennis Ritchie', 'C Programming');
INSERT INTO book (author, title) VALUES ('James gosling', 'Java Programming');
INSERT INTO book (author, title) VALUES ('Rasmus Lerdorf', 'Programming PHP');
Step 4 - Ubah informasi pengemudi di global.config file.
<?php
return array (
'db' => array (
'driver' => 'Pdo',
'dsn' => 'pgsql:dbname = tutorials;host = localhost',
'driver_options' => array (
),
),
);
Step 5 - Ubah kredensial database di file local.config mengajukan.
return array (
'db' => array(
'username' => '<username>',
'password' => '<password>',
),
);
Step 6 - Terakhir, jalankan aplikasinya http://localhost:8080/tutorial. Hasilnya sama dengan aplikasi MySQL.
Zend Framework menyediakan komponen terpisah, zend-formuntuk mempercepat proses pembuatan dan validasi formulir. Ini menghubungkan model dan lapisan tampilan. Ini menyediakan satu set elemen formulir untuk membuat formulir html lengkap dari model yang telah ditentukan sebelumnya, fileInputFilter kelas untuk memvalidasi model terhadap formulir dan opsi untuk mengikat data dari formulir ke model dan sebaliknya.
Instal Komponen Formulir
Komponen formulir Zend dapat diinstal menggunakan Composer perintah seperti yang ditentukan di bawah ini -
composer require zendframework/zend-form
Kerangka formulir Zend memiliki tiga subkomponen untuk mengelola formulir. Mereka dijelaskan secara rinci di bawah ini -
Elements - Digunakan untuk menentukan kontrol input html tunggal yang dipetakan ke properti dalam model.
Fieldset - Digunakan untuk mengelompokkan elemen dan lainnya fieldset secara bersarang.
Form - Digunakan untuk membuat formulir html dan terdiri dari elemen dan kumpulan bidang.
Formulir Zend biasanya dibuat di bawah module//src/Form direktori.
Contoh
Sekarang mari kita membuat formulir sederhana untuk ditambahkan bookke dalam database. Untuk melakukan ini, kita harus mengikuti langkah-langkah berikut -
Langkah 1: Buat BookForm
Buat "BookForm.php" di bawah direktori * myapp / module / Tutorial / src / Form ". Tambahkan perubahan berikut di file -
<?php
namespace Tutorial\Form;
use Zend\Form\Form;
class BookForm extends Form {
public function __construct($name = null) { parent::__construct('book'); $this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array( 'name' => 'author', 'type' => 'Text', 'options' => array( 'label' => 'Author', ), )); $this->add(array(
'name' => 'title',
'type' => 'Text',
'options' => array(
'label' => 'Title',
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}
Itu Form kelas menyediakan add methoduntuk memetakan model dan detail formulir yang sesuai. kami telah membuatBookForm dengan memperpanjang Form kelas dan menambahkan detail formulir untuk Book model.
Langkah 2: Perbarui model buku, Book.php
Perbarui model, ‘Book’ dengan filter dan validasi seperti yang ditentukan di bawah ini -
<?php
namespace Tutorial\Model;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilter;
class Book implements InputFilterAwareInterface {
public $id;
public $author; public $title;
protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) { $inputFilter = new InputFilter();
$inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array(
'name' => 'author',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter;
}
public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->author = (!empty($data['author'])) ? $data['author'] : null; $this->title = (!empty($data['title'])) ? $data['title'] : null;
}
}
Setiap model harus mengimplementasikan InputFilterAwareInterface. InputFilterAwareInterface menyediakan dua metode,setInputFilter() dan getInputFilter().
GetInputFilter digunakan untuk mendapatkan detail validasi model. Zend framework menyediakan sekumpulan filter dan validator yang kaya untuk memvalidasi formulir. Beberapa filter dan validator yang digunakan dalam model buku adalah sebagai berikut -
StripTags - Hapus HTML yang tidak diinginkan.
StringTrim - Hapus ruang kosong yang tidak perlu.
StringLength validator - Pastikan pengguna tidak memasukkan karakter lebih dari batas yang ditentukan.
Langkah 3: Perbarui kelas BookTable
Sertakan saveBook metode untuk menambahkan buku ke database.
BookTable.php
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) {
$this->tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet; } public function getBook($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) {
throw new \Exception("Could not find row $id"); } return $row;
}
public function saveBook(Book $book) { $data = array (
'author' => $book->author, 'title' => $book->title,
);
$id = (int) $book->id;
if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Book id does not exist');
}
}
}
}
Langkah 4: Perbarui kelas TutorialController
Tambahkan action addAction baru di controller tutorial - myapp / module / Tutorial / src / Controller / TutorialController.php.
public function addAction() {
$form = new BookForm(); $form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) { $book = new Book();
$form->setInputFilter($book->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) { $book->exchangeArray($form->getData()); $this->bookTable->saveBook($book); // Redirect to list of Tutorial return $this->redirect()->toRoute('tutorial');
}
}
return array('form' => $form);
}
Itu addAction metode melakukan proses berikut -
Mendapatkan objek permintaan.
Memeriksa apakah metode http permintaan adalah a post metode.
Jika metode http permintaan tidak post, itu hanya membuat template, add.phtml
Jika metode http permintaan tidak post, lalu menyetel inputfilter, mendapatkan data permintaan dan menyetelnya ke inputfiler.
Memeriksa apakah formulir tersebut valid menggunakan isValid() metode kelas Formulir.
Jika formulir tidak valid, itu lagi membuat template, add.phtml
Jika formulirnya valid, buku tersebut akan disimpan ke database dan dialihkan ke halaman beranda.
Langkah 5: Tambahkan template add.phtml
Buat template - add.phtml di bawah myapp / module / Tutorial / view / tutorial / tutorial / add.phtml
Add.phtml
<?php
$title = 'Add new Book';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
<?php
if(!empty($form)) { $form->setAttribute('action', $this->url('tutorial', array('action' => 'add'))); $form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('author'))."<br>";
echo $this->formRow($form->get('title'))."<br>";
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
}
Di sini, kami merender formulir buku menggunakan Form contoh, $form.
Langkah 6: Jalankan Aplikasi
Sekarang, kita dapat menjalankan aplikasi - http://localhost:8080/tutorial/add.
Form Page
Validate Error Page
Mengunggah file adalah salah satu konsep utama dalam pemrograman formulir. Zend framework menyediakan semua item yang diperlukan untuk mengupload file melaluizend-form dan zend-inputfilter komponen.
Kelas FileInput
Komponen zend-inputfilter menyediakan kelas Zend \ InputFilter \ FileInput untuk menangani elemen input file html - <input type = 'file' />. ItuFileInputseperti filter masukan lainnya dengan beberapa pengecualian. Mereka adalah sebagai berikut -
Karena PHP menyimpan detail file yang diunggah di $_FILES global array, FileInput mengumpulkan informasi file yang diunggah hanya melalui $ _FILES.
Validasi perlu dilakukan sebelum kelas FileInput memproses data. Ini adalah kebalikan dari perilaku filter masukan lainnya.
Zend \ Validator \ File \ UploadFile adalah validator default yang akan digunakan. ItuUploadFile memvalidasi detail input file.
Untuk menambahkan tipe unggahan file dalam formulir, kita perlu menggunakan tipe input File. Kode parsial adalah sebagai berikut -
$form->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array('label' => 'Picture',),
));
Kelas lain yang digunakan dalam mengunggah file adalah Zend \ Filter \ File \ RenameUpload. ItuRenameUploaddigunakan untuk memindahkan file yang diunggah ke lokasi yang kami inginkan. Kelas parsial untuk menggunakan filter file adalah sebagai berikut -
$file = new FileInput('imagepath');
$file->getValidatorChain()->attach(new UploadFile()); $file->getFilterChain()->attach(
new RenameUpload([
'target' => './public/tmpuploads/file',
'randomize' => true,
'use_upload_extension' => true
]));
$inputFilter->add($file);
Di sini, opsi RenameUpload adalah sebagai berikut -
target - Jalur tujuan dari file yang diunggah.
randomize - Tambahkan string acak untuk mencegah duplikasi file yang diunggah.
use_upload_extension - Tambahkan ekstensi file ke file yang diunggah ke target.
Unggah File - Contoh Kerja
Mari kita memodifikasi modul tutorial dan menyertakan fitur unggah gambar.
Ubah tabel database
Mari kita tambahkan imagepath kolom ke tabel buku dengan menjalankan perintah SQL berikut -
ALTER TABLE `book` ADD `imagepath` VARCHAR(255) NOT NULL AFTER 'imagepath';
Perbarui BookForm.php
Tambahkan elemen input file untuk mengupload gambar dalam bentuk buku - myapp / module / Tutorial / src / Model / BookForm.php.
Sertakan kode berikut di __constructmethod dari kelas BookForm.
$this->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array ('label' => 'Picture',),
));
Perbarui Book.php
Lakukan perubahan berikut di kelas Buku - myapp / module / Tutorial / src / Model / Book.php.
Tambahkan properti baru imagepath untuk gambarnya.
public $imagepath;
Perbarui getInputFilter metode seperti yang ditunjukkan di bawah ini -
Tambahkan FileInput filter untuk elemen input file.
Mengatur UploadFile validasi untuk memvalidasi elemen input file.
Konfigurasikan RenameUpload untuk memindahkan file yang diunggah ke tujuan yang benar.
Daftar kode parsial adalah sebagai berikut -
$file = new FileInput('imagepath'); $file->getValidatorChain()->attach(new UploadFile());
$file->getFilterChain()->attach( new RenameUpload([ 'target' => './public/tmpuploads/file', 'randomize' => true, 'use_upload_extension' => true ])); $inputFilter->add($file);
Perbarui exchangeArray metode untuk memasukkan imagepathProperti. Jalur citra mungkin berasal dari formulir atau database. Jika imagepath berasal dari form, formatnya akan menjadi array dengan spesifikasi sebagai berikut:
array(1) {
["imagepath"] => array(5) {
["name"] => string "myimage.png"
["type"] => string "image/png"
["tmp_name"] => string
"public/tmpuploads/file_<random_string>.<image_ext>"
["error"] => int <error_number>
["size"] => int <size>
}
}
Jika imagepath berasal dari database, itu akan menjadi string sederhana. Daftar kode parsial untuk mengurai jalur citra adalah sebagai berikut -
if(!empty($data['imagepath'])) {
if(is_array($data['imagepath'])) { $this->imagepath = str_replace("./public", "", $data['imagepath']['tmp_name']); } else { $this->imagepath = $data['imagepath']; } } else { $data['imagepath'] = null;
}
Daftar lengkap dari Book modelnya adalah sebagai berikut -
<?php
namespace Tutorial\Model;
use Zend\InputFilter\InputFilterInterface;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\Filter\File\RenameUpload;
use Zend\Validator\File\UploadFile;
use Zend\InputFilter\FileInput;
use Zend\InputFilter\InputFilter;
class Book implements InputFilterAwareInterface {
public $id; public $author;
public $title; public $imagepath;
protected $inputFilter; public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) { $inputFilter = new InputFilter();
$inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array(
'name' => 'author',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
));
$inputFilter->add(array( 'name' => 'title', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array( 'name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 100, ), ), ), )); $file = new FileInput('imagepath');
$file->getValidatorChain()->attach(new UploadFile()); $file->getFilterChain()->attach(
new RenameUpload([
'target' => './public/tmpuploads/file',
'randomize' => true,
'use_upload_extension' => true
]));
$inputFilter->add($file);
$this->inputFilter = $inputFilter;
}
return $this->inputFilter; } public function exchangeArray($data) {
$this->id = (!empty($data['id'])) ? $data['id'] : null; $this->author = (!empty($data['author'])) ? $data['author'] : null;
$this->title = (!empty($data['title'])) ? $data['title'] : null; if(!empty($data['imagepath'])) {
if(is_array($data['imagepath'])) { $this->imagepath = str_replace("./public", "",
$data['imagepath']['tmp_name']); } else { $this->imagepath = $data['imagepath']; } } else { $data['imagepath'] = null;
}
}
}
Perbarui BookTable.php
Kami telah memperbarui BookForm dan Book model. Sekarang, kami memperbaruiBookTable dan memodifikasi saveBookmetode. Ini cukup untuk memasukkan entri imagepath dalam larik data,$data.
Daftar kode parsial adalah sebagai berikut -
$data = array('author' => $book->author, 'title' => $book->title,
'imagepath' => $book->imagepath
);
Daftar kode lengkap dari BookTable kelas adalah sebagai berikut -
<?php
namespace Tutorial\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class BookTable {
protected $tableGateway;
public function __construct(TableGatewayInterface $tableGateway) { $this->tableGateway = $tableGateway; } public function fetchAll() { $resultSet = $this->tableGateway->select(); return $resultSet;
}
public function getBook($id) { $id = (int) $id; $rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) { throw new \Exception("Could not find row $id");
}
return $row; } public function saveBook(Book $book) {
$data = array ( 'author' => $book->author,
'title' => $book->title, 'imagepath' => $book->imagepath
);
$id = (int) $book->id;
if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getBook($id)) { $this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Book id does not exist');
}
}
}
}
Update addAction in the TutorialController.php: Informasi unggahan file akan tersedia di $_FILES array global dan dapat diakses menggunakan Request's getFiles()metode. Jadi, gabungkan data yang diposting dan informasi unggahan file seperti yang ditunjukkan di bawah ini.
$post = array_merge_recursive(
$request->getPost()->toArray(), $request->getFiles()->toArray()
);
Daftar lengkap dari addAction() metode adalah sebagai berikut -
public function addAction() {
$form = new BookForm(); $form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) { $book = new Book();
$form->setInputFilter($book->getInputFilter());
$post = array_merge_recursive( $request->getPost()->toArray(),
$request->getFiles()->toArray() ); $form->setData($post); if ($form->isValid()) {
$book->exchangeArray($form->getData());
$this->bookTable->saveBook($book);
// Redirect to list of Tutorial
return $this->redirect()->toRoute('tutorial'); } } return array('form' => $form);
}
Perbarui View dari add.phtml
Terakhir, ubah "add.phtml" dan sertakan elemen input file imagepath seperti yang ditunjukkan di bawah ini -
echo $this->formRow($form->get('imagepath'))."<br>";
Daftar lengkapnya adalah sebagai berikut -
<?php
$title = 'Add new Book'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php if(!empty($form)) {
$form->setAttribute('action', $this->url('tutorial', array('action' => 'add')));
$form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('author'))."<br>"; echo $this->formRow($form->get('title'))."<br>"; echo $this->formRow($form->get('imagepath'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag();
}
Jalankan aplikasinya
Terakhir, jalankan aplikasi di http://localhost:8080/tutorial/add dan tambahkan catatan baru.
Hasilnya akan seperti yang ditunjukkan pada tangkapan layar berikut -
Form Page
Index Page
AJAX adalah teknologi modern dalam pemrograman web. Ini memberikan opsi untuk mengirim dan menerima data di halaman web secara asinkron, tanpa menyegarkan halaman. Zend framework menyediakan opsi untuk bekerja dengan filejson model melalui zend-view dan zend-jsonkomponen. Mari kita pelajari pemrograman Zend AJAX di bab ini.
Instal komponen json
Komponen Zend json dapat diinstal menggunakan Composer perintah seperti yang ditentukan di bawah ini -
composer require zendframework/zend-json
Konsep
Zend framework menyediakan dua metode untuk menulis aplikasi web yang mendukung AJAX dengan mudah. Mereka adalah sebagai berikut -
Itu isXmlHttpRequest() metode di Requestobjek - Jika permintaan AJAX dibuat, metode isXmlHttpRequest () objek permintaan akan mengembalikan nilai true, jika tidak salah. Metode ini digunakan untuk menangani permintaan AJAX dengan benar di sisi server.
if ($request->isXmlHttpRequest()) {
// Ajax request
} else {
// Normal request
}
The Zend / View / Model / JsonModel - The JsonModel adalah alternatif untuk ViewModeluntuk digunakan secara eksklusif untuk AJAX dan skenario REST API. JsonModel bersama denganJsonStrategy (untuk dikonfigurasi dalam blok manajer tampilan modul) mengkodekan data model ke Json dan mengembalikannya sebagai respons alih-alih tampilan (phtml).
AJAX - Contoh Kerja
Mari kita tambahkan halaman ajax baru, ajaxdalam modul tutorial dan mengambil informasi buku secara asinkron. Untuk melakukan ini, kita harus mengikuti langkah-langkah berikut.
Langkah 1: Tambahkan JsonStrategy dalam konfigurasi modul
Perbarui blok manajer tampilan dalam file konfigurasi modul tutorial - myapp / module / Tutorial / config / module.config.php. Kemudian,JsonStrategy akan bekerja dengan JsonModel untuk menyandikan dan mengirim data json.
'view_manager' => [
'template_map' => array
('layout/layout' => __DIR__ . '/../view/layout/newlayout.phtml'),
'template_path_stack' => [
'tutorial' => __DIR__ . '/../view',
],
'strategies' => array('ViewJsonStrategy',),
],
Langkah 2: Tambahkan metode ajaxAction di TutorialController.php
Tambahkan metode ajaxAction di TutorialController.php dengan kode berikut -
public function ajaxAction() {
$data = $this->bookTable->fetchAll(); $request = $this->getRequest(); $query = $request->getQuery(); if ($request->isXmlHttpRequest() || $query->get('showJson') == 1) { $jsonData = array();
$idx = 0; foreach($data as $sampledata) { $temp = array(
'author' => $sampledata->author, 'title' => $sampledata->title,
'imagepath' => $sampledata->imagepath ); $jsonData[$idx++] = $temp;
}
$view = new JsonModel($jsonData);
$view->setTerminal(true); } else { $view = new ViewModel();
}
return $view;
}
Di sini, ajaxAction akan memeriksa apakah permintaan yang masuk adalah AJAX atau tidak. Jika permintaan masuk adalah AJAX, maka fileJsonModelakan dibuat. Jika tidak, normalViewModel akan dibuat.
Dalam kedua kasus tersebut, informasi buku akan diambil dari database dan diisi dalam model. Jika modelnya adalah JsonModel, makaJsonStrategy akan dipanggil dan akan menyandikan data sebagai json dan dikembalikan sebagai respons.
Itu $query->get('showJson') == 1digunakan untuk tujuan debugging. Tambahkan sajashowJson=1 di url dan halaman akan menampilkan data json.
Langkah 3: Tambahkan ajax.phtml
Sekarang, tambahkan skrip tampilan ajax.phtmluntuk metode ajaxAction. Halaman ini akan memiliki link dengan label -Load book information.
Mengklik link tersebut akan melakukan permintaan AJAX, yang akan mengambil informasi buku sebagai data Json dan menampilkan informasi buku sebagai tabel yang diformat. Pemrosesan AJAX dilakukan menggunakan fileJQuery.
Daftar kode lengkapnya adalah sebagai berikut -
<a id = "loadbook" href = "#">Load book information</a>
</br> </br>
<table class = "table">
<tbody id = "book">
</tbody>
</table>
<script language = "javascript">
$(document).ready(function(){ $("#loadbook").on("click", function(event){
$.ajax({ url: '/tutorial/ajax', type: 'POST', dataType: 'json', async: true, success: function(data, status) { var e = $('<tr><th>Author</th><th>Title</th><th>Picture</th></tr>');
$('#book').html(''); $('#book').append(e);
for(i = 0; i < data.length; i++) {
book = data[i];
var e = $('<tr><td id = "author"></td><td id = "title"></td> <td id="imagepath"><img src = ""/></td></tr>'); $('#author', e).html(book['author']);
$('#title', e).html(book['title']); $('#imagepath img', e).attr('src', book['imagepath']);
$('#book').append(e);
}
},
error : function(xhr, textStatus, errorThrown) {
alert('Ajax request failed.');
}
});
});
});
</script>
Langkah 4: Jalankan aplikasi
Terakhir, jalankan aplikasi - http://localhost:8080/tutorial/ajax dan klik tautan Muat informasi buku.
Hasilnya akan seperti gambar di bawah ini -
Ajax Page -
Ajax Page with Book Information
Ajax page with debugging information
Cookie adalah konsep yang sangat penting dalam aplikasi web. Ini memberikan opsi untuk menyimpan data pengguna, biasanya sepotong kecil informasi di browser itu sendiri untuk jangka waktu terbatas.
Cookie digunakan untuk menjaga status aplikasi web. Zend framework menyediakan modul cookie di dalam filezend-httpkomponen. Zend-http ini menyediakan abstraksi HTTP dan implementasinya.
Menginstal Komponen HTTP
Komponen HTTP dapat dengan mudah diinstal menggunakan Composer seperti yang ditentukan dalam kode di bawah ini.
composer require zendframework/zend-http
Konsep
Zend-http menyediakan file Zend\Http\Cookieskelas untuk mengelola cookie. Ini digunakan bersama denganZend\Http\Clientkelas, yang digunakan untuk mengirim permintaan ke server web. Cookies dapat diinisialisasi seperti yang ditunjukkan pada kode di bawah ini -
use Zend\Http\Cookies
$c = new Cookies();
Ketika klien HTTP (Zend \ Http \ Client) pertama kali mengirim permintaan URI ke server web, ia tidak memiliki cookie apa pun. Setelah permintaan diterima oleh server web, itu termasuk cookie dalam objek tanggapannya sebagaiHTTP Header, Set-Cookiedan mengirimkannya ke klien HTTP. Klien HTTP akan mengekstrak cookie dari respons http dan mengirimkannya kembali sebagai Header HTTP yang sama dalam permintaan berikutnya. Umumnya, setiap cookie akan dipetakan ke domain dan jalur domain.
Metode yang tersedia di Cookies kelas adalah sebagai berikut -
addCookie(uri) - Digunakan untuk menambahkan cookie ke objek permintaan dari URI yang diberikan.
getCookie(cookieName, $cookieForm) - Ini digunakan untuk mendapatkan cookie, $ cookieName tersedia di URI yang diberikan, $uri. Argumen ketiga adalah bagaimana cookie akan dikembalikan, baik string maupun array.
fromResponse(uri) - Ini digunakan untuk mengekstrak cookie dari objek respons URI yang diberikan.
addCookiesFromResponse - Ini sama dengan fromResponse, tetapi mengekstrak dan menambahkannya lagi ke objek permintaan dari URI yang diberikan.
isEmpty() - Ini digunakan untuk mencari apakah diberikan Cookie objek memiliki cookie apa pun atau tidak.
reset() - Ini digunakan untuk menghapus semua cookie di URI yang diberikan.
Pada bab selanjutnya, kita akan membahas tentang manajemen sesi dalam Zend Framework.
Sesi adalah konsep yang sangat penting dalam aplikasi web. Ini memberikan opsi untuk mempertahankan data pengguna di server web untuk jangka waktu terbatas. Zend framework menyediakan komponen terpisah,zend-session untuk menangani informasi sesi.
Instal Komponen Sesi
Komponen sesi dapat diinstal menggunakan Composer seperti yang ditentukan di bawah ini -
composer require zendframework/zend-session
Komponen Sesi
Zend framework menyediakan enam komponen untuk menangani manajemen sesi. Semua komponen ini telah dijelaskan di bawah -
Zend\Session\Container - API utama untuk membaca dan menulis informasi sesi.
Zend\Session\SessionManager - Ini digunakan untuk mengelola seluruh siklus hidup sesi.
Zend\Session\Storage - Ini digunakan untuk menentukan bagaimana data sesi akan disimpan di memori.
Zend\Session\SaveHandler - Ini digunakan untuk menyimpan dan mengambil data sesi ke lokasi fisik seperti RDBMS, Redis, MangoDB, dll.
Zend\Session\Validator - Ini digunakan untuk melindungi sesi dari pembajakan dengan memeriksa silang alamat jarak jauh permintaan awal dan selanjutnya serta agen pengguna.
Zend\Session\Config\SessionConfig - Ini digunakan untuk mengonfigurasi bagaimana sesi harus berperilaku.
Konfigurasi default sudah cukup untuk bekerja dengan sebuah sesi. Dengan menggunakan komponen di atas, semua aspek sesi dapat ditangani dengan mudah.
Contoh Komponen Sesi
Mari kita ikuti poin-poin berikut untuk membuat halaman baru untuk memahami sesi dalam kerangka Zend. Secara default, itu cukup untuk membuat instance dariContainer kelas untuk mengelola sesi.
Buat tindakan baru, sessionAction di TutorialController.
Inisialisasi a Container obyek.
$c = new Container();
Periksa apakah kunci arbitrer countada. Jika kunci tidak tersedia, lakukan inisialisasicount dengan nilai 1. Jika tersedia, naikkan nilai seperti yang ditunjukkan pada kode berikut.
if (!isset($c->count)) { $c->count = 0;
} else {
$c->count++;
}
Daftarkan hitungan di ViewModel.
Buat file template untuk - sessionAction, session.phtml di myapp / module / Tutorial / view / tutorial / tutorial / session.phtml dan kemudian render count nilai.
Menyegarkan halaman akan meningkatkan nilai countdalam sesi tersebut. Daftar lengkapnya adalah sebagai berikut -
TutorialController.php
public function sessionAction() {
$c = new Container();
if (!isset($c->count)) { $c->count = 0;
} else {
$c->count++; } $view = new ViewModel([
'count' => $c->count, ]); return $view;
}
session.pthml
Session data, COUNT = <?= $this->count ?>
Sample Result
Session data, Count = 5
Otentikasi adalah salah satu fitur yang paling penting dan harus dimiliki dalam aplikasi web apa pun. Zend Framework menyediakan komponen terpisah untuk menangani otentikasi, yang disebut sebagaizend-authentication.
Instal Komponen Otentikasi
Komponen otentikasi dapat diinstal menggunakan berikut ini Composer perintah.
composer require zendframework/zend-authentication
Konsep
Biasanya, pengembang menulis fungsi php untuk mengautentikasi detail pengguna pada sumber data. Setelah otentikasi selesai, detail otentikasi disimpan untuk permintaan selanjutnya. Zend Framework menggeneralisasi konsep ini dan menyediakan dua kelas, yang dijelaskan di bawah -
Kelas 1 Zend \ Authentication \ Adapter \ AdaptorInterface
Kelas ini menyediakan metode tunggal, authenticateuntuk menulis logika otentikasi. Metode otentikasi mengembalikan sebuah instance dariZend\Authentication\Result kelas.
Ini Resultobjek memegang status otentikasi; identitas jika otentikasi berhasil dan pesan kesalahan, jika otentikasi gagal. Tanda tangan dari antarmuka otentikasi dan kelas hasil adalah sebagai berikut -
AdaptorInterface
namespace Zend\Authentication\Adaptor;
public function authenticate() {
// code
}
Result class
namespace Zend\Authentication;
class Result {
public function __construct($code, $identity, array $messages = []);
}
Zend Framework menyediakan implementasi default untuk melakukan otentikasi terhadap database, ldap, http basic dan digest credentials. SebuahAdaptor mengautentikasi tetapi tidak menyimpan detail untuk permintaan di masa mendatang.
Kelas 2 Zend \ Authentication \ AuthenticationService
AuthenticationService adalah komponen utama, yang menggunakan adaptor yang sudah dikonfigurasi untuk tujuan otentikasi. Setelah otentikasi selesai, itu menyimpan rincian otentikasi dan menyediakan metode,hasIdentity() untuk memeriksa apakah identitas tersedia, getIdentity() untuk mendapatkan detail otentikasi dan clearIdentity() untuk menghapus detail otentikasi.
Daftar kode parsial untuk menggunakan AuthenticationService ini adalah sebagai berikut -
$adap = new Adapter($username, $password); $auth = new AuthenticationService();
$result = $auth->authenticate($adap); if($result->isValid) {
$identity = $auth->getIdentity();
} else {
// process $result->getMessages() } // clear $auth->clearIdentity();
Hal-hal yang terkait dengan otorisasi dikemas sebagai dua modul terpisah, yaitu - zend-permissions-acl dan zend-permissions-rbac. Zend-izin-acl didasarkan pada daftar kontrol akses dan zend-izin-rbac didasarkan pada daftar kontrol akses berbasis peran. Mereka menyediakan abstraksi tingkat tinggi dari konsep ACL & RBAC dan membantu dalam menulis aplikasi kelas perusahaan.
The Zend Framework provides a separate component called as zend-mail to send email messages. The zend-mail component also provides an option to read and write email messages with attachments both in text and html format. Sending an email in Zend is much easier and simple to configure.
Let us go through the email concepts, basic settings, advanced settings such as SMTP transport, etc., in this chapter.
Install Mail Component
The mail component can be installed using the following Composer command.
composer require zendframework/zend-mail
Basic Email Configuration
A basic email consists of one or more recipients, a subject, a body and a sender. Zend provides Zend\Mail\Message class to create a new email message. To send an email using the zend-mail, you must specify at least one recipient as well as a message body.
The partial code to create a new mail message is as follows −
use Zend\Mail;
$mail = new Mail\Message(); $mail->setSubject('Zend email sample');
$mail->setBody('This is content of the mail message'); $mail->setFrom('[email protected]', "sender-name");
$mail->addTo('[email protected]', "recipient-name");
Zend provides Zend\Mail\Sendmail class to send the mail message. Sendmail uses the php native mail function, mail to send the mail message and we can configure the transport layer using php configuration file.
The partial coding using Sendmail is as follow −
$transport = new Mail\Transport\Sendmail();
$transport->send($mail);
The zend-mail provides many transport layer and each may require many additional parameters such as username, password, etc
Email Management Methods
Some of the notable email management methods are as follows −
isValid − Messages without a ‘From’ address is invalid.
isValid() : bool
setEncoding − Set the message encoding.
setEncoding(string $encoding) : void
getEncoding − Get the message encoding.
getEncoding() : string
setHeaders − Compose headers.
setHeaders(Zend\Mail\Headers $headers) : void
getHeaders − Access headers collection.
getHeaders() : Zend\Mail\Headers
setFrom − Set (overwrite) From addresses. It contains a key/value pairs where the key is the human readable name and the value is the email address.
setFrom(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressList, string|null $name
) : void
addFrom − Add a ‘From’ address.
addFrom(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressOrList, string|null $name
) : void
getFrom − Retrieve list of ‘From’ senders.
getFrom() : AddressList
setTo - Overwrite the address list in the To recipients.
setTo(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressList, null|string $name
) : void
setSubject − Set the message subject header value.
setSubject(string $subject) :void
setBody − Set the message body.
setBody(null|string|Zend\Mime\Message|object $body) : void
Lapisan Transportasi SMTP
Itu zend-mail menyediakan opsi untuk mengirim email menggunakan server SMTP melalui Zend\Mail\Transport\Smtpclass. Ini sepertiSendmail kecuali bahwa ia memiliki beberapa opsi tambahan untuk mengkonfigurasi host SMTP, porta, nama pengguna, kata sandi, dll.
Kode parsial adalah sebagai berikut -
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
$transport = new SmtpTransport(); $options = new SmtpOptions([
'name' => 'localhost',
'host' =>'smtp.gmail.com',
'port' => 465,
]);
$transport->setOptions($options);
Sini,
name - Nama host SMTP.
host - Nama host atau alamat IP jarak jauh.
port - Port tempat host jarak jauh mendengarkan.
Konsep Surat - Contoh
Mari kita ikuti poin-poin berikut untuk menulis aplikasi konsol php sederhana untuk memahami konsep email.
Buat folder "mailapp".
Install zend-mail menggunakan alat komposer.
Buat file php Mail.php di dalam folder "mailapp".
Buat pesan menggunakan Zend\Mail\Message.
$message = new Message(); $message->addTo('[email protected]');
$message->addFrom('[email protected]'); $message->setSubject('Hello!');
$message->setBody("My first Zend-mail application!");
Buat lapisan transport SMTP dan tambahkan konfigurasi yang diperlukan.
// Setup SMTP transport using LOGIN authentication
$transport = new SmtpTransport();
$options = new SmtpOptions([ 'name' => 'localhost', 'host' => 'smtp.gmail.com', // or any SMTP server 'port' => 465, // port on which the SMTP server is listening 'connection_class' => 'login', 'connection_config' => [ username' => '<your username>', 'password' => '<your password>', 'ssl' => 'ssl'], ]); $transport->setOptions($options);
Kirim email menggunakan send metode.
$transport->send($message);
Daftar lengkapnya, Mail.php adalah sebagai berikut -
<?php
require __DIR__ . '/vendor/autoload.php';
use Zend\Mail\Message;
use Zend\Mail\Transport\Smtp as SmtpTransport;
use Zend\Mail\Transport\SmtpOptions;
$message = new Message();
$message->addTo('[email protected]'); $message->addFrom('[email protected]');
$message->setSubject('Hello!'); $message->setBody("My first Zend-mail application!");
// Setup SMTP transport using LOGIN authentication
$transport = new SmtpTransport(); $options = new SmtpOptions([
'name' => 'localhost',
'host' => 'smtp.gmail.com', // or any SMTP server
'port' => 465, // port on which the SMTP server is listening
'connection_class' => 'login',
'connection_config' => [
'username' => '<your username>', 'password' => '<your password>',
'ssl' => 'ssl'],
]);
$transport->setOptions($options);
$transport->send($message);
Sekarang, jalankan aplikasi di command prompt php Mail.php. Ini akan mengirim email seperti yang dikonfigurasi dalam aplikasi.
Secara umum, kita dapat men-debug aplikasi PHP dengan menggunakan advanced debugger tool atau dengan menggunakan perintah sederhana seperti echo dan die. Dalam skenario web, kita perlu menguji logika bisnis serta lapisan presentasi. Formulir dalam aplikasi web dapat diuji dengan memasukkan data uji yang relevan untuk memastikan bahwa formulir berfungsi seperti yang diharapkan.
Desain sebuah situs web dapat diuji secara manual dengan menggunakan browser. Jenis proses pengujian ini dapat diotomatiskan menggunakan pengujian unit. Tes unit sangat penting dalam proyek besar. Pengujian unit ini akan membantu mengotomatiskan proses pengujian dan memperingatkan pengembang jika terjadi kesalahan.
Menyiapkan PHPUnit
Kerangka Zend terintegrasi dengan kerangka kerja pengujian unit PHPUnit. Untuk menulis pengujian unit untuk framework Zend, kita perlu menyiapkan PHPUnit, yang dapat dengan mudah dilakukan dengan menggunakan perintah Composer berikut.
$ composer require --dev phpunit/phpunit
Setelah menjalankan perintah di atas, Anda akan mendapatkan respons seperti yang ditunjukkan pada blok kode berikut.
Using version ^5.7 for phpunit/phpunit
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Writing lock file
Generating autoload files
Sekarang, saat Anda membuka file "composer.json", Anda akan melihat perubahan berikut -
"require-dev": {
"phpunit/phpunit": "^5.7"
}
TestCase dan Assertions
Kerangka Zend menyediakan kelas pembantu untuk menguji unit pengontrol. ItuTestCase adalah komponen utama dalam a PHPUnit kerangka kerja untuk menulis kasus uji dan Zend Framework menyediakan implementasi abstrak dari TestCase yang disebut sebagai AbstractHttpControllerTestCase.
AbstractHttpControllerTestCase ini menyediakan berbagai Assertmetode dan dapat dikelompokkan berdasarkan fungsionalitas. Mereka adalah sebagai berikut -
Request Assertions- Digunakan untuk menegaskan permintaan http. Misalnya, assertControllerName.
CSS Select Assertions - Digunakan untuk memeriksa respon HTML menggunakan model DOM HTML.
XPath Assertions - Alternatif untuk pernyataan pemilihan CSS berdasarkan XPath.
Redirect Assertions - Digunakan untuk memeriksa pengalihan halaman.
Response Header Assertions - Digunakan untuk memeriksa header respons seperti kode status (assertResponseStatusCode)
Buat Direktori Tes
Tes unit dapat ditulis secara terpisah untuk setiap modul. Semua pengkodean terkait pengujian perlu dibuat di dalamtest folder di bawah direktori root modul.
Misalnya, untuk menulis pengujian untuk TutorialController yang tersedia di modul Tutorial, kelas pengujian harus ditempatkan di direktori myapp / module / Tutorial / test / Controller /.
Contoh
Mari kita tulis kelas uji untuk menguji unit TutorialController.
Untuk memulainya, kita harus menulis kelas yang disebut TutorialControllerTest dan memperluasnya ke AbstractHttpControllerTestCase.
Langkah selanjutnya adalah menulis a Setupmetode untuk menyiapkan lingkungan pengujian. Ini dapat dilakukan dengan memanggilsetApplicationConfig metode dan meneruskan file konfigurasi aplikasi utama kami myapp / config / application.config.php
public function setUp() {
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides
));
parent::setUp();
}
Tulis satu atau beberapa metode dan panggil berbagai metode assert tergantung pada kebutuhan.
$this->assertMatchedRouteName('tutorial');
Kami telah menulis kelas tes dan daftar lengkapnya adalah sebagai berikut -
<?php
namespace TutorialTest\Controller;
use Tutorial\Controller\TutorialController;
use Zend\Stdlib\ArrayUtils;
use Zend\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;
class TutorialControllerTest extends AbstractHttpControllerTestCase {
public function setUp() {
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides
));
parent::setUp();
}
public function testIndexActionCanBeAccessed() {
$this->dispatch('/tutorial', 'GET'); $this->assertResponseStatusCode(200);
$this->assertModuleName('tutorial'); $this->assertControllerName(TutorialController::class);
$this->assertControllerClass('TutorialController'); $this->assertMatchedRouteName('tutorial');
}
}
Sekarang, buka prompt perintah, lanjutkan ke direktori root aplikasi dan jalankan file phpunit dieksekusi tersedia di dalam vendor map.
cd /path/to/app
./vendor/bin/phpunit ./vendor/bin/phpunit module/
Tutorial/test/Controller/TutorialControllerTest.php
Hasilnya akan seperti yang ditunjukkan pada blok kode berikut -
PHPUnit 5.7.5 by Sebastian Bergmann and contributors.
.1 / 1 (100%)
Time: 96 ms, Memory: 8.00MB
OK (1 test, 5 assertions)
Kegagalan sistem perlu ditangani secara efektif untuk kelancaran sistem. Zend Framework hadir dengan filedefault error trappingyang mencetak dan mencatat kesalahan saat terjadi. Penangan kesalahan yang sama ini digunakan untuk menangkapExceptions.
Error Handler menampilkan kesalahan saat debug benar dan mencatat kesalahan saat debug salah. Zend Framework memiliki beberapa kelas pengecualian dan penanganan pengecualian bawaan akan menangkap semua pengecualian yang tidak tertangkap dan membuat halaman yang berguna.
Penanganan Error Default
Kita dapat mengkonfigurasi pengaturan kesalahan default di file konfigurasi aplikasi, myapp / module / Application / config / module.config.php.
Contoh kode parsial adalah sebagai berikut -
'view_manager' => [
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => [
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
],
'template_path_stack' => [
__DIR__ . '/../view',
],
],
Di sini, display_exception, not_found_template, exception_template, error / 404 dan error / index adalah item konfigurasi yang berhubungan dengan error dan cukup jelas.
Item terpenting di antaranya adalah error/index. Ini adalah template yang ditampilkan saat pengecualian terjadi di sistem. Kita dapat memodifikasi template ini, myapp / module / Application / view / error / index.phtml untuk mengontrol jumlah error yang akan ditampilkan.
Pada bab ini, kita akan mempelajari cara membuat Aplikasi Karyawan berbasis MVC lengkap di Zend Framework. Ikuti langkah-langkah yang diberikan di bawah ini.
Langkah 1: Module.php
Pertama, kita harus membuat modul Karyawan di dalam direktori - myapp / module / Employee / src / dan kemudian mengimplementasikan antarmuka ConfigProviderInterface.
Kode lengkap untuk kelas Modul adalah sebagai berikut -
<?php
namespace Employee;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
Langkah 2: composer.json
Konfigurasikan Tutorial modul masuk composer.json di bawah bagian autoload dengan menggunakan kode berikut.
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Tutorial\\": "module/Tutorial/src/",
"Employee\\": "module/Employee/src/"
}
}
Sekarang, perbarui aplikasi menggunakan perintah pembaruan komposer.
composer update
Perintah Komposer akan melakukan perubahan yang diperlukan pada aplikasi dan menampilkan log seperti yang ditunjukkan pada prompt perintah di bawah ini.
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Removing zendframework/zend-component-installer (0.3.0)
- Installing zendframework/zend-component-installer (0.3.1)
Downloading: 100%
- Removing zendframework/zend-stdlib (3.0.1)
- Installing zendframework/zend-stdlib (3.1.0)
Loading from cache
- Removing zendframework/zend-eventmanager (3.0.1)
- Installing zendframework/zend-eventmanager (3.1.0)
Downloading: 100%
- Removing zendframework/zend-view (2.8.0)
- Installing zendframework/zend-view (2.8.1)
Loading from cache
- Removing zendframework/zend-servicemanager (3.1.0)
- Installing zendframework/zend-servicemanager (3.2.0)
Downloading: 100%
- Removing zendframework/zend-escaper (2.5.1)
- Installing zendframework/zend-escaper (2.5.2)
Loading from cache
- Removing zendframework/zend-http (2.5.4)
- Installing zendframework/zend-http (2.5.5)
Loading from cache
- Removing zendframework/zend-mvc (3.0.1)
- Installing zendframework/zend-mvc (3.0.4)
Downloading: 100%
- Removing phpunit/phpunit (5.7.4)
- Installing phpunit/phpunit (5.7.5)
Downloading: 100%
Writing lock file
Generating autoload files
Langkah 3: module.config.php untuk Modul Karyawan
Buat file konfigurasi modul, “module.config.php” di bawah myapp / module / Employee / config dengan kode berikut.
<?php
namespace Employee;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\EmployeeController::class => InvokableFactory::class,
],
],
'view_manager' => [
'template_path_stack' => ['employee' => __DIR__ . '/../view',],
],
];
Sekarang, konfigurasikan modul Karyawan di file konfigurasi tingkat aplikasi - myapp / config / modules.config.php.
return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial', 'Employee'];
Langkah 4: EmployeeController
Buat kelas PHP baru, EmployeeController dengan memperluas AbstractActionController dan letakkan di direktori myapp / module / Employee / src / Controller.
Daftar kode lengkapnya adalah sebagai berikut -
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class EmployeeController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
Langkah 5: Konfigurasi Router
Mari kita tambahkan rute segmen dalam modul Karyawan kita. Perbarui file konfigurasi modul karyawan, module.config.php yang tersedia di myapp / module / Employee / config.
<?php
namespace Employee;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\EmployeeController::class => InvokableFactory::class,
],
],
'router' => [
'routes' => [
'employee' => [
'type' => Segment::class,
'options' => [
'route' => '/employee[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\EmployeeController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
'employee' => __DIR__ . '/../view',
],
],
];
Kami telah berhasil menambahkan perutean untuk modul Karyawan kami. Langkah selanjutnya adalah membuat skrip tampilan untuk aplikasi Karyawan.
Langkah 6: Buat ViewModel
Buat file bernama "index.phtml" di bawah direktori myapp / module / Employee / view / employee / employee.
Tambahkan perubahan berikut di file -
<div class = "row content">
<h3>This is my first Zend application</h3>
</div>
Move to “EmployeeController.php” file and edit the following changes,
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class EmployeeController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
Terakhir, modul Karyawan berhasil diselesaikan. kita dapat mengaksesnya menggunakan url berikut -http://localhost:8080/employee.
Hasil
Pada langkah selanjutnya, kami akan tampil add, edit dan deleteoperasi data dalam aplikasi karyawan. Untuk melakukan operasi ini, pertama-tama kita harus membuat model database. Ini dijelaskan pada langkah berikutnya.
Langkah 7: Buat Model
Mari kita buat model, Karyawan di modul kita src directory. Umumnya, model dikelompokkan di bawah folder Model (myapp / module / Employee / src / Model / Employee.php)
<?php
namespace Employee\Model;
class Employee {
public $id; public $emp_name;
public $emp_job;
}
Langkah 8: Tabel MySQL
Buat database dengan nama tutorials di server MYSQL lokal menggunakan perintah berikut -
create database tutorials;
Mari kita buat tabel bernama employee dalam database menggunakan perintah SQL berikut -
use tutorials;
CREATE TABLE employee (
id int(11) NOT NULL auto_increment,
emp_name varchar(100) NOT NULL,
emp_job varchar(100) NOT NULL,
PRIMARY KEY (id)
);
Masukkan data ke dalam employee tabel menggunakan kueri berikut -
INSERT INTO employee (emp_name, emp_job) VALUES ('Adam', 'Tutor');
INSERT INTO employee (emp_name, emp_job) VALUES ('Bruce', 'Programmer');
INSERT INTO employee (emp_name, emp_job) VALUES ('David', 'Designer');
Langkah 9: Perbarui Konfigurasi Database
Perbarui file Konfigurasi Global, myapp / config / autoload / global.php dengan informasi drive database yang diperlukan.
return [
'db' => [
'driver' => 'Pdo',
'dsn' => 'mysql:dbname = tutorials;host=localhost',
'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''],
],
];
Sekarang, Perbarui kredensial database di file konfigurasi lokal - myapp / config / autoload / local.php. Dengan cara ini, kami dapat memisahkan kredensial koneksi database lokal dan langsung.
<?php
return array(
'db' => array('username' => '<user_name>', 'password' => '<password>',),
);
Langkah 10: Terapkan exchangeArray
Menerapkan fungsi exchangeArray dalam model Karyawan.
<?php
namespace Employee\Model;
class Employee {
public $id;
public $emp_name; public $emp_job;
public function exchangeArray($data) { $this->id = (!empty($data['id'])) ? $data['id'] : null;
$this->emp_name = (!empty($data['emp_name'])) ? $data['emp_name'] : null; $this->emp_job = (!empty($data['emp_job'])) ? $data['emp_job'] : null;
}
}
Langkah 11: Gunakan TableGateway untuk mengambil Data Karyawan
Buat kelas, EmployeeTable di folder Model itu sendiri. Ini didefinisikan dalam blok kode berikut.
<?php
namespace Employee\Model;
use Zend\Db\TableGateway\TableGatewayInterface;
class EmployeeTable {
protected $tableGateway; public function __construct(TableGatewayInterface $tableGateway) {
$this->tableGateway = $tableGateway;
}
public function fetchAll() {
$resultSet = $this->tableGateway->select();
return $resultSet;
}
}
Langkah 12: Konfigurasi Kelas EmployeeTable
Perbarui layanan karyawan di Module.php menggunakan metode getServiceConfig ()
<?php
namespace Employee;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
public function getServiceConfig() {
return [
'factories' => [
Model\EmployeeTable::class => function ( $container) {
$tableGateway = $container>get( Model\EmployeeTableGateway::class);
$table = new Model\EmployeeTable($tableGateway);
return $table; }, Model\EmployeeTableGateway::class => function ($container) {
$dbAdapter = $container->get(AdapterInterface::class);
$resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new Model\Employee());
return new TableGateway('employee', $dbAdapter, null, $resultSetPrototype);
},
],
];
}
}
Langkah 13: Tambahkan Layanan Karyawan di Controller
Perbarui bagian pengontrol dari Konfigurasi Modul Karyawan di - myapp / module / config / module.config.php seperti yang ditunjukkan di bawah ini.
'controllers' => [
'factories' => [
Controller\EmployeeController::class => function($container) { return new Controller\EmployeeController( $container->get(Model\EmployeeTable::class)
);
},
],
]
Langkah 14: Tambahkan Konstruktor untuk EmployeeController
Tambahkan konstruktor dengan EmployeeTable sebagai argumen dan edit perubahan berikut.
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Employee\Model\Employee;
use Employee\Model\EmployeeTable;
class EmployeeController extends AbstractActionController {
private $table; public function __construct(EmployeeTable $table) {
$this->table = $table;
}
public function indexAction() {
$view = new ViewModel([ 'data' => $this->table->fetchAll(),
]);
return $view;
}
}
Langkah 15: Tampilkan Informasi Karyawan dalam skrip tampilan "index.phtml"
Pindah ke file - index.phtml dan lakukan perubahan berikut -
<?php
$title = 'Employee application';
$this->headTitle($title);
?>
<table class="table">
<tr>
<th>Employee Name</th>
<th>Employee Job</th>
<th>Edit/Delete operations</th>
</tr>
<?php foreach ($data as $empdata) : ?>
<tr>
<td><?php echo $this->escapeHtml($empdata->emp_name);?></td>
<td><?php echo $this->escapeHtml($empdata->emp_job);?></td>
<td>
<a href="<?php echo $this->url('employee', array('action'=>'edit', 'id' =>$empdata->id));?>">Edit</a>
<a href="<?php echo $this->url('employee', array('action'=>'delete', 'id' => $empdata->id));?>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>
Sekarang kami telah berhasil membuat model database dan dapat mengambil catatan dalam aplikasi.
Minta aplikasi menggunakan url - http://localhost:8080/employee.
Hasil
Langkah selanjutnya menjelaskan tentang insert, edit dan delete operasi data dalam modul karyawan.
Langkah 16: Buat Formulir Karyawan
Buat file bernama EmployeeForm.phpdi direktori myapp / module / Employee / src / Form. Ini dijelaskan dalam blok kode di bawah ini.
<?php
namespace Employee\Form;
use Zend\Form\Form;
class EmployeeForm extends Form {
public function __construct($name = null) { / / we want to ignore the name passed parent::__construct('employee'); $this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array( 'name' => 'emp_name', 'type' => 'Text', 'options' => array( 'label' => 'Name', ), )); $this->add(array(
'name' => 'emp_job',
'type' => 'Text',
'options' => array(
'label' => 'Job',
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Go',
'id' => 'submitbutton',
),
));
}
}
Langkah 17: Perbarui Model Karyawan
Perbarui model karyawan dan terapkan InputFilterAwareInterface. Pindah ke direktori myapp / module / Employee / src / Employee / Model dan tambahkan perubahan berikut di fileEmployee.phpfile.
<?php
namespace Employee\Model;
// Add these import statements
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
class Employee implements InputFilterAwareInterface {
public $id;
public $emp_name; public $emp_job;
protected $inputFilter; public function exchangeArray($data) {
$this->id = (isset($data['id'])) ? $data['id'] : null; $this->emp_name = (isset($data['emp_name'])) ? $data['emp_name'] : null;
$this->emp_job = (isset($data['emp_job'])) ? $data['emp_job'] : null; } // Add content to these methods: public function setInputFilter(InputFilterInterface $inputFilter) {
throw new \Exception("Not used");
}
public function getInputFilter() {
if (!$this->inputFilter) { $inputFilter = new InputFilter();
$inputFilter->add(array( 'name' => 'id', 'required' => true, 'filters' => array( array('name' => 'Int'), ), )); $inputFilter->add(array(
'name' => 'emp_name',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array('name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 50,
),
),
),
));
$inputFilter->add(array( 'name' => 'emp_job', 'required' => true, 'filters' => array( array('name' => 'StripTags'), array('name' => 'StringTrim'), ), 'validators' => array( array('name' => 'StringLength', 'options' => array( 'encoding' => 'UTF-8', 'min' => 1, 'max' => 50, ), ), ), )); $this->inputFilter = $inputFilter; } return $this->inputFilter;
}
}
Langkah 18: Tambahkan addAction di Employee Controller
Tambahkan perubahan berikut di EmployeeController kelas.
<?php
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Employee\Model\Employee;
use Employee\Model\EmployeeTable;
use Employee\Form\EmployeeForm;
public function addAction() {
$form = new EmployeeForm(); $form->get('submit')->setValue('Add');
$request = $this->getRequest();
if ($request->isPost()) { $employee = new Employee();
$form->setInputFilter($employee->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) { $employee->exchangeArray($form->getData()); $this->table->saveEmployee($employee); // Redirect to list of employees return $this->redirect()->toRoute('employee');
}
}
return array('form' => $form);
}
Langkah 19: Tambahkan fungsionalitas penyimpanan di kelas EmployeeTable
Tambahkan dua fungsi berikut di kelas EmployeeTable - myapp / module / Employee / src / Model / EmployeeTable.php
public function getEmployee($id) {
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id)); $row = $rowset->current(); if (!$row) {
throw new \Exception("Could not find row $id"); } return $row;
}
public function saveEmployee(Employee $employee) { $data = array (
'emp_name' => $employee->emp_name, 'emp_job' => $employee->emp_job,
);
$id = (int) $employee->id;
if ($id == 0) { $this->tableGateway->insert($data); } else { if ($this->getEmployee($id)) { $this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Employee id does not exist');
}
}
}
Langkah 20: Buat skrip Tampilan untuk metode AddAction, Add.phtml
Tambahkan perubahan berikut pada file "Add.phtml" di - myapp / module / view / employee / employee.
<?php
$title = 'Add new employee'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form->setAttribute('action', $this->url('employee', array('action' => 'add'))); $form->prepare();
echo $this->form()->openTag($form);
echo $this->formHidden($form->get('id'));
echo $this->formRow($form->get('emp_name'))."<br>";
echo $this->formRow($form->get('emp_job'))."<br>";
echo $this->formSubmit($form->get('submit'));
echo $this->form()->closeTag();
Request the application using the url, http://localhost:8080/employee/add
Hasil
Setelah data ditambahkan, itu akan dialihkan ke halaman beranda.
Langkah 21: Edit Catatan Karyawan
Mari kita lakukan operasi pengeditan data di modul Karyawan. Perbarui perubahan berikut diEmployeecontroller.php.
public function editAction() {
$id = (int) $this->params()->fromRoute('id', 0); if (!$id) {
return $this->redirect()->toRoute('employee', array( 'action' => 'add' )); } try { $employee = $this->table->getEmployee($id);
} catch (\Exception $ex) { return $this->redirect()->toRoute('employee', array(
'action' => 'index'
));
}
$form = new EmployeeForm(); $form->bind($employee); $form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) { $form->setInputFilter($employee->getInputFilter()); $form->setData($request->getPost()); if ($form->isValid()) {
$this->table->saveEmployee($employee);
// Redirect to list of employees
return $this->redirect()->toRoute('employee'); } } return array('id' => $id, 'form' => $form,);
}
Di sini, kami mencari id, yang berada di rute yang cocok dan kemudian memuat detail karyawan untuk operasi pengeditan.
Langkah 22: Employee.php
Sekarang tambahkan perubahan berikut di file "Employee.php", yang berada di direktori - myapp / module / Employee / src / Employee / Model /.
public function getArrayCopy() {
return get_object_vars($this);
}
Di sini, Zend \ Stdlib \ Hydrator \ ArraySerializable mengharapkan untuk menemukan dua metode dalam model: getArrayCopy() dan exchangeArray().
Di mana, exchangeArray () digunakan untuk iterasi. Fungsi ini digunakan untuk mengikat data dari tabel karyawan.
Sekarang, kita perlu membuat skrip tampilan untuk editAction().
Langkah 23: Buat Edit.phtml
Buat file skrip tampilan di modul / Karyawan / tampilan / karyawan / karyawan / edit.phtml
<?php
$title = 'Edit employee records'; $this->headTitle($title); ?> <h1><?php echo $this->escapeHtml($title); ?></h1> <?php $form = $this->form; $form->setAttribute('action', $this->url( 'employee', array('action' => 'edit', 'id' => $this->id,)
));
$form->prepare(); echo $this->form()->openTag($form); echo $this->formHidden($form->get('id')); echo $this->formRow($form->get('emp_name'))."<br>"; echo $this->formRow($form->get('emp_job'))."<br>"; echo $this->formSubmit($form->get('submit')); echo $this->form()->closeTag();
Mengedit detail karyawan ditunjukkan pada tangkapan layar berikut.
Setelah data diedit, itu akan dialihkan ke halaman beranda.
Langkah 24: Tambahkan metode deleteEmployee
Tambahkan metode deleteEmployee di kelas EmployeeTable - myapp / module / Employee / src / Model / EmployeeTable.php
public function deleteEmployee($id) { $this->tableGateway->delete(['id' => (int) $id]);
}
Langkah 25: Hapus Catatan Karyawan
Sekarang mari kita melakukan operasi penghapusan data di modul Karyawan. Tambahkan metode berikut,deleteAction di kelas EmployeeController.
public function deleteAction() {
$id = (int) $this->params()->fromRoute('id', 0); if (!$id) {
return $this->redirect()->toRoute('employee'); } $request = $this->getRequest(); if ($request->isPost()) {
$del = $request->getPost('del', 'No');
if ($del == 'Yes') { $id = (int) $request->getPost('id'); $this->table->deleteEmployee($id); } return $this->redirect()->toRoute('employee');
}
return array(
'id' => $id, 'employee' => $this->table->getEmployee($id)
);
}
Di sini, metode deleteEmployee () menghapus karyawan dengan miliknya id dan dialihkan ke halaman daftar karyawan (halaman muka).
Mari kita sekarang membuat skrip tampilan yang sesuai untuk metode deleteAction ().
Langkah 26: Buat Skrip Tampilan
Buat file bernama delete.phtml di - myapp / module / Employee / view / employee / employee / delete.phtml dan tambahkan kode berikut di dalamnya.
<?php
$title = 'Delete an employee record';
$this->headTitle($title);
?>
<h1><?php echo $this->escapeHtml($title); ?></h1>
'<?php echo $this->escapeHtml($employee->emp_name); ?>' by
'<?php echo $this->escapeHtml($employee->emp_job); ?&'?
<?php
$url = $this->url('employee', array('action' => 'delete', 'id' => $this->id,)); ?> <form action ="<?php echo $url; ?>" method = "post">
<div>
<input type = "hidden" name = "id" value = "<?php echo (int) $employee->id; ?>" />
<input type = "submit" name = "del" value = "Yes" />
<input type = "submit" name = "del" value = "No" />
</div>
</form>
Sekarang, hapus semua karyawan yang menggunakan edit link di halaman beranda dan hasilnya akan seperti yang ditunjukkan pada tangkapan layar berikut.
Hasil
Kami telah berhasil menyelesaikan modul Karyawan dengan menerapkan semua fitur yang diperlukan.
Kesimpulan
Dalam lingkungan yang kompetitif saat ini, Zend framework ditempatkan di posisi teratas oleh pengembang. Ini memberikan abstraksi ke program apa pun atau jenis aplikasi apa pun dalam bahasa PHP. Ini adalah kerangka kerja yang matang dan mendukung fitur bahasa PHP modern. Ini menyenangkan, profesional, berkembang dan mengikuti perkembangan teknologi saat ini.