2010-01-26 29 views
5

Một số câu hỏi liên quan đến kiến ​​thức cơ bản về Zend Framework 1.9.Ứng dụng Zend/Bootstrapping hoạt động như thế nào?

  1. i theo hướng dẫn quickstart, và về cơ bản, bao gồm bootstrapping,

    a. từ index.php:

    $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. Sau đó, trong Bootstrap.php, tôi có

    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. Đối với một sự khởi đầu, một vài điều tôi không hiểu:

    a. Nếu người dùng truy cập trang web không thông qua index.php mặc định, điều đó có nghĩa là bootstrapping (và thực sự, tất cả mã trong index.php bao gồm cài đặt môi trường, v.v. sẽ bị bỏ qua?)

    b. Không có nơi nào gọi rõ ràng các phương thức _initAutoload() hoặc _initDoctype() của Bootstrap. Vì vậy, khi nào các phương pháp này ngầm được viện dẫn?

    c. Vì trong index.php, tôi đã "chuyển" vào tập tin cấu hình '/configs/application.ini' tới hàm tạo Zend_Application, có cách nào để lấy các mục cấu hình ở nơi khác không?

  3. Trong đơn đăng ký của mình, tôi phải làm việc với các cơ sở dữ liệu khác nhau (vì vậy tôi không thể chỉ sử dụng resources.db.*). Vì vậy, trong cùng một tệp application.ini, tôi có, ví dụ:

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

    Cách tốt nhất để quản lý bộ điều hợp DB là gì?

    a. Có thể (và nên tôi) tạo ra bộ chuyển đổi DB trong index.php HOẶC Bootstrap.php và lấy nó ở nơi khác khi cần thiết (và làm thế nào)?

    b. Hoặc là có thể (và tôi nên) chỉ cần lấy các mục cấu hình ở nơi khác (như thế nào?) Và nhanh chóng các bộ chuyển đổi DB như và khi cần thiết?

Cảm ơn!

Trả lời

7

Dưới đây là một vài câu trả lời.

2a. Tất cả yêu cầu được chuyển hướng đến index.php. Điều này được thực hiện với mod_rewrite và được chỉ định trong tệp .htaccess.

2b. Bootstrap gọi bất kỳ phương thức nào có tiền tố là _init. Xem Zend Framework - Theory of Operation

2c. Vâng. Zend::Config. Bạn có thể lưu trữ một thể hiện trong Zend::Registry để dễ dàng truy cập. Ví dụ:

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

Kiểm tra tham chiếu API để xem các nhà thầu cho hai lớp này.

Tôi không nghĩ rằng Bắt đầu nhanh hữu ích. Tôi muốn giới thiệu một cuốn sách. Tôi rất thích "Phát triển ứng dụng Web Zend Framework 1.8" của Keith Pope.

+0

Cảm ơn câu trả lời! 2b. Thật không may, Lý thuyết hoạt động khiến tôi bối rối hơn.Trong trường hợp này, nó nói về $ bootstrap-> bootstrap ('foo'); $ bootstrap-> bootstrap (mảng ('foo', 'bar')); $ bootstrap-> bootstrap(); nhưng không có trong số này nằm trong index.php. (Trừ khi $ application-> bootstrap() -> run(); làm tương tự như $ bootstrap-> bootstrap()?) 2c. Vì tôi đã truyền tên tệp cấu hình cho hàm tạo Zend_Application, có cách nào để lấy một cá thể Zend_Config từ ứng dụng $ (để đặt trong sổ đăng ký) thay vì tạo một tệp Zend_Config_Ini mới trên cùng một tệp .ini? –

+0

Ồ, một điều nữa. Như bạn đã nói, mọi yêu cầu đều được chuyển hướng đến index.php. Điều đó có nghĩa là bất kỳ mã nào ở đó (đọc cấu hình, khởi tạo Zend_Application, gọi $ bootstrap.run()) xảy ra lặp đi lặp lại? –

+1

Có. Toàn bộ ứng dụng được khởi động và chạy với mọi yêu cầu. HTTP là giao thức không trạng thái, điều duy nhất tồn tại trên các yêu cầu là $ _SESSION. Nếu bạn lo lắng về hiệu suất, tôi khuyên bạn nên triển khai bộ nhớ cache trang, có thể phục vụ một trang mà không cần quay lên một ứng dụng đầy đủ. –

