Nasıl Zend Başvuru / Bootstrapping Çalışır?

3 Cevap php

Zend Framework 1.9 temelleri ile ilgili birkaç soru.

  1. i quickstart kılavuzu takip ve temelde, önyükleme içerir

    a. index.php den:

    $ZEND_FRAMEWORK_LIB_PATH = '/appl/ZendFramework-1.9.7/library';
    defined('APPLICATION_PATH') || define('APPLICATION_PATH', (realpath(dirname(__FILE__) . '/../application')));
    defined('APPLICATION_ENV') || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
    set_include_path(implode(PATH_SEPARATOR, array((dirname(dirname(__FILE__)) . '/library'), $ZEND_FRAMEWORK_LIB_PATH, get_include_path(),)));
    require_once 'Zend/Application.php';
    $application = new Zend_Application(APPLICATION_ENV, (APPLICATION_PATH . '/configs/application.ini'));
    $application->bootstrap()->run();
    

    b. Sonra bootstrap.php içinde, i var

    protected function _initAutoload()
    {
        $autoloader = new Zend_Application_Module_Autoloader(array("namespace" => "Default_", "basePath" => dirname(__FILE__),));
        return $autoloader;
    }
    
    
    protected function _initDoctype()
    {
        $this->bootstrap("view");
        $view = $this->getResource("view");
        $view->doctype("XHTML1_STRICT");
    }
    
  2. Bir başlangıç ​​için, bir kaç şey ben anlamıyorum:

    a. Bir kullanıcı varsayılan index.php üzerinden site değil erişmek ise, o önyükleme demek (ve aslında, vb çevre ayarı dahil index.php tüm kod, bypass olacak?)

    b. Açıkça Bootstrap adlı _initAutoload() veya _initDoctype() yöntemleri çağırır yer yoktur. Peki ne zaman bu yöntemler dolaylı olarak çağrılır?

    c. Index.php, ben zaten Zend_Application kurucu config dosyasında '/configs/application.ini' "geçti" olduğundan, başka yapılandırma girdileri almak için herhangi bir yolu var mı?

  3. Benim uygulamada, ben farklı veritabanları ile çalışmak zorunda (yani ben sadece kullanamazsınız resources.db.*). Yani aynı application.ini dosyada, i var, mesela

    custdb.adapter = "PDO_MYSQL"
    custdb.params.host = "localhost"
    custdb.params.username = "username"
    custdb.params.password = "password"
    custdb.params.dbname = "custdb"
    

    DB adaptörü yönetmek için en iyi yöntem nedir?

    a. Bu mümkün mü (ve i olmalı) index.php VEYA bootstrap.php yılında DB bağdaştırıcısı oluşturmak ve gerekli (ve nasıl) ne zaman başka bir yerde onu almak?

    b. Ya da mümkündür (ve i gerekir) sadece başka yapılandırma girişlerini almak (nasıl?) Ve gerektiğinde gibi DB adaptörü örneğini ve?

Teşekkürler!

3 Cevap

İşte birkaç cevaplar bulunuyor.

2a. Tüm istek index.php yönlendirilir. Bu mod_rewrite ile yapılır ve. Htaccess dosyasında belirtilir.

2b. Bootstrap _init ile öneki herhangi bir yöntemi çağırır. Bkz Zend Framework - Theory of Operation

2c. Evet. Zend::Config. Kolay erişim için Zend::Registry bir örneğini saklamak olabilir. Örn:

$config = new Zend_Config((APPLICATION_PATH . '/configs/application.ini')); 
$application = new Zend_Application(APPLICATION_ENV, $config);
Zend_Registry::set('config', $config);

Bu iki sınıf için kurucular görmek için API başvuru edin.

Ben Hızlı başlangıç ​​olduğunu yararlı olduğunu sanmıyorum. Ben bir kitap alıyorum tavsiye ederim. Ben Keith Pope tarafından "Zend Framework 1.8 Web Uygulama Geliştirme" zevk.

