Zend Framework - Hızlı Kılavuz
Bir PHP Web Çerçevesi, bir web uygulaması geliştirmeye yardımcı olan bir sınıflar koleksiyonudur. Zend, en popüler PHP frameworklerinden biridir. O biropen-source MVC frameworkhızla gelişen, modern web uygulamaları için. Zend Framework birkaç gevşek bağlı bileşene sahiptir, bu nedenle "Bileşen Kitaplığı" olarak adlandırılır. Zend Framework, Zend çerçeve uygulamalarını çalıştırmak için herhangi bir PHP yığını ve Zend sunucusu sağlar.
Zend Studio, Zend Framework ile entegre edilecek özellikler içeren bir IDE'dir. MVC görünümü ve kod üretimi sağlar. Mevcut Zend framework 3.0, JSON RPC sunucusu, XML'den JSON'a dönüştürücü, PSR-7 işlevselliği ve PHP 7 ile uyumluluk gibi yeni bileşenler içerir.
Zend Framework 2, PHP 5.3+ kullanarak web uygulamaları ve hizmetleri geliştirmek için açık kaynaklı bir çerçevedir. Zend Framework 2,% 100 nesne yönelimli kod kullanır ve PHP 5.3'ün yeni özelliklerinin çoğunu kullanır.Namespaces, Lambda Functions ve Closures.
Zend Framework 2, 15 milyondan fazla indirmeye sahip başarılı bir PHP çerçevesi olan Zend Framework 1'den geliştirilmiştir. Zend Server, ücretsiz bir topluluk sürümüne ve ticari bir sürüme sahiptir.
Zend Framework Özellikleri
Zend Framework'ün öne çıkan özelliklerinden bazıları aşağıdaki gibidir -
- Saf nesne yönelimli web uygulama çerçevesi
- Gelişmiş MVC uygulaması
- PostgreSQL, SQLite vb. Dahil olmak üzere çoklu veritabanlarını destekler,
- Basit bulut API'si
- Oturum yönetimi
- Veri şifreleme
- Esnek URI Yönlendirme
- Zend, RESTful API geliştirme desteği sağlar.
- Kod yeniden kullanılabilir ve bakımı daha kolaydır.
Neden Zend Framework?
Zend Framework'ü PHP geliştiricileri tarafından kullanılan önde gelen çerçevelerden biri yapan şey, fikri mülkiyet haklarıyla birlikte temiz ve kararlı kod sağlamasıdır. Programlamayı da kolaylaştırır. Hızlı, öğrenmesi kolay ve kullanışlı bir çerçevedir. Zend, güçlü kriptografi araçlarını ve şifre karma tekniklerini destekler.
Zend Golleri
Zend Çerçevesinin hedefleri aşağıdadır.
- Flexibility
- Basit ve üretken
- Compatibility
- Genişletilebilirlik - Programcı, tüm çerçeve sınıflarını kolayca genişletebilir.
- Taşınabilirlik - Birden çok ortamı destekler
Zend Uygulamaları
Aşağıdaki popüler ürünler Zend Framework kullanılarak geliştirilmiştir.
- McAfee Company web sitesi
- IBM Şirket web sitesi
- Magento - popüler alışveriş sepeti sitelerinden biri.
Zend Framework'ün Avantajları
Zend Framework'ün avantajlarından bazıları aşağıda listelenmiştir.
Loosely Coupled - Zend, uygulamada ihtiyaç duymadığımız modülleri veya bileşenleri silme seçeneği sunar.
Performance- Zend Framework, performans için son derece optimize edilmiştir. Zend Framework 3, önceki sürümünden 4 kat daha hızlıdır.
Security - Çerçeve, endüstri standardı şifrelemeyi destekler.
Testing - PHPUnit, Zend ile entegredir, böylece çerçeveyi kolayca test edebilirsiniz.
Sonraki bölümde Zend Framework'ün nasıl kurulacağını öğreneceğiz.
Zend Framework'ü kurmak için, aşağıdaki adımlarda gösterildiği gibi öncelikle Composer'ı ve PHP'nin en son sürümünü kurmalıyız.
Install Composer- Zend, bağımlılıklarını yönetmek için Composer'ı kullanır, bu nedenle Composer'ın makinenizde kurulu olduğundan emin olun. Besteci yüklü değilse, o zaman resmi web sitesini ziyaret Besteci ve kurun.
Install the latest version of PHP- Zend Framework'ten maksimum fayda sağlamak için PHP'nin en son sürümünü yükleyin. Zend Framework 3 için gerekli minimum sürüm, PHP 5.6 veya sonraki bir sürümüdür.
Zend Framework'ü yükleyin
Zend Framework iki şekilde kurulabilir. Bunlar aşağıdaki gibidir -
- Manuel kurulum
- Composer tabanlı kurulum
Bu iki kurulumu ayrıntılı olarak tartışalım.
Manuel Kurulum
Aşağıdaki bağlantıyı ziyaret ederek Zend Framework'ün en son sürümünü indirin - https://framework.zend.com/downloads/archives
İndirilen arşiv dosyasının içeriğini saklamak istediğiniz klasöre çıkartın. Yerel makinenizde bir Zend Framework kopyasına sahip olduğunuzda, Zend Framework tabanlı web uygulamanız çerçeve sınıflarına erişebilir. Bunu başarmanın birkaç yolu olsa da, PHPinclude_pathdağıtımdaki / library dizini altındaki Zend Framework sınıflarına giden yolu içermesi gerekir. Bu yöntem yalnızca Zend Framework sürüm 2.4 ve öncesi için geçerlidir.
Composer Tabanlı Kurulum
Zend Framework'ü kolayca kurmak için Composer aracını kullanın. Zend Framework'ün en son sürümünü yüklemek için tercih edilen yöntem budur. Zend Framework'ün tüm bileşenlerini kurmak için aşağıdaki Composer komutunu kullanın -
$ composer require zendframework/zendframework
Her Zend Framework modülü / bileşeni ayrı ayrı da kurulabilir. Örneğin,MVC component Zend Framework için aşağıdakileri kullanın composer komut -
$ composer require zendframework/zend-mvc
Zend Framework MVC katman ve modül sistemlerini kullanarak bir iskelet uygulama oluşturalım.
Composer kullanarak kurulum
Yeni bir Zend Framework projesi oluşturmanın en kolay yolu bir Composer kullanmaktır. Aşağıdaki gibi tanımlanmıştır -
$ cd /path/to/install $ composer create-project -n -sdev zendframework/skeleton-application myapp
Ekranınızda şu sonucu görürsünüz -
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.
Artık uygulama yüklendiğine göre, uygulamayı kullanarak hemen test edebilirsiniz. PHP's built-in web server -
$ cd path/to/install/myapp $ composer serve
O zaman şu yanıtı görürsünüz -
> php -S 0.0.0.0:8080 -t public/ public/index.php
Bu, PHP yerleşik CLI sunucusunu 8080 bağlantı noktasında başlatır. Geliştirme sunucusu başlatıldığında, şu adresten siteyi ziyaret edebilirsiniz: (http://localhost:8080/). Yerleşik CLI sunucusu yalnızca geliştirme içindir.
Birim Testleri
İskelet birimi testlerini çalıştırmak için terminalinize aşağıdaki komutu yazın.
$ composer require --dev zendframework/zend-test
Aşağıdaki yanıtı üretecektir -
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
Şimdi test desteği etkinleştirildi, böylece testi aşağıdaki komutu kullanarak çalıştırabilirsiniz.
$ ./vendor/bin/phpunit
Apache Web Sunucusu
Zend Framework tabanlı uygulamayı üretim ortamında barındırmak çok basit ve doğrudur. Sadece birVirtualHost Apache yapılandırma dosyasında ve DocumentRoot için Public Zend Framework uygulamasının klasörü.
Örnek bir yapılandırma (uygulamam) aşağıda verilmiştir -
<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>
Bu bölüme geçmeden önce, MVC'yi kısaca anlamamıza izin verin. BirModel View Controlleruygulama mantığını sunumdan ayıran bir yazılım yaklaşımıdır. Pratikte, sunum ondan ayrı olduğu için web sayfalarının minimum PHP komut dosyası içermesine izin verir.
MVC Bileşenlerinin kısa açıklaması aşağıdaki gibidir
Model- Model, uygulama verilerinin yapısını temsil eder. Tipik olarak, model sınıfları,retrieve, insert ve update business data arka uç veritabanında (MySQL, PostgreSQL, vb.).
View- Görünüm, MVC Uygulamasının sunum katmanıdır. Model verilerini Kontrolör aracılığıyla alır ve gerektiğinde görüntüler. Gevşek bir şekilde bağlanmıştır.Controller ve Model ve bu nedenle, Modeli ve Denetleyiciyi etkilemeden değiştirilebilir.
Controller- Kontrolör, MVC mimarisinin ana bileşenidir. Her istek önce denetleyiciye ulaşır. Başka bir deyişle, kontrolör tüm talebi işler ve Model, View ve ihtiyaç duyulan diğer kaynaklar arasında bir aracı görevi görür.process the HTTP request ve yanıtı oluşturmak için.
Bir sonraki bölümde, Zend Çerçevesinin farklı kavramlarını anlayacağız.
Zend Framework, 60+ bileşenden oluşan bir koleksiyondur. Birbirlerine gevşek bir şekilde bağlılar. Hem bağımsız bileşen olarak hem de tek bir birim olarak çalışan bir bileşen grubu olarak kullanılabilirler.
Zend Framework, en önemli üç bileşeni sağlar:
- zend-servicemanager
- zend-eventmanager ve
- zend-modulemanager.
Zend bileşenlerine diğer bileşenlerle verimli bir şekilde entegre olma yeteneği sağlarlar.
Event Manager- Olay bazlı programlama oluşturma yeteneği verir. Bu, yeni olayların yaratılmasına, enjekte edilmesine ve yönetilmesine yardımcı olur.
Service Manager - Herhangi bir hizmeti (PHP sınıfları) herhangi bir yerden biraz çaba ile tüketme yeteneği sağlar.
Module Manager - Benzer işlevselliğe sahip bir PHP sınıfları koleksiyonunu, adı verilen tek bir birime dönüştürme yeteneği module. Yeni oluşturulan modüller tek bir birim olarak kullanılabilir, bakımı yapılabilir ve yapılandırılabilir.
Bu kavramları sonraki bölümlerde ayrıntılı olarak ele alacağız.
Zend Çerçevesi, adı verilen güçlü bir hizmet bulucu model uygulaması içerir. zend-servicemanager. Zend çerçevesi, tüm işlevleri için hizmet yöneticisini kapsamlı bir şekilde kullanır. Service Manager, Zend Framework için yüksek düzeyde bir soyutlama sağlar. Aynı zamanda Zend Framework'ün diğer tüm bileşenleri ile güzel bir şekilde bütünleşir.
Service Manager'ı yükleyin
Service Manager bileşeni, composer aracı.
composer require zendframework/zend-servicemanager
Misal
Öncelikle, tüm hizmetlerin servis yöneticisine kaydedilmesi gerekir. Hizmetler sunucu yöneticisi sistemine kaydedildikten sonra, minimum çabayla herhangi bir zamanda erişilebilir. Servis yöneticisi, servisi kaydetmek için birçok seçenek sunar. Basit bir örnek aşağıdaki gibidir -
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\InvokableFactory;
use stdClass;
$serviceManager = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class,],
]);
Yukarıdaki kod, stdClass kullanarak sisteme Factoryseçeneği. Şimdi, stdClass'ın bir örneğini herhangi bir zamandaget() Servis yöneticisinin yöntemi aşağıda gösterildiği gibi.
use Zend\ServiceManager\ServiceManager;
$object = $serviceManager->get(stdClass::class);
Get () yöntemi, alınan nesneyi paylaşır ve bu nedenle, get () yöntemini birden çok kez çağırarak döndürülen nesne bir ve aynı örnektir. Her seferinde farklı bir örnek almak için, servis yöneticisi başka bir yöntem sağlar;build() yöntem.
use Zend\ServiceManager\ServiceManager;
$a = $serviceManager->build(stdClass::class); $b = $serviceManager->build(stdClass::class);
Servis Yöneticisi Kaydı
Servis yöneticisi, bir bileşeni kaydetmek için bir dizi yöntem sağlar. En önemli yöntemlerden bazıları aşağıda verilmiştir -
- Fabrika yöntemi
- Soyut fabrika yöntemi
- Başlatıcı yöntemi
- Temsilci fabrika yöntemi
Bunların her birini ilerideki bölümlerde ayrıntılı olarak tartışacağız.
Fabrika Yöntemi
Bir fabrika, temelde herhangi bir çağrılabilir veya FactoryInterface (Zend \ ServiceManager \ Factory \ FactoryInterface).
FactoryInterface'in tek bir yöntemi vardır -
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
FactoryInterface'in argüman detayları aşağıdaki gibidir -
container (ContainerInterface)- ServiceManager'ın temel arayüzüdür. Diğer hizmetleri alma seçeneği sunar.
requestedName - Hizmet adıdır.
options - Servis için ihtiyaç duyulan ek seçenekleri sunar.
FactoryInterface'i uygulayan basit bir sınıf oluşturalım ve sınıfı nasıl kaydedeceğimizi görelim.
Sınıf Testi - Alınacak Nesne
use stdClass;
class Test {
public function __construct(stdClass $sc) { // use $sc
}
}
Test sınıf stdClass'a bağlıdır.
Class TestFactory - Test Nesnesini Başlatacak Sınıf
class TestFactory implements FactoryInterface {
public function __invoke(ContainerInterface $container, $requestedName,
array $options = null) { $dep = $container->get(stdClass::class); return new Test($dep);
}
}
TestFactory stdClass'ı almak için bir kap kullanır, Test sınıfının örneğini oluşturur ve onu döndürür.
Zend Framework Kaydı ve Kullanımı
Şimdi Zend Framework'e nasıl kaydolacağımızı ve kullanacağımızı anlayalım.
serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class, Test::class => TestFactory::class] ]); $test = $sc->get(Test::class);
Servis yöneticisi adında özel bir fabrika sağlar InvokableFactorybağımlılığı olmayan herhangi bir sınıfı almak için. Örneğin,stdClass stdClass başka herhangi bir sınıfa bağlı olmadığından InvokableFactory kullanılarak yapılandırılabilir.
serviceManager $sc = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class]
]);
$stdC = $sc->get(stdClass::class);
Uygulamadan bir nesneyi almanın başka bir yolu FactoryInterface veya kullanarak InvokableFactory aşağıda verilen satır içi yöntemi kullanıyor.
$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class, Test::class => function(ContainerInterface $container, $requestedName) { $dep = $container->get(stdClass::class); return new Test($dep);
},
],
]);
Soyut Fabrika Yöntemi
Bazen, yalnızca çalışma zamanında bildiğimiz nesneler yaratmamız gerekebilir. Bu durum,AbstractFactoryInterface, FactoryInterface'ten türetilen.
AbstractFactoryInterface, nesnenin istenen örnekte yaratılıp yaratılamayacağını kontrol etmek için bir yöntem tanımlar. Nesne oluşturma mümkünse, nesneyi kullanarak oluşturacaktır.__invokemethod FactoryInterface'i seçin ve iade edin.
AbstractFactoryInterface'in imzası aşağıdaki gibidir -
public function canCreate(ContainerInterface $container, $requestedName)
Başlatıcı Yöntemi
Başlatıcı Yöntemi, önceden oluşturulmuş hizmetler için ek bağımlılık enjekte etmek için özel bir seçenektir. UygularInitializerInterface ve mevcut tek yöntemin imzası aşağıdaki gibidir -
public function(ContainerInterface $container, $instance)
function(ContainerInterface $container, $instance) {
if (! $instance instanceof EventManagerAwareInterface) { return; } $instance->setEventManager($container->get(EventManager::class));
}
Yukarıdaki örnekte, yöntem, örneğin EventManagerAwareInterface türünde olup olmadığını kontrol eder. Eğer tipteyseEventManagerAwareInterface, olay yöneticisi nesnesini ayarlar, aksi takdirde ayarlamaz. Yöntem bağımlılığı ayarlayabilir veya ayarlamayabilir, güvenilir değildir ve birçok çalışma zamanı sorunu üretir.
Yetkilendiren Fabrika Yöntemi
Zend Framework, delege modelini destekler DelegatorFactoryInterface. Hizmeti süslemek için kullanılabilir.
Bu işlevin imzası aşağıdaki gibidir -
public function __invoke(ContainerInterface $container,
$name, callable $callback, array $options = null
);
Burada $callback hizmet örneğini dekore etmekten sorumludur.
Tembel Hizmetler
Tembel hizmet, oluşturulma sırasında tam olarak başlatılmayacak hizmetlerden biridir. Sadece referans alınır ve yalnızca gerçekten ihtiyaç duyulduğunda başlatılır. En iyi örneklerden biri, her yerde ihtiyaç duyulmayabilecek veritabanı bağlantısıdır. Pahalı bir kaynak olmasının yanı sıra oluşturulması zaman alan bir süreçtir. Zend çerçevesi sağlarLazyServiceFactory dan türetilmiş DelegatorFactoryInterfaceyardımı ile tembel hizmet üretebilen Delegator konsept ve bir 3. taraf proxy yöneticisi; ocramius proxy manager.
eklenti Yöneticisi
Eklenti Yöneticisi, hizmet yöneticisini genişletir ve örnek doğrulama gibi ek işlevler sağlar. Zend Framework, eklenti yöneticisini kapsamlı bir şekilde kullanır.
Örneğin, tüm doğrulama hizmetleri, ValidationPluginManager.
Yapılandırma Seçeneği
Servis yöneticisi, bir servis yöneticisinin özelliğini genişletmek için bazı seçenekler sunar. Onlarshared, shared_by_default ve aliases. Daha önce tartıştığımız gibi, alınan nesneler varsayılan olarak istenen nesneler arasında paylaşılır vebuild()farklı bir nesne elde etme yöntemi. Ayrıca kullanabilirizsharedhangi hizmetin paylaşılacağını belirleme seçeneği. shared_by_default ile aynı shared özelliği, tüm hizmetler için geçerli olması dışında.
$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
]);
aliasesseçeneği, kayıtlı hizmetlere alternatif bir ad sağlamak için kullanılabilir. Bunun hem avantajları hem de dezavantajları vardır. Olumlu tarafı, bir hizmet için alternatif kısa isimler sağlayabiliriz. Ancak, aynı zamanda ad bağlam dışına çıkabilir ve hatalar ortaya çıkarabilir.
aliases' => ['std' => stdClass::class, 'standard' => 'std']
Tüm modern uygulamalar sağlam ve esnek etkinlik bileşenlerine ihtiyaç duyar. Zend Framework böyle bir bileşen sağlar,zend-eventmanager. Zend-eventmanager, üst düzey mimari tasarlamaya yardımcı olur ve konu / gözlemci modelini ve görünüm odaklı programlamayı destekler.
Etkinlik Yöneticisini Kurun
Olay yöneticisi kullanılarak kurulabilir. Composer aşağıda belirtildiği gibi -
composer require zendframework/zend-eventmanager
Etkinlik Yöneticisinin Kavramları
Etkinlik yöneticisinin temel kavramları aşağıdaki gibidir -
Event - Etkinlik keyfi olarak eylem olarak adlandırılır, diyelim ki greet.
Listener- Herhangi bir PHP geri araması. Olaylara eklenirler ve olay tetiklendiğinde çağrılırlar. Listener'ın varsayılan imzası -
function(EventInterface $e)
EventInterface Class- Olayın kendisini belirtmek için kullanılır. Ad (set / getName), target (get / setTarget) ve parametre (get / setParams) gibi olay bilgilerini ayarlama ve alma yöntemlerine sahiptir.
EventManager class- EventManager örneği, bir uygulamadaki tüm tanımlanmış olayları ve karşılık gelen dinleyicileri izler. EventManager bir yöntem sağlar,attach bir olaya dinleyici eklemek ve bir yöntem sağlar, triggerönceden tanımlanmış herhangi bir olayı tetiklemek için. Tetikleyici çağrıldığında, EventManager kendisine bağlı dinleyiciyi çağırır.
EventManagerAwareInterface- Bir sınıfın olay tabanlı programlamayı desteklemesi için EventManagerAwareInterface'i uygulaması gerekir. İki yöntem sağlar,setEventManager ve getEventManager Etkinlik yöneticisini almak ve ayarlamak için.
Misal
Olay yöneticisi konseptini anlamak için basit bir PHP konsol uygulaması yazalım. Aşağıda verilen adımları izleyin.
Bir "olay uygulaması" klasörü oluşturun.
Yüklemek zend-eventmanager besteciyi kullanarak.
Bir PHP dosyası oluşturun Greeter.php "eventapp" klasörünün içinde.
Sınıf oluştur Greeter ve uygulayın EventManagerAwareInterface.
require __DIR__ . '/vendor/autoload.php';
class Greeter implements EventManagerAwareInterface {
// code
}
Buraya, require besteci tarafından yüklenmiş tüm bileşenleri otomatik olarak yüklemek için kullanılır.
Yaz setEventManager sınıftaki yöntem Greeter aşağıda gösterildiği gibi -
public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers([ __CLASS__, get_called_class(),]);
$this->events = $events;
return $this;
}
Bu yöntem, geçerli sınıfı verilen olay yöneticisine ($ olaylar bağımsız değişkeni) ayarlar ve ardından olay yöneticisini yerel değişkende ayarlar $events.
Bir sonraki adım, getEventManager sınıftaki yöntem Greeter aşağıda gösterildiği gibi -
public function getEventManager() {
if (null === $this->events) {
$this->setEventManager(new EventManager()); } return $this->events;
}
Yöntem, olay yöneticisini yerel bir değişkenden alır. mevcut değilse, bir olay yöneticisi örneği oluşturur ve onu döndürür.
Bir yöntem yazın, greet, sınıfta Greeter.
public function greet($message) { printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, $message ]);
}
Bu yöntem olay yöneticisini alır ve ona bağlı olayları tetikler / tetikler.
Sonraki adım, bir örneğini oluşturmaktır. Greeter sınıfını seçin ve yöntemine bir dinleyici ekleyin, 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);
});
Dinleyici geri çağrısı yalnızca olayın adını, hedefi ve sağlanan parametreleri yazdırır.
Tam listesi Greeter.php aşağıdaki gibidir -
<?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");
Şimdi uygulamayı php komut isteminde çalıştırın. Greeter.php ve sonuç aşağıdaki gibi olacaktır -
"Hello" from class
"Hello" from class
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]
Yukarıdaki örnek uygulama, yalnızca bir etkinlik yöneticisinin temellerini açıklamaktadır. Etkinlik yöneticisi, aşağıdakiler gibi daha birçok gelişmiş seçenek sunar:Listener Priority, Custom Callback Prototype / Signature, Short Circuiting, vb. Etkinlik yöneticisi, Zend MVC çerçevesinde yaygın olarak kullanılmaktadır.
Zend Framework, güçlü bir modül sistemi sağlar. Modül sisteminin üç bileşeni vardır. Bunlar aşağıdaki gibidir -
Module Autoloader- Modül Otomatik Yükleyici, çeşitli kaynaklardan modüllerin konumlandırılmasından ve yüklenmesinden sorumludur. Paketlenmiş modülleriPhar archivesyanı sıra. Module Autoloader uygulaması myapp / vendor / zendframework / zend-loader / src / ModuleAutoloader.php adresinde bulunur.
Module Manager- Modül Otomatik Yükleyici modülleri bulduğunda, modül yöneticisi her modül için bir dizi olay başlatır. Modül Yöneticisinin uygulaması myapp / vendor / zendframework / zendmodulemanager / src / ModuleManager.php'de bulunur.
Module Manager Listeners- Modül Yöneticisi tarafından tetiklenen olaylara eklenebilirler. Modül yöneticisinin olaylarına ekleyerek, modülleri çözme ve yüklemeden her modül için karmaşık işler yapmaya kadar her şeyi yapabilirler.
MVC Web Modül Sistemi
Zend Framework'teki MVC Web Uygulaması genellikle Modüller olarak yazılır. Tek bir web sitesi, işleve göre gruplandırılmış bir veya daha fazla modül içerebilir. MVC-Oriented modül için önerilen yapı aşağıdaki gibidir -
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>
Yapı, önceki bölümde tartışılanla aynıdır, ancak burada geneldir. autoload_ files modülde bulunan sınıfları gelişmiş kullanmadan otomatik yüklemek için varsayılan bir mekanizma olarak kullanılabilir. Module Manager mevcut zend-modulemanager.
autoload_classmap.php - Bir sınıf adı dizisi ve buna karşılık gelen dosya adını döndürür.
autoload_function.php- Bir PHP geri araması döndürür. Bu, autoload_classmap.php tarafından döndürülen sınıfları kullanabilir.
autoload_register.php - autoload_function.php tarafından döndürülen PHP geri aramasını kaydeder.
Bu otomatik yükleme dosyaları gerekli değildir, ancak önerilir. İskelet uygulamasında biz kullanmadıkautoload_ files.
Modül Sınıfı
Module sınıfı adlandırılmalıdır Module ve modül sınıfının ad alanı olmalıdır Module name. Bu, Zend Framework'ün modülü kolayca çözmesine ve yüklemesine yardımcı olacaktır. Application iskelet (myapp) uygulamasındaki modül kodu, myapp / module / Application / src / Module.php aşağıdaki gibidir -
namespace Application;
class Module {
const VERSION = '3.0.2dev';
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
Zend Framework modül yöneticisi, getConfig() otomatik olarak çalışır ve gerekli adımları atar.
Bu bölümde, Zend Framework uygulamasının yapısını anlayalım. Yapısımyapp uygulama aşağıdaki gibidir -
├── 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
Zend Framework uygulaması farklı klasörlerden oluşur. Bunlar aşağıdaki gibidir -
Application- Bu dizin uygulamanızı içerir. MVC sistemini, yapılandırmaları, kullanılan hizmetleri ve önyükleme dosyanızı barındıracaktır.
Config - Bu dizin, bir uygulamanın yapılandırma dosyalarını içerir.
Data - Bu dizin, geçici ve muhtemelen geçici olan uygulama verilerini depolamak için bir yer sağlar.
Module - Modüller, geliştiricinin bir dizi ilgili denetleyiciyi mantıksal olarak organize edilmiş bir grupta gruplamasına izin verir.
Public- Bu, uygulamanın belge köküdür. Zend uygulamasını başlatır. Ayrıca JavaScript, CSS, Görseller vb. Gibi uygulamanın varlıklarını da içerir.
Vendor - Bu dizin, besteci bağımlılıklarını içerir.
Uygulama Modüllerinin Yapısı
Bu, uygulamanızın ana dizinidir. Zend Framework 2, uygulamayı verimli bir şekilde organize etmek için güçlü ve esnek bir modül sistemi sunar. Applicationiskelet uygulamasının modülü (myapp) tüm uygulamaya önyükleme, hata ve yönlendirme yapılandırması sağlar. YapısıApplication modül aşağıda gösterildiği gibidir -
├── 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
Bu modül dizinlerinin her birini ayrıntılı olarak ele alalım -
Application- Bu, modülün kök dizinidir. Klasörün adı, modülün adıyla eşleşecek ve adı, modül içinde tanımlanan tüm sınıfların PHP ad alanı olarak da kullanılacaktır. MVC sisteminin yanı sıra yapılandırmaları, kullanılan hizmetleri ve önyükleme dosyanızı barındıracaktır.
Config - Modülün bağımsız konfigürasyonu.
Src - Uygulamanın ana iş mantığı.
View- Tasarım / sunum (HTML) dosyalarını içerir. Örneğin, index.phtml.
src/Module.php- Modülün kalbidir. Modül için bir "ön denetleyici" olarak çalışır. Zend sürecisrc/Module.php bu modüldeki herhangi bir PHP Sınıfını işlemeden önce.
Application/config/module.config.php - Yönlendirici yapılandırması ve otomatik yükleme dosyaları için uygulanır.
Application/view/layout- Düzenler, birden çok görünümün ortak parçalarını temsil eder. Örneğin, sayfa üst bilgisi ve altbilgi. Varsayılan olarak, düzenler şurada saklanmalıdır:views/layoutsfolder.
Tüm modüller, yukarıdaki Uygulama modülüyle aynı veya benzer yapıyı paylaşır .
Bu bölümde, Zend Framework'te MVC tabanlı bir modülün nasıl oluşturulacağını öğreneceğiz. Diye adlandırılan bir modül oluşturalımTutorial modül oluşturma sürecini anlamak için.
Adlı yeni bir PHP sınıfı oluşturun Module –myapp / module / Tutorial / src / dizininin içinde ve ConfigProviderInterface'i uygulayın.
Ayarlamak Tutorial için ad alanı olarak Module sınıf.
Herkese açık bir işlev yazın getConfig içinde Module sınıf ve yapılandırma dosyasını döndür Tutorial Modül.
İçin tam kod Module sınıf aşağıdaki gibidir -
<?php
namespace Tutorial;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
Yapılandırın Tutorial modüldeki composer.json altında autoload aşağıdaki kodu kullanarak bölümü.
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Tutorial\\": "module/Tutorial/src/"
}
}
Besteciyi kullanarak uygulamayı güncelleyin update komutu aşağıda gösterildiği gibi.
composer update
composer command uygulamada gerekli değişiklikleri yapacak ve aşağıda gösterildiği gibi komut isteminde günlükleri gösterecektir -
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
Modül yapılandırma dosyasını "module.config.php" adresinde oluşturun. /config/ aşağıdaki kod ile -
<?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',],
],
];
Yapılandırma dosyası üç bölümden oluşur ve bunlar aşağıdaki gibidir -
Controller configuration - Modül içinde bulunan denetleyicileri belirtin.
Routing configuration - Modüldeki denetleyicilerin URL'lere nasıl çözümlenmesi gerektiğini belirtin.
View configuration - Görünümlerin konumu vb. Gibi motoru görüntülemekle ilgili yapılandırmayı belirtin.
Yapılandırın Tutorial uygulama seviyesi konfigürasyon dosyasındaki modül - myapp / config / modules.config.php.
return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial'];
Uygulamayı çalıştırarak çalıştırın. composer serve uygulama klasörünün kökünde.
Başarıyla yeni bir modül ekledik, ancak yine de eklememiz gerekiyor Controller, Routing ve Views başarıyla çalıştırmak için Tutorial modül.
Daha önce tartışıldığı gibi, controllerZend MVC Çerçevesinde önemli bir rol oynar. Bir uygulamadaki tüm web sayfalarının bir kontrolör tarafından ele alınması gerekir.
Zend MVC Çerçevesinde, kontrolörler - Zend / Stdlib / DispatchableInterface'i uygulayan nesnelerdir. DispatchableInterface tek bir yöntemi vardır, dispatch, hangisini alır Request girdi olarak nesne, biraz mantık yap ve geri dön Response çıktı olarak bir nesne.
dispatch(Request $request, Response $response = null)
"Hello World" döndürmek için bir Controller nesnesinin basit bir örneği aşağıdaki gibidir -
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!");
}
}
DispatchableInterfacetemeldir ve üst düzey denetleyicileri yazmak için birçok başka arabirime ihtiyaç duyar. Bu tür arayüzlerden bazıları aşağıdaki gibidir -
InjectApplicationEventInterface - Olayları enjekte etmek için kullanılır (Zend EventManager)
ServiceLocatorAwareInterface - Hizmetleri bulmak için kullanılır (Zend ServiceManager)
EventManagerAwareInterface - Olayları yönetmek için kullanılır (Zend EventManager)
Bunları akılda tutarak, Zend Framework bu arayüzleri uygulayan birçok hazır kontrolör sağlar. En önemli kontrolörler aşağıda açıklandığı gibidir.
AbstractActionController
AbstractActionController (Zend / Mvc / Controller / AbstractActionController), Zend MVC Çerçevesinde en çok kullanılan denetleyicidir. Tipik bir web sayfası yazmak için gerekli tüm özelliklere sahiptir. Yolların (Yönlendirme, istek url'sini bir denetleyiciyle eşleştiriyor ve yöntemlerinden biri) biraction. Eşleştirildiğinde, eylemin adını taşıyan bir yöntem denetleyici tarafından çağrılacaktır.
Örneğin, bir rota test eşleşti ve rota, test İadeler hello eylem için, sonra helloAction yöntem çağrılacaktır.
Bize yazalım TutorialController kullanmak AbstractActionController.
Adlı yeni bir PHP sınıfı oluşturun TutorialController genişleterek AbstractActionController ve yerleştirin module/Tutorial/src/Controller/ dizin.
Yı kur Tutorial\Controller ad alanı olarak.
Yaz indexAction yöntem.
Geri dön ViewModel nesneden indexActionyöntem. ViewModel nesnesi, sonraki bölümlerde göreceğimiz motoru görüntülemek için denetleyiciden veri göndermek için kullanılır.
Tam kod listesi aşağıdaki gibidir -
?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
Yeniyi başarıyla ekledik TutorialController.
AbstractRestfulController
AbstractRestfulController (Zend \ Mvc \ Controller \ AbstractRestfulController), HTTP method gelen istek ve HTTP yöntemlerini dikkate alarak eylem (yöntem) ile eşleşir
Örneğin, GET HTTP yöntemine sahip istek, ya getList() yöntem veya get() yöntem, eğer id parametresi istekte bulunur.
AbstractConsoleController
AbstractConsoleController (Zend \ Mvc \ Controller \ AbstractConsoleController), bir tarayıcı yerine yalnızca konsol ortamında çalışması dışında AbstractActionController gibidir.
Yönlendirme haritaları Request URIbelirli bir denetleyicinin yöntemine. Bu bölümde, yolları bir Zend Çerçevesinde nasıl uygulayacağımızı göreceğiz.
Genel olarak, herhangi bir URI'nin üç bölümü vardır -
- Ana bilgisayar adı segmenti,
- Yol segmenti ve
- Sorgu segmenti.
Örneğin, URI / URL'de - http://www.example.com/index?q=data, www.example.com Ana Bilgisayar Adı Segmenti, index Yol Segmenti ve q=dataSorgu Segmentidir. Genel olarak yönlendirme,Page segmentbir dizi kısıtlamaya karşı. Herhangi bir sınırlama eşleşirse, bir dizi değer döndürür. Ana değerlerden biri kontrolördür.
Yönlendirme ayrıca belirli bir durumda ana bilgisayar segmentini, sorgu segmentini, istek HTTP yöntemlerini, istek HTTP üstbilgilerini vb. Kontrol eder.
Rota ve RouteStack
Rota, yönlendirmedeki ana nesnedir. Zend Framework, rota nesnesi için özel bir arayüze sahiptir,RouteInterface. Tüm rota nesnesinin RouteInterface'i uygulaması gerekir. RouteInterface'in tam listesi aşağıdaki gibidir -
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 = []);
}
Ana yöntem match. Bu eşleştirme yöntemi, verilen talebi içinde tanımlanan kısıtlamaya göre kontrol eder. Herhangi bir eşleşme bulunursa,RouteMatchnesne. Bu RouteMatch nesnesi, eşleşen isteğin ayrıntılarını parametre olarak sağlar. Bu parametreler şuradan çıkarılabilir:RouteObject kullanmak getParams yöntem.
RouteObject öğesinin tam listesi aşağıdaki gibidir -
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);
}
Genel olarak, tipik bir MVC uygulamasının birçok yolu vardır. Bu rotaların her biri LIFO sırasına göre işlenecek ve tek bir rota eşleştirilerek iade edilecektir. Eşleşen / döndürülen yol yoksa, uygulama "Sayfa bulunamadı" hatası verir. Zend Framework, rotaları işlemek için bir arayüz sağlar,RouteStackInterface. Bu RouteStackInterface, yol ekleme / kaldırma seçeneğine sahiptir.
RouteStackInterface'in tam listesi aşağıdaki gibidir -
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 çerçevesi, RouteStack arayüz ve aşağıdaki gibidir -
- SimpleRouteStack
- TreeRouteStack
Güzergah Türleri
Zend çerçevesi, "Zend \ Mvc \ Router \ Http" ad alanı altındaki tüm durumlar için çok sayıda hazır yönlendirme nesnesi sağlar. Verilen durum için uygun rota nesnesini seçmek ve kullanmak yeterlidir.
Mevcut rotalar aşağıdaki gibidir -
Hostname - URI'nin ana bilgisayar kısmıyla eşleşmek için kullanılır.
Literal - Tam URI ile eşleşmek için kullanılır.
Method - Gelen isteğin HTTP yöntemini eşleştirmek için kullanılır.
Part - Özel mantık kullanarak URI yol segmentinin bir kısmını eşleştirmek için kullanılır.
Regex - URI yolu segmentini Regex Modeli ile eşleştirmek için kullanılır.
Schema - http, https vb. Gibi URI Şemasıyla eşleşmek için kullanılır.
Segment - URI yolunu birden çok segmente bölerek eşleştirmek için kullanılır.
En sık kullanılan değişmez değeri ve Route segmentini nasıl yazacağımızı görelim. Rotalar genellikle her modülün yapılandırma dosyasında belirtilir -module.config.php.
Değişmez Yol
Tipik olarak, rotalar bir LIFO sırasına göre sorgulanır. Değişmez yol, URI yolunun tam olarak eşleşmesini sağlamak içindir.
Aşağıda gösterildiği gibi tanımlanmıştır -
$route = Literal::factory(array(
'route' => '/path',
'defaults' => array('controller' => 'Application\Controller\IndexController',
'action' => 'index',),
));
Yukarıdaki rota, /path istek url'sinde ve döner index olarak action ve IndexController denetleyici olarak.
Segment Rotası
URL'nizin değişken parametreler içermesi gerektiğinde, bölümlere ayrılmış bir yol kullanılır.
Aşağıda verildiği gibi açıklanmıştır -
$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',),
));
Burada, Segmentler iki nokta üst üste ile gösterilir ve ardından alfanümerik karakterler gelir. Bir segmenti tutmanız isteğe bağlıysa, parantez içine alınır. Her bölüm kendisiyle ilişkili kısıtlamalara sahip olabilir. Her kısıtlama bir düzenli ifadedir.
Eğitim Modülünde Rotayı Yapılandırma
Eğitim modülümüze bir segment rotası ekleyelim. Eğitim modülü yapılandırma dosyasını güncelleyin -module.config.php mevcut 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',],
],
];
Başarıyla rotamızı ekledik. Tutorialmodül. Eğitim modülümüzü tamamlamada sadece bir adım gerideyiz. Eklememiz gerekiyorView sonraki bölümde öğreneceğimiz modülümüz için.
Görünüm Katmanı, MVC uygulamasının sunum katmanıdır. Uygulama mantığını sunum mantığından ayırır. Tipik bir PHP web uygulamasında, tüm iş mantığı ve tasarımı birbirine karıştırılmıştır. Intermixing, küçük bir projede daha hızlı geliştirme sağlar. Ancak, birçok üst düzey mimarinin dahil olduğu büyük projelerde sefil bir şekilde başarısız oluyor. Web uygulamasının tasarımını değiştirmek için bir geliştiricinin iş mantığı üzerinde de çalışması gerekir. Bu, iş mantığının bozulmasına neden olacak şekilde felaket olabilir.
Zend Framework, iyi düşünülmüş, temiz, esnek ve genişletilebilir bir Görünüm katmanı sağlar. Görünüm katmanı ayrı bir modül olarak mevcuttur,Zend/View ve iyi entegre Zend/Mvcmodül. Zend Görünüm Katmanı, birbiriyle güzel bir şekilde etkileşime giren birden çok bileşene ayrılmıştır.
Çeşitli bileşenleri aşağıdaki gibidir -
Variables Containers - Görünüm katmanı verilerini tutar.
View Models - Değişken Kapları ve tasarım şablonunu tutar.
Renderers - View Model'den verileri ve şablonu işleyin ve bir tasarım temsili, belki de son html çıktısını çıkarın.
Resolvers - Görünüm Modelinde bulunan şablonu, İşleyicinin kullanabileceği şekilde çözer.
View (Zend\View\View) - İşleyiciye ve ardından işleyiciye yanıt verir.
Rendering Strategies - Oluşturucuya yönelik harita isteği için View tarafından kullanılır.
Response Strategies - Görüntü oluşturucuyu yanıta eşlemek için Görünüm tarafından kullanılır.
Görünüm katmanı, View işler ViewModel, şablonu bir kullanarak çözer Resolver, kullanarak oluştur Rendering Strategy ve son olarak bunu kullanarak çıktılar Response Renderer.
Katman Yapılandırmasını Görüntüle
Denetleyici gibi, bir Görünüm katmanı, bir modülün - olarak adlandırılan yapılandırma dosyasında yapılandırılabilir. module.config.php. Ana yapılandırma, şablonların nereye yerleştirileceğini belirlemektir. Bu, “module.config.php” içine aşağıdaki konfigürasyonu ekleyerek gerçekleştirilebilir.
'view_manager' => [
'template_path_stack' => ['tutorial' => __DIR__ . '/../view',],
]
Varsayılan olarak, Görünüm katmanının tüm bileşenleri için varsayılan bir davranışı vardır. Örneğin, birViewModel"küçük harf-modül-adı / küçük harf-denetleyici-adı / küçük harf-eylem-adı" kuralı ile şablon kökü içindeki bir denetleyicinin eyleminin şablon adını çözer. Ancak bu, tarafından geçersiz kılınabilirsetTemplate() ViewModel yöntemi.
Denetleyiciler ve Görünüm Katmanı
Varsayılan olarak, bir denetleyicinin görünüm katmanına herhangi bir veri göndermesine gerek yoktur. Şablonu uygun yere yazmanız yeterlidir.
Örneğin, bizim örneğimizde, TutorialControllerşablonun şuraya yerleştirilmesi gerekir: myapp/module/Tutorial/view/tutorial/tutorial/index.phtml. index.phtmlPHP tabanlı şablonu ifade eder ve PHPRenderer tarafından işlenecektir. Gibi başka oluşturucular da varJsonRenderer için json çıktı ve FeedRenderer için rss ve atom çıktı.
Tam liste aşağıdaki gibidir -
<?php
namespace Tutorial\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class TutorialController extends AbstractActionController {
public function indexAction() {
}
}
Zend Uygulama Şablonu
<div class = "row content">
<h3>This is my first Zend application</h3>
</div>
Son olarak, başarıyla tamamladık Tutorial modül ve url kullanarak erişebiliriz - http://localhost:8080/tutorial.
Görünüm Katmanına Veri Aktarma
Verileri bir görünüm katmanına göndermenin en basit yolu, ViewModelargümanlar. DeğiştiindexAction yöntem aşağıdaki gibidir -
public function indexAction() {
$view = new ViewModel([ 'message' => 'Hello, Tutorial' ]); return $view;
}
Şimdi değiştir index.phtml aşağıdaki gibi dosya -
<div class = "row content">
<h3>This is my first Zend application</h3>
<h4><?php echo $this->message?></h4>
</div>
Yardımcıları Görüntüle
Bir Görünüm Yardımcısı, şablonlarda kullanılacak küçük, atomik işlevleri yazmak için kullanılır. Zend çerçevesi, standart görünüm yardımcıları yazmak için bir arayüz, Zend \ View \ Helper \ HelperInterface sağlar.
Bir HelperInterface'in yalnızca iki yöntemi vardır,
setView() - Bu yöntem bir Zend \ View \ Renderer \ RendererInterface örneğini / uygulamasını kabul eder.
getView() - Bu örneği almak için kullanılır.
Tam kod listesi HelperInterface aşağıdaki gibidir -
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();
}
Görünüm komut dosyanızda bir yardımcı kullanmak için, $this->helperName().
Yerleşik Yardımcıları
Zend Framework, çeşitli amaçlar için birçok dahili yardımcı işlev sağlar. Görüntülemeye Yardımcı Olanlardan bazılarızend-mvc aşağıdaki gibidir -
URL
URL yardımcısı, uygulamada tanımlanan yollarla eşleşen URL'leri oluşturmak için kullanılır.
URL yardımcısının tanımı -
$this->url($name, $params, $options, $reuseMatchedParameters)
Örneğin, eğitim modülünde rota şu şekilde adlandırılır: tutorial ve iki parametresi var action ve id. Aşağıda gösterildiği gibi iki farklı URL oluşturmak için URL yardımcısını kullanabiliriz -
<a href = "<? = $this->url('tutorial'); ?>">Tutorial Index</a>
<a href = "<? = $this->url('tutorial', ['action' => 'show', 'id' =>10]); ?>">
Details of Tutorial #10
</a>
Sonuç aşağıdaki gibi olacaktır -
<a href = "/tutorial">Tutorial Index</a>
<a href = "/tutorial/show/10"> Details of Tutorial #10</a>
Yer tutucu
Yer tutucu yardımcısı, içeriği görüntüleme komut dosyaları ile görüntüleme örnekleri arasında kalıcı hale getirmek için kullanılır. Verileri başlangıçta ayarlama ve daha sonraki aşamalarda kullanma seçeneği sunar.
Örneğin, diyebiliriz company name ve sonra diğer tüm yerlerde kullanın.
<?php $this->placeholder('companyname')->set("TutorialsPoint") ?>
<?= $this->placeholder('companyname'); ?>
Yer tutucu, PHP dizisi ve nesnelerinden karmaşık içerik oluşturmak için bazı gelişmiş seçenekler sağlar. Ayrıca şablonun belirli bir bölümünü yakalama seçeneğine de sahiptir.
Örneğin, aşağıdaki kod aradaki şablon sonucunu yakalar ve bunu productlist Yer tutucu.
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>
Doküman türü
Doctype yardımcısı, çeşitli html dokümanları oluşturmak için kullanılır. Somut uygulamasıdır.Placeholderyardımcı. Doctype, bir önyükleme dosyasında ve yapılandırma dosyasında ayarlanabilir.
Temel kullanım aşağıda gösterilmiştir -
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
HeadTitle yardımcısı, html başlık öğesini oluşturmak için kullanılır. Somut uygulamasıdırPlaceholderyardımcı. Zend, modül yapılandırma dosyasında başlığı ayarlamak için bir seçenek sunar ve site, modül, kontrolör, eylem vb. Gibi herhangi bir seviyede ayarlanabilir. HeadTitle için kısmi bir kod aşağıdaki gibidir -
Module
headTitleHelper->append($action);
$headTitleHelper->append($controller);
$headTitleHelper->append($module);
$headTitleHelper->append($siteName);
Template
<?= $this->headTitle() ?>
Result
action - controller - module - Zend Framework
HeadMeta
HeadMeta yardımcısı, html meta etiketleri oluşturmak için kullanılır. Yer tutucu yardımcısının somut bir uygulamasıdır.
Template -
<?php
$this->headMeta()->appendName('keywords', 'turorialspoint, zend framework, php');
echo $this->headMeta()
?>
Result
<meta name = "keywords" content = "tutorialspoint, zend framework, php" />
HeadLink
HeadLink yardımcısı, harici kaynakları içerecek html bağlantıları oluşturmak için kullanılır. Yer tutucu yardımcısının somut uygulamasıdır.
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
HeadStyle yardımcısı, satır içi CSS stilleri oluşturmak için kullanılır. Yer tutucu yardımcısının somut uygulamasıdır.
Template
<?php $this->headStyle()->appendStyle($styles); ?> <?php echo $this->headStyle() ?>
HeadScript
HeadScript, satır içi komut dosyası oluşturmak veya harici komut dosyalarını dahil etmek için kullanılır. Yer tutucu yardımcısının somut uygulamasıdır.
Template
<? $this->headScript()->appendFile(‘/js/sample.js’);?> <?php echo $this->headScript() ?>
InlineScript
InlineScript, html şablonunun hem head hem de body bölümünde bir komut dosyası oluşturmak için kullanılır. HeadScript'ten türetilmiştir.
HTMLList
HTMLList, sıralı ve sırasız liste oluşturmak için kullanılır. HTMLList'in tanımı aşağıdaki gibidir -
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>
Döngü
Döngü ortamında alternatifler oluşturmak için Döngü kullanılır. Atama, sonraki ve önceki işlevi vardır.
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>
Diğer birkaç önemli yerleşik yardımcı aşağıdaki gibidir -
BasePath - BasePath, uygulamanın kökünün ortak klasörünün yolunu oluşturmak için kullanılır.
Partial - Kısmi, belirli bir şablonu kendi değişken kapsamında oluşturmak için kullanılır.
PartialLoop - PartialLoop, Partial gibidir, ancak döngü ortamında kullanılır.
Identity - Kimlik, oturum açmış kullanıcının kimliğini Kimlik Doğrulama Hizmetinden almak için kullanılır.
JSON- JSON, çıktının JSON formatında olduğu dinlendirici bir ortamda kullanılır. Uygun HTTP başlığını yayar ve düzen konseptini devre dışı bırakır.
Zend Framework'te hala çok sayıda yardımcı bulunmaktadır. i18n helper, form helpers, pagination helpers, navigation helpers, vb.
Görünüm Yardımcıları Oluşturma
Zend Framework yerleşik bir AbstractHelper uygulama HelperInterface görünüm yardımcıları yazmak için.
Yeni bir yardımcı yazmakla ilgili adımlar aşağıdaki gibidir:
Step 1 - Zend \ View \ Helper \ AbstractHelper sınıfını genişletin.
Step 2 - Geçersiz kıl __invoke() işlevi.
Step 3 - Yapılandırmayı module.config.php file.
Step 4 - Görünüm komut dosyalarında görünüm yardımcısını kullanın.
Şimdi bir oluşturalım TestHelper
Adresinde Yardımcı klasör oluştur myapp/module/Tutorial/src/View directory. YazmakTestHelper Yardımcı dizini içinde, TestHelper.php.
Tam liste aşağıdaki gibidir -
<?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');
}
}
Yapılandırmayı şurada ayarla: module.config.php.
'view_helpers' => [
'aliases' => [
'testHelper' => View\Helper\TestHelper::class,
],
'factories' => [
View\Helper\TestHelper::class => InvokableFactory::class,
],
],
Yeni oluşturulan TestHelper içinde about komut dosyasını görüntüle.
<?= $this->testHelper() ?>
Bir Düzen, birden çok görünümün ortak kısımlarını temsil eder, örneğin, sayfa başlığı ve altbilgi. Varsayılan olarak, düzenler şurada saklanmalıdır:view/layout Klasör.
Bir Düzen yapılandırması, view_manager module.config.php'deki bölüm.
İskelet uygulamasının varsayılan yapılandırması aşağıdaki gibidir -
'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',
),
Burada template_mapdüzeni belirtmek için kullanılır. Düzen bulunmazsa, bir hata döndürür. İskelet uygulamasının ana düzenine bir göz atalım.
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>
Düzeni analiz ederken, çoğunlukla önceki bölümde tartıştığımız görüntü yardımcılarını kullanır. Daha yakından baktığımızda, düzen özel bir değişken kullanır,$this->content. Bu değişken, istenen asıl sayfanın görünüm komut dosyası (şablon) ile değiştirileceğinden önemlidir.
Yeni bir düzen oluşturmak
Tutorial modülümüz için yeni bir düzen oluşturalım.
Başlamak için bir oluşturalım tutorial.css file “public / css” dizini altında.
body {
background-color: lightblue;
}
h1 {
color: white;
text-align: center;
}
Yeni bir düzen dosyası oluşturun newlayout.phtml/ myapp / module / Tutorial / view / layout / dizininde bulun ve içeriği mevcut düzenden kopyalayın. Ardından,tutorial.css stil sayfasını kullanarak HeadLink düzen başlığı bölümünün içindeki yardımcı sınıf.
<?php echo $this->headLink()->appendStylesheet('/css/tutorial.css');?>
Yeni ekle about bağlantısını kullanarak gezinme bölümünde URL yardımcı.
<li><a href = "<?= $this->url('tutorial', ['action' => 'about']) ?>">About</a></li>
Bu düzen sayfası, eğitim modülü uygulaması için ortaktır. Güncelleview_manager eğitim modülü yapılandırma dosyasının bölümü.
'view_manager' => array(
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/newlayout.phtml'),
'template_path_stack' => array('tutorial' => __DIR__ . '/../view',),
)
Ekle aboutAction işlevi TutorialController.
public function aboutAction() {
}
Ekle about.phtml myapp / module / Tutorial / view / tutorial / tutorial / aşağıdaki içeriğe sahip.
<h2>About page</h2>
Artık uygulamayı nihayet çalıştırmaya hazırsınız - http://localhost:8080/tutorial/about.
Bu bölümde, Zend Framework'ün çeşitli modelleri ve veri tabanı hakkında tartışacağız.
Zend Framework'teki modeller
Bir Model, uygulamanın mantıksal veri temsilini tanımlar. Örneğin, bir alışveriş sepeti uygulamasında - Ürün, Müşteri, Alışveriş Sepeti ve Siparişler modellerdir. Tuttuğu varlığın özelliklerini tanımlarlar. Modellerin bazı kavramları aşağıdaki gibidir -
Denetleyiciler modellerle iletişim kurar ve ihtiyaç duydukları bilgileri almalarını ister. Bu geri alınan bilgiler daha sonra kontrolör tarafından Görünüme aktarılır. Son olarak View, modeli kullanıcı tarafından tüketilebilir sunum verileri olarak işleyecektir.
Bir modelin bir görünümle doğrudan etkileşime girmesi çok nadirdir, ancak bazen olabilir.
Modeller birbirleriyle konuşabilir ve bağımsız değildir. Birbirleriyle ilişkileri var. Bu ilişkiler, farklı modellerle etkileşime girmesi gerekmediğinden, bir kontrolörün bilgi almasını kolaylaştırır ve hızlandırır; modeller bunu kendileri yapabilir.
Basit bir modele bir göz atalım - MyModel
<?php
namespace Tutorial\Model;
class Book {
public $id; public $author;
public $title;
}
Zend Framework'te Veritabanı
Zend çerçevesi, bir veritabanı tablosundaki verileri bulmak, eklemek, güncellemek ve silmek için basit ve zengin özelliklere sahip bir Zend \ Db \ TableGateway \ TableGateway sınıfı sağlar.
Nasıl bağlanacağımızı görelim MySqlservice PHP'nin Zend çerçevesindeki PDO sürücüsü aracılığıyla aşağıdaki adımlar aracılığıyla.
Adım 1: MySQL'de veritabanı oluşturun
Veritabanı yarat tutorialsyerel MySQL sunucusunda. Kullanabilirizphpmyadminveya bu amaç için herhangi bir diğer MySQL GUI aracı. KullanalımMySQL clientkomut isteminde. Mysql sunucusuna bağlanın ve aşağıdaki komutu çalıştırın.tutorial veri tabanı.
create database tutorials
Adım 2: Öğreticiler veritabanında tablo oluşturun
Şimdi bir veritabanı oluşturalım book içinde tutorials db aşağıdaki SQL komutunu kullanarak.
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)
);
3. Adım: Kitap tablosundaki verileri doldurun
Doldurun bookörnek veriler içeren tablo. Aşağıdaki SQL komutunu kullanın.
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');
Adım 4: Veritabanı Bağlantısını Güncelleyin
Myapp / config / autoload / global.php olan global konfigürasyon dosyasını gerekli veritabanı sürücü bilgileriyle güncelleyin.
<?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',
),
),
);
5. Adım: Veritabanı Kimlik Bilgilerini Güncelleyin
Myapp / config / autoload / local.php olan yerel yapılandırma dosyasındaki veritabanı kimlik bilgilerini güncelleyin. Bu şekilde yerel ve canlı veritabanı bağlantı kimlik bilgilerini ayırabiliriz.
<?php
return array(
'db' => array(
'username' => '<user_name>',
'password' => '<password>',
),
);
6. Adım: Kitap için Model Oluşturun
Bir Model oluşturalım, Book modülümüzde srcdizin. Modeller genellikle Model klasörü altında gruplanır - /myapp/module/Tutorial/src/Model/Book.php.
<?php
namespace Tutorial\Model;
class Book {
public $id;
public $author; public $title;
}
7. Adım: ExchangeArray'i kitap modelinde uygulayın
TableGateway aracılığıyla bir modelle etkileşime girer exchangeArrayişlevi. ExchangeArray işlevinin standart argümanı, PHP dizisi olarak depolanan veritabanı sonuç kümesidir. KullanmakexchangeArrayfunctionbir modelin özelliği, karşılık gelen veritabanı tablosu ile kolayca senkronize edilebilir.
Modeli güncelleyin, Book aşağıda gösterildiği gibi -
<?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;
}
}
8. Adım: Kitabı getirmek için TableGateway'i kullanın
Bir sınıf oluşturun, BookTableveritabanından kitap bilgilerini almak için. BookTable sınıfını oluşturunModel klasörün kendisi.
<?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;
}
}
Kullandık select()Kitap bilgilerini veritabanından almak için TableGateway sınıfının yöntemi. Ancak, tabloya herhangi bir referans kullanmadık -bookkodda. TableGateway doğası gereği geneldir ve belirli konfigürasyonları kullanarak herhangi bir tablodan veri alabilir. Genellikle bu konfigürasyonlar,module.config.php sonraki adımlarda tartışacağımız dosyası.
9. Adım: BookTable sınıfını yapılandırın
Eğitim modülünü güncelleyin, Module.php ile getServiceConfig() yöntem.
<?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);
},
],
];
}
}
Burada kayıt olduk BookTableservis yöneticisini kullanarak sınıf. BookTable sınıfı, kitap bilgilerini almak için kullanılır ve bunu kaydettirerek, ihtiyaç duyduğumuz her yerde ona erişebiliriz. Kayıtlı servisler paylaşıldığı için performansı artırır, hafıza tüketimini azaltır vb.
Başka bir öğe, Model \ BookTableGateway :: class, için özelleşmiş TableGateway nesnesidir. Book model ve bir bağımlılıktır BookTable.
Adım 10: TutorialController Yapılandırmasını Güncelleyin
İhtiyacımız var BookTablekitap bilgilerini almak için öğretici denetleyicide hizmet. BookTable hizmetini almak için, onu TutorialController'da yapıcı bağımlılığı olarak kaydedin.
Bu Oluşturucu bağımlılığı, denetleyicinin kendisi başlatma aşamasındayken BookTable hizmetinin alınmasına yardımcı olur. Eğitim modülü yapılandırmasının denetleyici bölümünü güncelleyin,module.config.php Aşağıda gösterildiği gibi.
'controllers' => [
'factories' => [
Controller\TutorialController::class => function($container) {
return new Controller\TutorialController(
$container->get(Model\BookTable::class)
);
},
],
],
Adım 11: Eğitim Denetleyicisini Güncelleyin
Bu, aşağıdaki üç adıma bağlı kalarak yapılır.
- Bağımsız değişken olarak BookTable ile yapıcı ekleyin .
private $table;
public function __construct(BookTable $table) { $this->table = $table;
}
Kullanarak kitap bilgilerini alın BookTable's fetchAll() yöntemini seçin ve görünüme kaydedin.
public function indexAction() {
$view = new ViewModel([
'data' => $this->table->fetchAll(), ]); return $view;
}
Kitap bilgilerini görüntüleme komut dosyasında görüntüleyin.
<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>
Adım 12: Uygulamayı çalıştırın
Uygulamayı çalıştırarak kontrol edin - http://localhost:8080/tutorial.
Son bölümde tartışıldığı gibi, Zend çerçevesi, veritabanına erişmek için genel bir yol sağlar. Database Driverkavram. Bir veritabanıyla çalışmak yalnızca sürücü bilgilerine bağlıdır ve bu nedenle, farklı veritabanıyla bağlantı kurmak yalnızca sürücü bilgilerini değiştirmeyi içerir.
Şimdi değiştirelim book bağlanmak için örnek postgresql aşağıdaki adımlarla veritabanı.
Step 1 - Aşağıdaki komutu kullanarak yerel postgresql veritabanında bir veritabanı, öğreticiler oluşturun -
CREATE DATABASE tutorials
Step 2 - Ekle booktablo. Yeni veritabanına gidin ve tablo oluşturma komut dosyasını yürütün.
\c tutorials
CREATE TABLE book (
id SERIAL NOT NULL,
author varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
Step 3 - Aşağıdaki komut dosyasını kullanarak örnek kitap bilgisi ekleyin -
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 - Sürücü bilgilerini şuradaki global.config file.
<?php
return array (
'db' => array (
'driver' => 'Pdo',
'dsn' => 'pgsql:dbname = tutorials;host = localhost',
'driver_options' => array (
),
),
);
Step 5 - Şuradaki veritabanı kimlik bilgilerini değiştirin: local.config dosya.
return array (
'db' => array(
'username' => '<username>',
'password' => '<password>',
),
);
Step 6 - Son olarak uygulamayı çalıştırın http://localhost:8080/tutorial. Sonuç, MySQL uygulamasıyla aynıdır.
Zend Framework ayrı bir bileşen sağlar, zend-formform oluşturma ve doğrulama sürecini hızlandırmak. Modeli ve görünüm katmanını birbirine bağlar. Önceden tanımlanmış modellerden tam teşekküllü html formu oluşturmak için bir dizi form öğesi sağlar.InputFilter modeli forma göre doğrulamak için sınıf ve verileri formdan modele bağlama seçenekleri ve bunun tersi de geçerlidir.
Form Bileşenini Kurun
Zend form bileşeni, Composer komut aşağıda belirtildiği gibi -
composer require zendframework/zend-form
Bir Zend form çerçevesinin, formları yönetmek için üç alt bileşeni vardır. Aşağıda ayrıntılı olarak açıklandığı gibidir -
Elements - Modeldeki bir özelliğe eşlenen tek bir html giriş denetimi tanımlamak için kullanılır.
Fieldset - Öğeleri ve diğerlerini gruplamak için kullanılır fieldset iç içe bir şekilde.
Form - Bir html formu oluşturmak için kullanılır ve öğelerden ve alan kümelerinden oluşur.
Zend Formları genellikle module//src/Form dizin.
Misal
Şimdi eklemek için basit bir form oluşturalım bookveritabanına. Bunu yapmak için aşağıdaki adımlara uymalıyız -
Adım 1: BookForm Oluşturun
* Myapp / module / Tutorial / src / Form ”dizini altında“ BookForm.php ”dosyasını oluşturun. Dosyaya aşağıdaki değişiklikleri ekleyin -
<?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',
),
));
}
}
Form sınıf bir add methodModeli ve ilgili form ayrıntılarını eşlemek için. biz yarattıkBookForm genişleterek Form sınıf ve form ayrıntılarını ekledi Book model.
Adım 2: Kitap modelini güncelleyin, Book.php
Modeli güncelleyin, ‘Book’ aşağıda belirtildiği gibi filtre ve doğrulama ile -
<?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;
}
}
Her model, InputFilterAwareInterface. InputFilterAwareInterface iki yöntem sağlar,setInputFilter() ve getInputFilter().
GetInputFilter, modelin doğrulama ayrıntılarını almak için kullanılır. Zend çerçevesi, formu doğrulamak için zengin bir filtre ve doğrulayıcı seti sağlar. Kitap modelinde kullanılan filtrelerden ve doğrulayıcılardan bazıları aşağıdaki gibidir -
StripTags - İstenmeyen HTML'yi kaldırın.
StringTrim - Gereksiz beyaz alanı kaldırın.
StringLength validator - Kullanıcının belirtilen sınırdan daha fazla karakter girmediğinden emin olun.
3. Adım: BookTable sınıfını güncelleyin
Dahil et saveBook veritabanına kitap ekleme yöntemi.
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');
}
}
}
}
4. Adım: TutorialController sınıfını güncelleyin
Eğitim denetleyicisine yeni bir eylem addAction ekleyin - 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);
}
addAction yöntem aşağıdaki işlemleri yapar -
İstek nesnesini alır.
İsteğin http yönteminin bir post yöntem.
İsteğin http yöntemi değilse post, sadece şablonu oluşturur, add.phtml
İsteğin http yöntemi değilse post, sonra ayarlar inputfilter, istek verisini alır ve onu inputfiler'e ayarlar.
Formun geçerli olup olmadığını kontrol eder. isValid() Form sınıfının yöntemi.
Form geçerli değilse, şablonu tekrar oluşturur, add.phtml
Form geçerli ise kitabı veri tabanına kaydeder ve ana sayfaya yönlendirir.
5. Adım: add.phtml şablonunu ekleyin
Bir şablon oluşturun - myapp / module / Tutorial / view / tutorial / tutorial / add.phtml altında 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();
}
Burada kitap formunu kullanarak Form örnek $form.
Adım 6: Uygulamayı Çalıştırın
Şimdi uygulamayı çalıştırabiliriz - http://localhost:8080/tutorial/add.
Form Page
Validate Error Page
Dosya yükleme, form programlamadaki ana kavramlardan biridir. Zend çerçevesi, dosyaları yüklemek için gerekli tüm öğeleri sağlar.zend-form ve zend-inputfilter bileşen.
FileInput Sınıfı
Zend-inputfilter bileşeni, html dosyası girdi öğesini işlemek için Zend \ InputFilter \ FileInput sınıfını sağlar - <input type = 'file' />. FileInputbirkaç istisna dışında diğer giriş filtreleri gibidir. Bunlar aşağıdaki gibidir -
PHP, yüklenen dosya ayrıntılarını $_FILES genel dizi, FileInput yüklenen dosya bilgilerini yalnızca $ _FILES aracılığıyla toplar.
FileInput sınıfı verileri işlemeden önce doğrulamanın yapılması gerekir. Diğer giriş filtrelerinin tam tersi davranışıdır.
Zend \ Validator \ File \ UploadFile, kullanılacak varsayılan doğrulayıcıdır. UploadFile dosya girişi ayrıntılarını doğrular.
Bir forma dosya yükleme türü eklemek için giriş türünü kullanmamız gerekir File. Kısmi kod aşağıdaki gibidir -
$form->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array('label' => 'Picture',),
));
Dosya yüklemede kullanılan diğer bir sınıf Zend \ Filter \ File \ RenameUpload'dur. RenameUploadyüklenen dosyayı istediğimiz yere taşımak için kullanılır. Dosya filtresini kullanmak için kısmi sınıf aşağıdaki gibidir -
$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);
İşte seçenekleri RenameUpload aşağıdaki gibidir -
target - Yüklenen dosyanın hedef yolu.
randomize - Yüklenen dosyanın tekrarlanmasını önlemek için rastgele bir dize ekleyin.
use_upload_extension - Dosya uzantısını yüklenen dosyaya hedefe ekleyin.
Dosya Yükleme - Çalışma Örneği
Eğitim modülünü değiştirelim ve bir resim yükleme özelliği ekleyelim.
Veritabanı tablosunu değiştirin
Ekleyelim imagepath aşağıdaki SQL komutunu yürüterek kitap tablosuna sütun ekleyin -
ALTER TABLE `book` ADD `imagepath` VARCHAR(255) NOT NULL AFTER 'imagepath';
BookForm.php'yi güncelleyin
Kitap formuna bir resim yüklemek için dosya giriş öğesini ekleyin - myapp / module / Tutorial / src / Model / BookForm.php.
Aşağıdaki kodu __constructmethod BookForm sınıfının.
$this->add(array(
'name' => 'imagepath',
'type' => 'File',
'options' => array ('label' => 'Picture',),
));
Book.php'yi güncelle
Book sınıfında şu değişiklikleri yapın - myapp / module / Tutorial / src / Model / Book.php.
Yeni mülk ekle imagepath resim için.
public $imagepath;
Güncelle getInputFilter aşağıda gösterildiği gibi yöntem -
Ekle FileInput dosya girdi öğesi için filtre.
Yı kur UploadFile dosya giriş öğesini doğrulamak için doğrulama.
Yapılandırın RenameUpload yüklenen dosyayı uygun hedefe taşımak için.
Kısmi kod listesi aşağıdaki gibidir -
$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);
Güncelle exchangeArray dahil etme yöntemi imagepathEmlak. Görüntü yolu bir formdan veya bir veritabanından gelebilir. Görüntü yolu bir formdan geliyorsa, format aşağıdaki spesifikasyona sahip bir dizi olacaktır -
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>
}
}
İmge yolu bir veritabanından geliyorsa, basit bir dizge olacaktır. Bir görüntü yolunu ayrıştırmak için kısmi kod listesi aşağıdaki gibidir -
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;
}
Tam listesi Book model aşağıdaki gibidir -
<?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;
}
}
}
BookTable.php'yi güncelleyin
Güncelledik BookForm ve Book model. Şimdi güncelliyoruzBookTable ve değiştir saveBookyöntem. Bu, veri dizisine görüntü yolu girişini dahil etmek için yeterlidir,$data.
Kısmi kod listesi aşağıdaki gibidir -
$data = array('author' => $book->author, 'title' => $book->title,
'imagepath' => $book->imagepath
);
Tam kod listesi BookTable sınıf aşağıdaki gibidir -
<?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: Dosya yükleme bilgileri şurada mevcut olacaktır: $_FILES küresel dizi ve kullanılarak erişilebilir Request's getFiles()yöntem. Bu nedenle, hem yayınlanan verileri hem de dosya yükleme bilgilerini aşağıda gösterildiği gibi birleştirin.
$post = array_merge_recursive(
$request->getPost()->toArray(), $request->getFiles()->toArray()
);
Tam listesi addAction() yöntem aşağıdaki gibidir -
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);
}
Add.phtml’nin Güncelleme Görünümü
Son olarak, "add.phtml" öğesini değiştirin ve aşağıda gösterildiği gibi imagepath dosya giriş öğesini ekleyin -
echo $this->formRow($form->get('imagepath'))."<br>";
Tam liste aşağıdaki gibidir -
<?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();
}
Uygulamayı çalıştırın
Son olarak, uygulamayı şu adresten çalıştırın: http://localhost:8080/tutorial/add ve yeni kayıtları ekleyin.
Sonuç, aşağıdaki ekran görüntülerinde gösterildiği gibi olacaktır -
Form Page
Index Page
AJAX, web programlamada modern bir teknolojidir. Bir web sayfasındaki verileri sayfayı yenilemeden eşzamansız olarak göndermek ve almak için seçenekler sunar. Zend çerçevesi,json aracılığıyla model zend-view ve zend-jsonbileşen. Bu bölümde Zend AJAX programlamasını öğrenelim.
Json bileşenini yükleyin
Zend json bileşeni, Composer komut aşağıda belirtildiği gibi -
composer require zendframework/zend-json
Konsept
Zend çerçevesi, AJAX etkin bir web uygulamasını kolayca yazmak için iki yöntem sağlar. Bunlar aşağıdaki gibidir -
isXmlHttpRequest() yöntem Requestobject - Bir AJAX isteği yapılırsa, istek nesnesinin isXmlHttpRequest () yöntemi true, aksi takdirde false döndürür. Bu yöntem, bir AJAX isteğini sunucu tarafında düzgün şekilde işlemek için kullanılır.
if ($request->isXmlHttpRequest()) {
// Ajax request
} else {
// Normal request
}
Zend / Görünüm / Model / JsonModel - JsonModel için bir alternatif ViewModelAJAX ve REST API senaryoları için özel olarak kullanılmak üzere. JsonModel ile birlikteJsonStrategy (modülün görünüm yöneticisi bloğunda yapılandırılacak) model verilerini şu şekilde kodlar: Json ve bunu görünümler (phtml) yerine yanıt olarak döndürür.
AJAX - Çalışma Örneği
Yeni bir ajax sayfası ekleyelim, ajaxöğretici modülünde bulun ve kitap bilgilerini eşzamansız olarak alın. Bunu yapmak için aşağıdaki adımlara uymalıyız.
Adım 1: JsonStrategy'yi modül yapılandırmasına ekleyin
Öğretici modül yapılandırma dosyasındaki görünüm yöneticisi bloğunu güncelleyin - myapp / module / Tutorial / config / module.config.php. Sonra,JsonStrategy ile çalışacak JsonModel json verilerini kodlamak ve göndermek için.
'view_manager' => [
'template_map' => array
('layout/layout' => __DIR__ . '/../view/layout/newlayout.phtml'),
'template_path_stack' => [
'tutorial' => __DIR__ . '/../view',
],
'strategies' => array('ViewJsonStrategy',),
],
Adım 2: TutorialController.php dosyasına ajaxAction yöntemini ekleyin
TutorialController.php içindeki ajaxAction yöntemini aşağıdaki kodla ekleyin -
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;
}
Burada ajaxAction, gelen isteğin AJAX olup olmadığını kontrol edecektir. Gelen istek AJAX ise,JsonModelyaratılacak. Aksi takdirde normalViewModel yaratılacak.
Her iki durumda da kitap bilgileri veritabanından alınacak ve modele yerleştirilecektir. Model bir JsonModel ise,JsonStrategy çağrılacak ve verileri json olarak kodlayacak ve yanıt olarak geri dönecektir.
$query->get('showJson') == 1hata ayıklama amacıyla kullanılır. Sadece ekleshowJson=1 url'de ve sayfa json verilerini gösterecektir.
3. Adım: ajax.phtml ekleyin
Şimdi, görünüm komut dosyasını ekleyin ajax.phtmlajaxAction yöntemi için. Bu sayfanın etiketli bir bağlantısı olacak -Load book information.
Bu bağlantının tıklanması, kitap bilgisini Json verileri olarak alacak ve kitap bilgisini biçimlendirilmiş bir tablo olarak gösteren bir AJAX isteğini gerçekleştirecektir. AJAX işlemi,JQuery.
Tam kod listesi aşağıdaki gibidir -
<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>
4. Adım: Uygulamayı çalıştırın
Son olarak, uygulamayı çalıştırın - http://localhost:8080/tutorial/ajax ve Kitap bilgilerini yükle bağlantısını tıklayın.
Sonuç aşağıda gösterildiği gibi olacaktır -
Ajax Page -
Ajax Page with Book Information
Ajax page with debugging information
Çerez, bir web uygulamasında çok önemli bir kavramdır. Kullanıcı verilerini, genellikle tarayıcının kendisinde sınırlı bir süre boyunca küçük bir bilgi parçası olarak saklama seçeneği sunar.
Web uygulamasının durumunu korumak için bir Çerez kullanılır. Zend çerçevesi, içinde bir çerez modülü sağlar.zend-httpbileşen. Bu zend-http, HTTP soyutlamasını ve uygulanmasını sağlar.
HTTP Bileşenini Yükleme
HTTP bileşeni kullanılarak kolayca kurulabilir Composer aşağıdaki kodda belirtildiği gibi.
composer require zendframework/zend-http
Konsept
Zend-http, Zend\Http\Cookiestanımlama bilgilerini yönetmek için sınıf. İle birlikte kullanılırZend\Http\Clientbir web sunucusuna istek göndermek için kullanılan sınıf. Çerezler aşağıdaki kodda gösterildiği gibi başlatılabilir -
use Zend\Http\Cookies
$c = new Cookies();
HTTP istemcisi (Zend \ Http \ Client) web sunucusuna ilk kez bir URI isteği gönderdiğinde, herhangi bir çerezi yoktur. İstek web sunucusu tarafından alındığında, çerezi yanıt nesnesineHTTP Header, Set-Cookieve bunu HTTP istemcisine gönderir. HTTP istemcisi tanımlama bilgisini http yanıtından çıkaracak ve sonraki istekte aynı HTTP Başlığı olarak yeniden gönderecektir. Genel olarak, her çerez bir etki alanına ve etki alanının bir yoluna eşlenir.
Mevcut yöntemler Cookies sınıf aşağıdaki gibidir -
addCookie(uri) - Verilen URI'nin istek nesnesine bir çerez eklemek için kullanılır.
getCookie(cookieName, $cookieForm) - Verilen URI'de bulunan $ cookieName çerezini almak için kullanılır, $uri. Üçüncü argüman, çerezin dize veya dizi olarak nasıl döndürüleceğidir.
fromResponse(uri) - Verilen URI'nin yanıt nesnesinden tanımlama bilgilerini çıkarmak için kullanılır.
addCookiesFromResponse - fromResponse ile aynıdır, ancak verilen URI'nin istek nesnesine tekrar ekler ve ekler.
isEmpty() - Verilmiş olup olmadığını bulmak için kullanılır. Cookie nesnenin herhangi bir çerezi var mı yok mu?
reset() - Verilen URI'deki tüm çerezleri temizlemek için kullanılır.
Bir sonraki bölümde, Zend Çerçevesinde oturum yönetimi ile ilgili tartışacağız.
Oturum, bir web uygulamasında çok önemli bir kavramdır. Kullanıcı verilerinin web sunucusunda sınırlı bir süre için kalması seçeneği sağlar. Zend çerçevesi ayrı bir bileşen sağlar,zend-session oturum bilgilerini işlemek için.
Bir Oturum Bileşeni Kurun
Oturum bileşeni, Composer aşağıda belirtildiği gibi -
composer require zendframework/zend-session
Oturum Bileşenleri
Zend çerçevesi, oturum yönetimini yürütmek için altı bileşen sağlar. Tüm bu bileşenler aşağıda açıklanmıştır -
Zend\Session\Container - Oturum bilgilerini okumak ve yazmak için ana API.
Zend\Session\SessionManager - Bir oturumun tüm yaşam döngüsünü yönetmek için kullanılır.
Zend\Session\Storage - Bu, oturum verilerinin bellekte nasıl saklanacağını belirlemek için kullanılır.
Zend\Session\SaveHandler - Oturum verilerini RDBMS, Redis, MangoDB vb. Gibi fiziksel bir konuma depolamak ve almak için kullanılır.
Zend\Session\Validator - Bu, ilk ve sonraki isteğin uzak adresini ve kullanıcı aracısını çapraz kontrol ederek oturumu ele geçirmekten korumak için kullanılır.
Zend\Session\Config\SessionConfig - Oturumun nasıl davranması gerektiğini yapılandırmak için kullanılır.
Varsayılan konfigürasyon bir oturumla çalışmak için yeterlidir. Yukarıdaki bileşenleri kullanarak, bir oturumun tüm yönleri kolayca ele alınabilir.
Oturum Bileşeni Örneği
Zend çerçevesinde bir oturumu anlamak için yeni bir sayfa oluşturmak için aşağıdaki noktalara bağlı kalalım. Varsayılan olarak, bir örnek oluşturmak yeterlidir.Container oturumları yönetmek için sınıf.
Yeni bir eylem oluşturun, sessionAction içinde TutorialController.
Bir Container nesne.
$c = new Container();
Keyfi bir anahtar olup olmadığını kontrol edin countvar. Anahtar mevcut değilse,count 1 değeri ile. Varsa, aşağıdaki kodda gösterildiği gibi değeri artırın.
if (!isset($c->count)) { $c->count = 0;
} else {
$c->count++;
}
Sayımı ViewModel'e kaydedin.
Myapp / module / Tutorial / view / tutorial / tutorial / session.phtml içinde sessionAction, session.phtml için bir şablon dosyası oluşturun ve ardından count değer.
Sayfayı yenilemek, değerini artıracaktır. countoturumda. Tam liste aşağıdaki gibidir -
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
Kimlik doğrulama, herhangi bir web uygulamasındaki en önemli ve sahip olunması gereken özelliklerden biridir. Zend Framework, kimlik doğrulamasını işlemek için ayrı bir bileşen sağlar.zend-authentication.
Bir Kimlik Doğrulama Bileşeni Kurun
Kimlik doğrulama bileşeni aşağıdakiler kullanılarak kurulabilir Composer komut.
composer require zendframework/zend-authentication
Konsept
Genellikle bir geliştirici, kullanıcı ayrıntılarını bir veri kaynağına göre doğrulamak için bir php işlevi yazar. Kimlik doğrulama yapıldıktan sonra, kimlik doğrulama ayrıntıları sonraki istekler için saklanır. Zend Framework bu kavramı genelleştirir ve aşağıda açıklanan iki sınıf sağlar -
Sınıf 1 Zend \ Authentication \ Adapter \ AdaptorInterface
Bu sınıf tek bir yöntem sağlar, authenticatekimlik doğrulama mantığını yazmak için. Authenticate yöntemi bir örneğini döndürürZend\Authentication\Result sınıf.
Bu Resultnesne kimlik doğrulama durumunu tutar; kimlik doğrulama başarılı olursa kimlik ve kimlik doğrulama başarısız olursa bir hata mesajı. Kimlik doğrulama arabiriminin ve sonuç sınıfının imzası aşağıdaki gibidir -
AdaptorInterface
namespace Zend\Authentication\Adaptor;
public function authenticate() {
// code
}
Result class
namespace Zend\Authentication;
class Result {
public function __construct($code, $identity, array $messages = []);
}
Zend Çerçevesi, veritabanı, ldap, http temel ve özet kimlik bilgileriyle kimlik doğrulaması yapmak için varsayılan bir uygulama sağlar. BirAdaptor kimlik doğrulaması yapar, ancak gelecekteki talepler için ayrıntıları ısrar etmez.
Sınıf 2 Zend \ Authentication \ AuthenticationService
AuthenticationService, kimlik doğrulama amacıyla önceden yapılandırılmış adaptörü kullanan ana bileşendir. Kimlik doğrulama yapıldıktan sonra, kimlik doğrulama ayrıntılarını sürdürür ve yöntemler sağlar,hasIdentity() bir kimlik olup olmadığını kontrol etmek için, getIdentity() kimlik doğrulama ayrıntılarını almak için ve clearIdentity() kimlik doğrulama ayrıntılarını temizlemek için.
Bu AuthenticationService hizmetini kullanmak için kısmi kod listesi aşağıdaki gibidir -
$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();
Yetkilendirmeyle ilgili şeyler iki ayrı modül olarak paketlenmiştir: zend-permissions-acl ve zend-permissions-rbac. Zend-permissions-acl, Erişim kontrol listesine dayanır ve zend-permissions-rbac, role dayalı erişim kontrol listesine dayanır. ACL ve RBAC konseptinin yüksek düzeyde soyutlamasını sağlarlar ve kurumsal düzeyde uygulamanın yazılmasına yardımcı olurlar.
Zend Framework olarak adlandırılan ayrı bir bileşen sağlar zend-maile-posta mesajları göndermek için. Zend-mail bileşeni ayrıca hem metin hem de html biçiminde ekleri olan e-posta mesajlarını okuma ve yazma seçeneği sunar. Zend'de bir e-posta göndermek, yapılandırması çok daha kolay ve basittir.
Bu bölümde e-posta kavramlarını, temel ayarları, SMTP aktarımı gibi gelişmiş ayarları gözden geçirelim.
Mail Bileşenini Yükleyin
Posta bileşeni, aşağıdaki Composer komutu kullanılarak yüklenebilir.
composer require zendframework/zend-mail
Temel E-posta Yapılandırması
Temel bir e-posta, bir veya daha fazla alıcıdan, bir konudan, bir gövdeden ve bir gönderenden oluşur. Zend sağlarZend\Mail\Messageyeni bir e-posta mesajı oluşturmak için sınıf. Kullanarak bir e-posta göndermek içinzend-mail, en az bir alıcı ve bir ileti gövdesi belirtmelisiniz.
Yeni bir posta mesajı oluşturmak için kısmi kod aşağıdaki gibidir -
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, posta mesajını göndermek için Zend \ Mail \ Sendmail sınıfını sağlar. Sendmail php yerel posta işlevini kullanır, mail posta mesajını göndermek için ve php yapılandırma dosyasını kullanarak taşıma katmanını yapılandırabiliriz.
Sendmail kullanarak kısmi kodlama aşağıdaki gibidir -
$transport = new Mail\Transport\Sendmail();
$transport->send($mail);
zend-mail birçok taşıma katmanı sağlar ve her biri kullanıcı adı, şifre vb. gibi birçok ek parametre gerektirebilir.
E-posta Yönetim Yöntemleri
Önemli e-posta yönetimi yöntemlerinden bazıları aşağıdaki gibidir -
isValid - 'Gönderen' adresi olmayan iletiler geçersizdir.
isValid() : bool
setEncoding - Mesaj kodlamasını ayarlayın.
setEncoding(string $encoding) : void
getEncoding - Mesaj kodlamasını alın.
getEncoding() : string
setHeaders - Başlıklar oluşturun.
setHeaders(Zend\Mail\Headers $headers) : void
getHeaders - Başlıklar koleksiyonuna erişin.
getHeaders() : Zend\Mail\Headers
setFrom- Gönderen adreslerini ayarlayın (üzerine yazın). Anahtarın okunabilir ad olduğu ve değerin e-posta adresi olduğu bir anahtar / değer çiftleri içerir.
setFrom(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressList, string|null $name
) : void
addFrom - Bir 'Gönderen' adresi ekleyin.
addFrom(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressOrList, string|null $name
) : void
getFrom - 'Gönderen' gönderenlerin listesini alın.
getFrom() : AddressList
setTo - Overwrite the address list in the To recipients.
setTo(
string|AddressInterface|array|AddressList|Traversable $emailOrAddressList, null|string $name
) : void
setSubject - Mesaj konusu başlık değerini ayarlayın.
setSubject(string $subject) :void
setBody - Mesaj gövdesini ayarlayın.
setBody(null|string|Zend\Mime\Message|object $body) : void
SMTP Aktarım Katmanı
zend-mail SMTP sunucusunu kullanarak bir e-posta göndermek için seçenekler sağlar. Zend\Mail\Transport\Smtpclass. GibiSendmail SMTP ana bilgisayarını, bağlantı noktasını, kullanıcı adını, şifreyi vb. yapılandırmak için birkaç ek seçeneğe sahip olması dışında.
Kısmi kod aşağıdaki gibidir -
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);
Buraya,
name - SMTP ana bilgisayarının adı.
host - Uzak ana bilgisayar adı veya IP adresi.
port - Uzak ana bilgisayarın dinlediği bağlantı noktası.
Posta Kavramı - Örnek
Mail kavramını anlamak için basit bir php konsol uygulaması yazmak için aşağıdaki noktaları takip edelim.
Bir "mailapp" klasörü oluşturun.
Yüklemek zend-mail besteci aracını kullanarak.
Bir php dosyası oluşturun Mail.php "mailapp" klasörünün içinde.
Kullanarak mesajı oluşturun Zend\Mail\Message.
$message = new Message(); $message->addTo('[email protected]');
$message->addFrom('[email protected]'); $message->setSubject('Hello!');
$message->setBody("My first Zend-mail application!");
SMTP taşıma katmanını oluşturun ve gerekli yapılandırmayı ekleyin.
// 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);
E-postayı kullanarak gönderin send yöntem.
$transport->send($message);
Mail.php listesinin tamamı aşağıdaki gibidir -
<?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);
Şimdi uygulamayı komut isteminde çalıştırın php Mail.php. Bu, postayı uygulamada yapılandırıldığı şekilde gönderecektir.
Genel olarak, bir PHP uygulamasının hatalarını advanced debugger tool veya gibi basit komutlar kullanarak echo ve die. Bir web senaryosunda, iş mantığını ve sunum katmanını test etmemiz gerekir. Bir web uygulamasındaki formlar, formların beklendiği gibi çalıştığından emin olmak için ilgili test verileri girilerek test edilebilir.
Bir web sitesinin tasarımı, bir tarayıcı kullanılarak manuel olarak test edilebilir. Bu tür test süreçleri, birim testi kullanılarak otomatik hale getirilebilir. Büyük projelerde birim testi şarttır. Bu birim testleri, test sürecini otomatikleştirmeye ve bir şeyler ters gittiğinde geliştiriciyi uyarmaya yardımcı olacaktır.
PHPUnit'i kurma
Zend çerçevesi, PHPUnit birim testi çerçevesiyle bütünleşir. Zend çerçevesi için bir birim testi yazmak için, aşağıdaki Composer komutunu kullanarak kolayca yapılabilen PHPUnit'i kurmamız gerekir.
$ composer require --dev phpunit/phpunit
Yukarıdaki komutu uyguladıktan sonra, aşağıdaki kod bloğunda gösterildiği gibi bir yanıt alacaksınız.
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
Şimdi, "composer.json" dosyasını açtığınızda, aşağıdaki değişiklikleri göreceksiniz -
"require-dev": {
"phpunit/phpunit": "^5.7"
}
TestCase ve Onaylar
Zend çerçevesi, denetleyiciyi birim test etmek için yardımcı sınıflar sağlar. TestCase bir içindeki ana bileşendir PHPUnit test senaryolarını yazmak için çerçeve ve Zend Çerçevesi, TestCase'in soyut bir uygulamasını sağlar. AbstractHttpControllerTestCase.
Bu AbstractHttpControllerTestCase, çeşitli Assertyöntemler ve işlevselliğe göre gruplandırılabilir. Bunlar aşağıdaki gibidir -
Request Assertions- http talebini belirtmek için kullanılır. Örneğin, assertControllerName.
CSS Select Assertions - HTML DOM modelini kullanarak yanıt HTML'sini kontrol etmek için kullanılır.
XPath Assertions - XPath'e dayalı CSS seçim iddialarına bir alternatif.
Redirect Assertions - Sayfanın yeniden yönlendirilmesini kontrol etmek için kullanılır.
Response Header Assertions - Yanıt başlığını durum kodu gibi kontrol etmek için kullanılır (assertResponseStatusCode)
Testler Dizini Oluşturun
Her modül için ayrı ayrı birim testi yazılabilir. Testle ilgili tüm kodlamaların,test modülün kök dizini altındaki klasör.
Örneğin, Tutorial modülü altında bulunan TutorialController için bir test yazmak için, test sınıfının myapp / module / Tutorial / test / Controller / dizini altına yerleştirilmesi gerekir.
Misal
Birim testi yapmak için bir test sınıfı yazalım. TutorialController.
Başlangıç olarak, TutorialControllerTest adlı bir sınıf yazmalı ve bunu AbstractHttpControllerTestCase'e genişletmeliyiz.
Bir sonraki adım, bir Setuptest ortamını kurma yöntemi. Bunu arayarak yapılabilir.setApplicationConfig yöntem ve ana uygulama yapılandırma dosyamız myapp / config / application.config.php'yi iletmek
public function setUp() {
$configOverrides = [];
$this->setApplicationConfig(ArrayUtils::merge( include __DIR__ . '/../../../../config/application.config.php', $configOverrides
));
parent::setUp();
}
Bir veya daha fazla yöntem yazın ve gereksinime bağlı olarak çeşitli iddia yöntemlerini çağırın.
$this->assertMatchedRouteName('tutorial');
Test sınıfını yazdık ve listenin tamamı aşağıdaki gibidir -
<?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');
}
}
Şimdi, bir komut istemi açın, uygulama kök dizinine gidin ve phpunit içinde çalıştırılabilir vendor Klasör.
cd /path/to/app
./vendor/bin/phpunit ./vendor/bin/phpunit module/
Tutorial/test/Controller/TutorialControllerTest.php
Sonuç, aşağıdaki kod bloğunda gösterildiği gibi olacaktır -
PHPUnit 5.7.5 by Sebastian Bergmann and contributors.
.1 / 1 (100%)
Time: 96 ms, Memory: 8.00MB
OK (1 test, 5 assertions)
Sistemin sorunsuz çalışması için sistem arızasının etkin bir şekilde ele alınması gerekir. Zend Framework, birdefault error trappinghata oluştukça yazdırır ve günlüğe kaydeder. Aynı hata işleyici,Exceptions.
Hata İşleyici, hata ayıklama doğru olduğunda hataları görüntüler ve hata ayıklama yanlış olduğunda hatayı günlüğe kaydeder. Zend Framework birkaç istisna sınıfına sahiptir ve yerleşik istisna işleme, yakalanmamış istisnaları yakalar ve kullanışlı bir sayfa oluşturur.
Varsayılan Hata İşleme
Uygulama yapılandırma dosyasında, myapp / module / Application / config / module.config.php'de varsayılan hata ayarlarını yapılandırabiliriz.
Kısmi kod örneği aşağıdaki gibidir -
'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',
],
],
Burada, display_exception, not_found_template, exception_template, error / 404 ve hata / dizin, hatayla ilgili yapılandırma öğeleridir ve kendi kendini açıklayıcıdır.
Bunların en önemlisi error/index. Bu, sistemde bir istisna meydana geldiğinde gösterilen şablondur. Gösterilecek hata miktarını kontrol etmek için bu şablonu, uygulamam / modül / Uygulama / görünüm / hata / index.phtml'yi değiştirebiliriz.
Bu bölümde, Zend Framework'te eksiksiz bir MVC tabanlı Çalışan Uygulamasının nasıl oluşturulacağını öğreneceğiz. Aşağıda verilen adımları izleyin.
1. Adım: Module.php
Öncelikle - myapp / module / Employee / src / dizini içinde bir Employee modülü oluşturmalı ve ardından ConfigProviderInterface arayüzünü uygulamalıyız.
Module sınıfı için tam kod aşağıdaki gibidir -
<?php
namespace Employee;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
class Module implements ConfigProviderInterface {
public function getConfig() {
return include __DIR__ . '/../config/module.config.php';
}
}
2. Adım: composer.json
Yapılandırın Tutorial modül içinde composer.json aşağıdaki kodu kullanarak otomatik yükleme bölümü altında.
"autoload": {
"psr-4": {
"Application\\": "module/Application/src/",
"Tutorial\\": "module/Tutorial/src/",
"Employee\\": "module/Employee/src/"
}
}
Şimdi, bir composer update komutu kullanarak uygulamayı güncelleyin.
composer update
Composer komutu, uygulamada gerekli değişiklikleri yapacak ve aşağıdaki komut isteminde gösterildiği gibi günlükleri gösterecektir.
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
Adım 3: Çalışan Modülü için module.config.php
Aşağıdaki kodla myapp / module / Employee / config altında modül yapılandırma dosyası “module.config.php” oluşturun.
<?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',],
],
];
Şimdi, Employee modülünü uygulama seviyesi konfigürasyon dosyasında - myapp / config / modules.config.php - yapılandırın.
return ['Zend\Router', 'Zend\Validator', 'Application', 'Tutorial', 'Employee'];
4. Adım: EmployeeController
AbstractActionController'ı genişleterek yeni bir PHP sınıfı olan EmployeeController oluşturun ve bunu myapp / module / Employee / src / Controller dizinine yerleştirin.
Tam kod listesi aşağıdaki gibidir -
<?php
namespace Employee\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class EmployeeController extends AbstractActionController {
public function indexAction() {
return new ViewModel();
}
}
Adım 5: Yönlendirici Yapılandırması
Çalışan modülümüze bir segment rotası ekleyelim. Myapp / module / Employee / config adresinde bulunan çalışan modülü yapılandırma dosyası module.config.php'yi güncelleyin.
<?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',
],
],
];
Çalışan modülümüz için yönlendirmeyi başarıyla ekledik. Sonraki adım, Employee uygulaması için bir görünüm komut dosyası oluşturmaktır.
6. Adım: ViewModel'i oluşturun
Myapp / module / Employee / view / calisan / calisan dizini altinda "index.phtml" adinda bir dosya olusturun.
Dosyaya aşağıdaki değişiklikleri ekleyin -
<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();
}
}
Son olarak Çalışan modülünü başarıyla tamamladık. aşağıdaki url'yi kullanarak ona erişebiliriz -http://localhost:8080/employee.
Sonuç
Bir sonraki adımda gerçekleştireceğiz add, edit ve deleteçalışan uygulamasındaki veri işlemleri. Bu işlemleri gerçekleştirmek için öncelikle bir veritabanı modeli oluşturmalıyız. Bir sonraki adımda açıklanmaktadır.
7. Adım: Bir Model Oluşturun
Model oluşturalım, Modülümüzde Çalışan src directory. Modeller genellikle Model klasörü altında gruplanır (myapp / module / Employee / src / Model / Employee.php)
<?php
namespace Employee\Model;
class Employee {
public $id; public $emp_name;
public $emp_job;
}
Adım 8: MySQL Tablosu
Adlı bir veritabanı oluşturun tutorials aşağıdaki komutu kullanarak yerel MYSQL sunucusunda -
create database tutorials;
Adlı bir tablo oluşturalım employee veritabanında aşağıdaki SQL komutunu kullanarak -
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)
);
Verileri şuraya ekle: employee aşağıdaki sorguyu kullanan tablo -
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');
Adım 9: Veritabanı Yapılandırmasını Güncelleyin
Global Configuration dosyasını, myapp / config / autoload / global.php'yi gerekli veritabanı sürücü bilgileriyle güncelleyin.
return [
'db' => [
'driver' => 'Pdo',
'dsn' => 'mysql:dbname = tutorials;host=localhost',
'driver_options' => [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''],
],
];
Şimdi, yerel yapılandırma dosyasındaki veritabanı kimlik bilgilerini güncelleyin - myapp / config / autoload / local.php. Bu şekilde, yerel ve canlı veritabanı bağlantı kimlik bilgilerini ayırabiliriz.
<?php
return array(
'db' => array('username' => '<user_name>', 'password' => '<password>',),
);
Adım 10: exchangeArray'i uygulayın
Employee modelinde exchangeArray işlevini uygulayın.
<?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;
}
}
Adım 11: Çalışan Verilerini almak için TableGateway'i kullanın
Model klasörünün kendisinde EmployeeTable sınıfı oluşturun. Aşağıdaki kod bloğunda tanımlanmıştır.
<?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;
}
}
Adım 12: EmployeeTable Sınıfını Yapılandırın
Module.php içindeki çalışan hizmetini getServiceConfig () yöntemini kullanarak güncelleyin
<?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);
},
],
];
}
}
Adım 13: Denetleyiciye Çalışan Hizmetini Ekleyin
Employee Module Configuration'ın denetleyici bölümünü - myapp / module / config / module.config.php aşağıda gösterildiği gibi güncelleyin.
'controllers' => [
'factories' => [
Controller\EmployeeController::class => function($container) { return new Controller\EmployeeController( $container->get(Model\EmployeeTable::class)
);
},
],
]
Adım 14: EmployeeController için Oluşturucu Ekleyin
Yapıcıyı şu şekilde ekleyin: EmployeeTable bağımsız değişken olarak ve aşağıdaki değişiklikleri düzenleyin.
<?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;
}
}
Adım 15: Çalışan Bilgilerini "index.phtml" görünüm komut dosyasında görüntüleyin
Dosyaya taşı - index.phtml ve aşağıdaki değişiklikleri yapın -
<?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>
Şimdi başarıyla bir veritabanı modeli oluşturduk ve uygulama içindeki kayıtları getirebiliriz.
URL'yi kullanarak uygulamayı isteyin - http://localhost:8080/employee.
Sonuç
Bir sonraki adım, insert, edit ve delete çalışan modülündeki veri işlemleri.
16. Adım: Çalışan Formu Oluşturun
Adlı bir dosya oluşturun EmployeeForm.phpmyapp / module / Employee / src / Form dizininde. Aşağıdaki kod bloğunda açıklanmıştır.
<?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',
),
));
}
}
Adım 17: Çalışan Modelini Güncelleyin
Çalışan modelini güncelleyin ve InputFilterAwareInterface'i uygulayın. Myapp / module / Employee / src / Employee / Model dizinine gidin ve aşağıdaki değişiklikleriEmployee.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;
}
}
Adım 18: Employee Controller'da addAction ekleyin
Aşağıdaki değişiklikleri ekleyin EmployeeController sınıf.
<?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);
}
Adım 19: EmployeeTable sınıfına kaydetme işlevi ekleyin
EmployeeTable sınıfına şu iki işlevi ekleyin - 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');
}
}
}
Adım 20: AddAction yöntemi, Add.phtml için Görünüm komut dosyası oluşturun
Uygulamam / modül / görünüm / çalışan / çalışan içindeki "Add.phtml" dosyasına aşağıdaki değişiklikleri ekleyin.
<?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
Sonuç
Veriler eklendikten sonra, ana sayfaya yönlendirilecektir.
Adım 21: Çalışan Kayıtlarını Düzenleyin
Employee modülünde veri düzenleme işlemlerini gerçekleştirelim. Aşağıdaki değişiklikleri güncelleyinEmployeecontroller.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,);
}
Burada arıyoruz id, eşleşen rotada olan ve ardından düzenleme işlemi için çalışan ayrıntılarını yükleyin.
Adım 22: Employee.php
Şimdi - myapp / module / Employee / src / Employee / Model / dizininde bulunan “Employee.php” dosyasına aşağıdaki değişiklikleri ekleyin.
public function getArrayCopy() {
return get_object_vars($this);
}
Burada, Zend \ Stdlib \ Hydrator \ ArraySerializable, modelde iki yöntem bulmayı bekler: getArrayCopy() ve exchangeArray().
Burada exchangeArray () yineleme için kullanılır. Bu işlev, çalışan tablosundaki verileri bağlamak için kullanılır.
Şimdi, için bir görünüm betiği oluşturmamız gerekiyor editAction().
23. Adım: Edit.phtml oluşturun
/ Çalışan / görünüm / çalışan / çalışan / edit.phtml modülünde bir görünüm komut dosyası oluşturun
<?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();
Çalışan ayrıntılarının düzenlenmesi aşağıdaki ekran görüntüsünde gösterilmektedir.
Veriler düzenlendikten sonra, ana sayfaya yönlendirilecektir.
Adım 24: deleteEmployee yöntemini ekleyin
EmployeeTable sınıfına deleteEmployee yöntemini ekleyin - myapp / module / Employee / src / Model / EmployeeTable.php
public function deleteEmployee($id) { $this->tableGateway->delete(['id' => (int) $id]);
}
Adım 25: Çalışan Kayıtlarını Silin
Şimdi Employee modülünde veri silme işlemlerini gerçekleştirelim. Aşağıdaki yöntemi ekleyin,deleteAction EmployeeController sınıfında.
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)
);
}
Burada deleteEmployee () yöntemi, çalışanı kendi id ve çalışanlar listesi sayfasına (ana sayfa) yönlendirir.
Şimdi deleteAction () yöntemi için karşılık gelen bir görünüm komut dosyaları oluşturalım.
Adım 26: Bir Görünüm Komut Dosyası Oluşturun
Uygulamam / modül / Çalışan / görünüm / çalışan / çalışan / delete.phtml içinde delete.phtml adlı bir dosya oluşturun ve içine aşağıdaki kodu ekleyin.
<?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>
Şimdi, kullanarak herhangi bir çalışanı silin edit Ana sayfadaki bağlantı ve sonuç aşağıdaki ekran görüntüsünde gösterildiği gibi olacaktır.
Sonuç
Gerekli tüm özellikleri uygulayarak Çalışan modülünü başarıyla tamamladık.
Sonuç
Mevcut rekabet ortamında, Zend çerçevesi geliştirici tarafından en üst noktaya yerleştirilmiştir. Herhangi bir programa veya herhangi bir uygulama türüne PHP dilinde soyutlamalar sağlar. Olgunlaştırılmış bir çerçevedir ve modern PHP dili özelliklerini destekler. Eğlenceli, profesyonel, gelişen ve mevcut teknolojiye ayak uyduruyor.