2

Để trả lời câu hỏi 3, ZF sử dụng Plugin tài nguyên ứng dụng Zend_Application_Resource_Db để nhập cấu hình và tạo cá thể bộ điều hợp cơ sở dữ liệu.

Nếu nhu cầu của bạn cho nhiều cơ sở dữ liệu là một điều môi trường, bạn có thể dễ dàng không gian tên DB params của bạn trong tập tin application.ini của bạn.

[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 

Trong ví dụ này, chúng tôi đang thiết lập thông tin phổ biến ở phần [production] và ghi đè cho các môi trường dàn dựng và phát triển của chúng tôi. Áp dụng cấu hình nào được kiểm soát bởi biến môi trường trong số .htaccess

Nếu bạn cần truy cập nhiều cơ sở dữ liệu trong một ứng dụng duy nhất, thì tôi khuyên bạn nên sử dụng Trình cắm tài nguyên ứng dụng của riêng mình và tạo một số cấu trúc để giữ nhiều kết nối.

Nó không phải là khó khăn như nó có vẻ. Đọc trên nó here và tạo một lớp con của Zend_Application_Resource_ResourceAbstract. Sử dụng lớp này, bạn có thể dễ dàng lấy resources.* trong tập tin cấu hình bằng cách sử dụng:

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

Sau đó, bạn sẽ được tiếp cận với các plugin của bạn thông qua các đối tượng bootstrap:

$bootstrap->getPluginResource('mydb') 

Hy vọng rằng sẽ giúp. EDIT: Tôi quên đề cập đến, nếu bạn có một plugin tài nguyên như là một phần của application.ini của bạn, bootstrapper Zend_Application sẽ tự động biết bao gồm nó như là một phần của quá trình bootstrap, vì vậy bạn không cần phải định nghĩa bất kỳ _init() phương pháp trong tệp bootstrap của bạn. Đó là loại ma thuật như thế.

Ngoài ra, theo như lưu trữ một cá thể bộ điều hợp, tôi có thể chỉ là người dùng Zend_Registry.

+0

Xin chào, cảm ơn bạn đã trả lời! 1. Về phân lớp tài nguyên, điều tôi thấy là ví dụ: resources.db được "ánh xạ tới" Zend_Application_Resource_Db. Nếu tôi viết của riêng tôi, ví dụ: Custom_Application_Resource_MultiDb và thêm config resources.multidb. *, Làm cách nào tôi có thể "ánh xạ" resources.multidb vào Custom_Application_Resource_MultiDb? 2. Tôi vẫn còn một chút bị mất ở đây. Bây giờ tôi thấy rằng những thứ khác nhau có thể thu được từ $ bootstrap. Tuy nhiên, làm thế nào để có được giữ của bootstrap $ ở vị trí số 1 vì không có chức năng getter singleton instance. Tôi có đặt $ bootstrap trong Zend_Registry không? –

0

cảm ơn tất cả các câu trả lời của bạn! Nó thực sự đã giúp tôi hiểu được khái niệm về ZF.

tôi cũng đã trải qua các tài liệu tham khảo và mã nguồn để có được một sự hiểu biết sâu sắc hơn, và đây là những gì tôi đã thông qua:

Trong application.ini của tôi có:

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" 

Sau đó, trong Bootstrap.php của tôi có:

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

Tất nhiên, trong index.php của tôi, tôi gọi:

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

Sau đó, trong bộ điều khiển nơi mà tôi cần để có được adapter DB, tôi làm:

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

Đây có phải là một Tốt/Xấu cách để làm việc này? Và có bất kỳ pitfall tôi nên xem cho?

Cảm ơn!

+0

đây là một cuộc thảo luận tốt, nhưng điều này nên là một chủ đề riêng biệt hoặc bạn nên chỉnh sửa bài viết gốc của bạn để điều này có thể được trả lời tốt hơn. –

+0

Nếu bạn có câu hỏi khác, vui lòng hỏi câu hỏi bằng cách nhấp vào nút [Hỏi câu hỏi] (http://stackoverflow.com/questions/ask). – saji89

Các vấn đề liên quan