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.