3. soruya cevap verebilmek için, ZF Uygulama Kaynağı Plugin Zend_Application_Resource_Db yapılandırma yemek ve bir veritabanı adaptör örneğini oluşturmak için kullanır.

Çoklu veritabanları için gerek çevresel bir şey ise, kolayca application.ini dosyasında DB params namespace olabilir.

[production]
resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = user
resources.db.params.password = pass
resources.db.params.dbname = production_db

[staging : production]
resources.db.params.dbname = staging_db

[development : production]
resources.db.params.dbname = development_db

Bu örnekte, biz [production] bölümünde ortak bilgi kurma konum ve evreleme ve geliştirme ortamları için geçersiz kılma. Hangi config app .htaccess olarak ortam değişkeni tarafından kontrol edilir uygulanır

Eğer tek bir uygulamada birden fazla veritabanlarına erişmek için gerekiyorsa, o zaman ben kendi Uygulama Kaynağı Plugin haddeleme ve birden fazla bağlantı tutmak için yapının bir tür oluşturma öneriyoruz.

Göründüğü kadar zor değil. O here üzerine kadar okuyun ve bir alt sınıfını oluşturmak Zend_Application_Resource_ResourceAbstract. Bu sınıfı kullanarak, kolayca resources.* config dosyasında kullanarak çekebilirsiniz:

$this->getBootstrap()-getResource('mydb')`

Daha sonra önyükleme nesnesi üzerinden eklenti erişim olurdu:

$bootstrap->getPluginResource('mydb')

Umut olur.

EDIT: Ben size application.ini parçası olarak bir kaynak eklenti varsa, Zend_Application önyükleyici otomatik önyükleme işlemi hareketlerinin bir parçası olarak dahil etmek bilecek, söylemeyi unutmuşum, bu yüzden herhangi bir {[(0 tanımlamanız gerekmez Lütfen önyükleme dosyasında)]} yöntemi. Öyle sihirli naziksiniz.

Ayrıca, bildiğim kadarıyla bir adaptör örneğini saklamadan gibi, ben muhtemelen sadece kullanıcı Zend_Registry ederim.

Tüm cevaplar için teşekkürler! Gerçekten ZF kavramı benim anlayış oldu.

Ben de daha derin bir anlayış almak için referanslar ve kaynak kodları geçtiniz, ve bu i kabul budur:

Benim application.ini i var:

custom.db.customers.adapter = "PDO_MYSQL"
custom.db.customers.params.host = "localhost"
custom.db.customers.params.username = "username"
custom.db.customers.params.password = "password"
custom.db.customers.params.dbname = "custdb"

Sonra, benim bootstrap.php i var:

protected function _initCustomDbCustomers()
{
    $config = $this->getOptions();
    $cfgCustom = $config['custom'];
    if (null != $cfgCustom)
    {
        $cfgCustomDb = $cfgCustom['db'];
        if (null != $cfgCustomDb)
        {
            $cfgCustomDbCustomers = $cfgCustom['customers'];
            if (null != $cfgCustomDbCustomers)
            {
                $resrcCustomDbCustomers = new Zend_Application_Resource_Db($cfgCustomDbCustomers);
                return $resrcCustomDbCustomers
            }
        }
    }
}

Tabii ki, benim index.php i çağırır:

$application->bootstrap();
$application->run();

Sonra, ben DB adaptör almak gerekiyor denetleyicisi, i do:

$bootstrap = $this->getInvokeArg('bootstrap');
$resrcCustomDbCustomers = $bootstrap->getResource('customDbCustomers');
$adpCustomDbCustomers = $resrcCustomDbCustomers->getDbAdapter();
// Do Stuffs With DB Adapter

Bu şeyler yapmak için iyi / kötü yolu var mı? Ve i için izlemek gereken herhangi bir tuzak var mı?

Teşekkürler!