2010-01-26 10 views
5

Kilka pytań dotyczących podstaw Zend Framework 1.9.Jak działa aplikacja Zend/Bootstrapping?

  1. I przestrzegać instrukcji QuickStart i zasadniczo polega ładującego,

    a. from index.php:

    b. Następnie w bootstrap.php, mam

    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. Na początek kilka rzeczy nie rozumiem:

    się. Jeśli użytkownik uzyskuje dostęp do witryny za pośrednictwem domyślnego indeksu.php, czy oznacza to, że ładowanie początkowe (a także cały kod w pliku index.php, w tym ustawienie środowiska itp., Zostanie ominięte?)

    b. Nie ma miejsca, które wyraźnie wywoływałoby metody Bootstrapa: _initAutoload() lub _initDoctype(). Więc kiedy niejawnie przywoływane są te metody?

    c. Ponieważ w index.php, już "przekazałem" plik konfiguracyjny '/configs/application.ini' do konstruktora Zend_Application, czy istnieje sposób na odzyskanie wpisów config gdzie indziej?

  3. W mojej aplikacji, muszę pracować z różnymi bazami danych (więc nie mogę po prostu użyć resources.db.*). Tak więc w tym samym pliku application.ini mam np.

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

    Jaka jest najlepsza praktyka zarządzania adapterem DB?

    a. Czy jest możliwe (i powinienem) utworzyć adapter DB w index.php OR Bootstrap.php i pobrać go gdzie indziej, gdy jest potrzebny (i jak)?

    b. Lub jest możliwe (i powinienem) po prostu pobrać wpisy konfiguracyjne w innym miejscu (jak?) I utworzyć instancję adaptera DB w razie potrzeby?

Dzięki!

Odpowiedz

7

Oto kilka odpowiedzi.

2a. Wszystkie żądania są przekierowywane do index.php. Odbywa się to za pomocą mod_rewrite i określone w pliku .htaccess.

2b. Program ładujący wywołuje dowolną metodę poprzedzoną prefiksem _init. Patrz Zend Framework - Theory of Operation

2c. Tak. Zend::Config. Możesz zachować instancję w Zend::Registry dla łatwego dostępu. Np .:

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

Sprawdź odwołanie do interfejsu API, aby wyświetlić konstruktory dla tych dwóch klas.

Nie sądzę, że Szybki start jest tak pomocny. Poleciłbym dostać książkę. Zadowoliłem się z "Zend Framework 1.8 Web Application Development" Keitha Pope'a.

+0

Dzięki za odpowiedzi! 2b. Niestety, Teoria Operacji pozostawiła mnie bardziej zagubioną.W tym przypadku mówiono o $ bootstrap-> bootstrap ("foo"); $ bootstrap-> bootstrap (array ('foo', 'bar')); $ bootstrap-> bootstrap(); , ale żaden z nich nie był w index.php. (O ile $ application-> bootstrap() -> run() nie robi tak samo jak $ bootstrap-> bootstrap()?) 2c. Ponieważ już przekazałem nazwę pliku konfiguracyjnego do konstruktora Zend_Application, czy istnieje sposób na odzyskanie instancji Zend_Config z $ application (do umieszczenia w rejestrze) zamiast tworzenia nowego Zend_Config_Ini na tym samym pliku .ini? –

+0

Och, jeszcze jedno. Jak powiedziałeś, każde żądanie jest przekierowywane do index.php. Czy to oznacza, że ​​jakikolwiek tam kod (konfiguracja czytania, tworzenie instancji Zend_Application, wywoływanie $ bootstrap.run()) zdarza się raz za razem? –

+1

Tak. Cała aplikacja jest bootstrapowana i uruchamiana przy każdym żądaniu. HTTP jest protokołem bezstanowym, jedyną rzeczą, która przetrwała w przypadku wszystkich żądań, jest $ _SESSION. Jeśli martwisz się o wydajność, zdecydowanie zalecamy wdrożenie pamięci podręcznej stron, która może wyświetlać stronę bez tworzenia pełnej aplikacji. –

2

Aby odpowiedzieć na pytanie 3, ZF używa wtyczki Application Application Zend_Application_Resource_Db do przetwarzania konfiguracji i tworzenia instancji adaptera bazy danych.

Jeśli twoja potrzeba wielu baz danych jest sprawą środowiskową, możesz w prosty sposób nazwać swoje parametry DB w pliku application.ini.

[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 

W tym przykładzie mamy do utworzenia wspólnej informacji w sekcji [production] i przesłanianie go do naszych środowisk postoju i rozwoju. Jeśli chcesz mieć dostęp do wielu baz danych w jednej aplikacji, to polecam toczenie własnej wtyczki z zasobami aplikacji i utworzenie struktury do przechowywania wielu różnych baz danych w jednej aplikacji, jeśli chcesz uzyskać dostęp do wielu baz danych w pojedynczej aplikacji. znajomości.

To nie jest tak trudne, jak mogłoby się wydawać. Przeczytaj na ten temat here i utwórz podklasę z Zend_Application_Resource_ResourceAbstract. Korzystanie z tej klasy, można łatwo chwycić resources.* w pliku konfiguracyjnym, używając:

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

Będziesz wtedy mieć dostęp do wtyczki poprzez bootstrap obiektu:

$bootstrap->getPluginResource('mydb') 

nadzieję, że pomoże.

EDYCJA: Zapomniałem wspomnieć, że jeśli masz wtyczkę zasobów jako część pliku application.ini, program ładujący Zend_Application automatycznie rozpozna, że ​​jest częścią procesu ładowania początkowego, więc nie musisz definiować żadnego _init() metoda w pliku bootstrap. To taka magia.

Ponadto, jeśli chodzi o przechowywanie instancji adaptera, prawdopodobnie po prostu będę używał Zend_Registry.

+0

Cześć, dziękuję za odpowiedź! 1. Jeśli chodzi o podklasę zasobu, widzę, że np. resource.db jest "mapowany na" Zend_Application_Resource_Db. Jeśli piszę własne, np. Custom_Application_Resource_MultiDb i dodaj config resources.multidb. *, Jak mogę "zmapować" resources.multidb na Custom_Application_Resource_MultiDb? 2. nadal jestem trochę zagubiony. Teraz widzę, że różne rzeczy można uzyskać od $ bootstrap. Ale, jak zdobyć $ bootstrap na pierwszym miejscu, ponieważ nie ma funkcji getter pojedynczej instancji. Czy umieszczam $ bootstrap w Zend_Registry? –

0

dzięki za wszystkie odpowiedzi! To naprawdę pomogło mi zrozumieć pojęcie ZF.

Ja również przeszedł odniesień i kodów źródłowych, aby uzyskać głębsze zrozumienie, a to jest to, co przyjęte:

W moim application.ini mam:

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" 

Następnie w moja bootstrap.php mam:

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 
      } 
     } 
    } 
} 

oczywiście, w moim index.php, wzywam:

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

Następnie w sterowniku gdzie trzeba uzyskać kartę DB, zrobić:

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

Czy to jest dobry/zły sposób zrobić rzeczy? I czy jest jakaś pułapka, którą powinienem uważać?

Dzięki!

+0

to dobra dyskusja, ale powinien to być osobny wątek lub powinieneś edytować swój oryginalny post, aby można było lepiej odpowiedzieć na to pytanie. –

+0

Jeśli masz inne pytanie, zadaj je, klikając przycisk [Zadaj pytanie] (http://stackoverflow.com/questions/ask). – saji89

Powiązane problemy