Zend Framework中的Application和Bootstrap的用法

來源:互聯網
上載者:User
這篇文章主要介紹了Zend Framework教程之Application和Bootstrap用法,結合執行個體形式詳細分析了Application和Bootstrap的功能,提示與相關注意事項,需要的朋友可以參考下

本文執行個體講述了Zend Framework教程之Application和Bootstrap用法。分享給大家供大家參考,具體如下:

在一個MVC應用程式中,我們需要初始化建立資料庫連結,配置視圖和視圖助手,配置布局,註冊相關外掛程式,註冊action 助手等等,這些配置和準備工作我們都需要一一完成。有時候可能有一些初始化操作需要,但是在有些情況下這些初始化可能不需要。通過Zend_Application不僅僅可以完成這些操作,而且可以讓這些配置和初始化工作更統一有序,重用性更高。

Zend_Application使用可以細分成三種:

Zend_Application:載入PHP環境,包括include_paths和自動載入,並執行個體化引導類。

Zend_Application_Bootstrap:提供引導類的介面。

Zend_Application_Bootstrap_Bootstrap完成大多數引導需要提供的通用功能,包括依賴性檢查和按需載入引導資源。

Zend_Application_Resource提供資源按需載入功能

開發人員可以根據需要繼承Zend_Application_Bootstrap_Bootstrap或實現Zend_Application_Bootstrap_Bootstrapper介面。在入口檔案(例如,public/index.php)載入Zend_Application,並根據引導選項和當前環境配置執行個體化。

引導選項包括指定的引導類檔案和引導類路徑,選項具體如下:

所需要的include_paths

自動載入功能額外載入註冊的命名空間

php.ini初始化設定

指定bootstrap類名,如果不是"Bootstrap"

資源的首碼索引值對鍵表示資源首碼名稱

資源的類名或者別名

附加載入的設定檔路徑

附加的配置選項

選項可以是一個數組,或者Zend_Config對象,或者是指定位置的設定檔

引導程式

Zend_Application的第二個功能就是引導應用,Bootstraps 必須實現Zend_Application_Bootstrap_Bootstrapper介面, 具體介面API如下:

interface Zend_Application_Bootstrap_Bootstrapper{  public function __construct($application);  public function setOptions(array $options);  public function getApplication();  public function getEnvironment();  public function getClassResources();  public function getClassResourceNames();  public function bootstrap($resource = null);  public function run();}

api主要提供了環境配置,擷取引導載入的資源,以及引導程式

你可以實現介面或者繼承Zend_Application_Bootstrap_BootstrapAbstract,或者Zend_Application_Bootstrap_Bootstrap.

資源方法

實現Zend_Application_Bootstrap_BootstrapAbstract介面的資源方法必須遵循如下規則. 方法類型是protected,方法的首碼必須是_init will開頭.

如果要載入使用一個資源方法,在bootstrap()中添加資源名稱即可,資源名稱是資源方法去掉_init首碼。

如果要載入使用多個資源方法,可以通過數組指定。

例如 bootstrap class:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{  protected function _initFoo()  {    // ...  }  protected function _initBar()  {    // ...  }  protected function _initBaz()  {    // ...  }}

只載入使用_initFoo() :

$bootstrap->bootstrap('foo');

載入使用 _initFoo() and _initBar() :

$bootstrap->bootstrap(array('foo', 'bar'));

載入使用全部資源方法,使用無參的bootstrap():

$bootstrap->bootstrap();

建立first_web項目

root@coder-671T-M:/mydev_src/zend_framework_learn/www# tree first_web/
first_web/
├── application
│ ├── Bootstrap.php
│ ├── configs
│ │ └── application.ini
│ ├── controllers
│ │ ├── ErrorController.php
│ │ └── IndexController.php
│ ├── models
│ └── views
│ ├── helpers
│ └── scripts
│ ├── error
│ │ └── error.phtml
│ └── index
│ └── index.phtml
├── docs
│ └── README.txt
├── library
├── public
│ └── index.php
└── tests
├── application
│ └── controllers
│ └── IndexControllerTest.php
├── bootstrap.php
├── library
└── phpunit.xml
16 directories, 11 files

較新版本的zend framework引入了Zend_Application和Bootstrap。Zend_Application 提供了一個可重用資源的引導,通用和模組化的引導類和依賴檢查。 同時預設負責設定 PHP 環境變數和自動載入功能。

預設建立項目後,會給出如下的幾個檔案:

1.項目的Bootstrap

first_web/
├── application
│ ├── Bootstrap.php

具體代碼如下:

<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{}

2.設定檔

│ ├── configs
│ │ └── application.ini

具體代碼如下:

[production]phpSettings.display_startup_errors = 0phpSettings.display_errors = 0includePaths.library = APPLICATION_PATH "/../library"bootstrap.path = APPLICATION_PATH "/Bootstrap.php"bootstrap.class = "Bootstrap"appnamespace = "Application"resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"resources.frontController.params.displayExceptions = 0[staging : production][testing : production]phpSettings.display_startup_errors = 1phpSettings.display_errors = 1[development : production]phpSettings.display_startup_errors = 1phpSettings.display_errors = 1resources.frontController.params.displayExceptions = 1

3.項目入口檔案

├── public
│ └── index.php

<?php// Define path to application directorydefined('APPLICATION_PATH')  || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));// Define application environmentdefined('APPLICATION_ENV')  || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));// Ensure library/ is on include_pathset_include_path(implode(PATH_SEPARATOR, array(  realpath(APPLICATION_PATH . '/../library'),  get_include_path(),)));/** Zend_Application */require_once 'Zend/Application.php';// Create application, bootstrap, and run$application = new Zend_Application(  APPLICATION_ENV,  APPLICATION_PATH . '/configs/application.ini');$application->bootstrap()      ->run();

以上代碼就是基本的使用Zend_Application方式,完成了環境變數的初始化,載入設定檔,初始化環境,載入模組,完成web應用程式的引導功能。

資源外掛程式

資源外掛程式只需要實現Zend_Application_Resource_Resource,或者,更簡單的是,繼承Zend_Application_Resource_ResourceAbstract。介面如下:

interface Zend_Application_Resource_Resource{  public function __construct($options = null);  public function setBootstrap(    Zend_Application_Bootstrap_Bootstrapper $bootstrap  );  public function getBootstrap();  public function setOptions(array $options);  public function getOptions();  public function init();}

例如

class My_Resource_View extends Zend_Application_Resource_ResourceAbstract{  protected $_view;  public function init()  {    // Return view so bootstrap will store it in the registry    return $this->getView();  }  public function getView()  {    if (null === $this->_view) {      $options = $this->getOptions();      $title  = '';      if (array_key_exists('title', $options)) {        $title = $options['title'];        unset($options['title']);      }      $view = new Zend_View($options);      $view->doctype('XHTML1_STRICT');      $view->headTitle($title);      $view->headLink()->appendStylesheet('/css/site.css');      $view->headScript()->appendfile('/js/analytics.js');      $viewRenderer =        Zend_Controller_Action_HelperBroker::getStaticHelper(          'ViewRenderer'        );      $viewRenderer->setView($view);      $this->_view = $view;    }    return $this->_view;  }}

載入使用資源外掛程式

我了提供資源的重用性,可以將資源方法定義為資源外掛程式。。

為了讓bootstrap能夠識別資源外掛程式,定義資源外掛程式時,需要實現Zend_Application_Bootstrap_ResourceBootstrapper. 介面定義了尋找外掛程式,註冊外掛程式和載入外掛程式的api:

interface Zend_Application_Bootstrap_ResourceBootstrapper{  public function registerPluginResource($resource, $options = null);  public function unregisterPluginResource($resource);  public function hasPluginResource($resource);  public function getPluginResource($resource);  public function getPluginResources();  public function getPluginResourceNames();  public function setPluginLoader(Zend_Loader_PluginLoader_Interface $loader);  public function getPluginLoader();}

採用資源外掛程式,不僅可以讓資源可以重複利用,同時讓bootstrap更簡潔,如果要修改,新增資源也無需修改你的bootstrap。

通過實現Zend_Application_Bootstrap_BootstrapAbstract (被 Zend_Application_Bootstrap_Bootstrap 繼承) ,才可以使用定義的資源外掛程式

通過將指定的選項傳遞到application object and/or bootstrap,來註冊使用資源外掛程式。這些選項可能會從一個設定檔,或通過手動指定。規則是選項必須是索引值對,鍵代表資源名稱。資源名稱,是資源外掛程式類的類首碼。例如,Zend架構內建的資源類首碼“Zend_Application_Resource_”;任何以下,這都是資源的名稱。例如,

$application = new Zend_Application(APPLICATION_ENV, array(  'resources' => array(    'FrontController' => array(      'controllerDirectory' => APPLICATION_PATH . '/controllers',    ),  ),));

"FrontController"資源是個特例。他的選項比較特殊。

無論是使用自己的寫的資源外掛程式還是使用第三方的資源外掛程式。你必須保證bootstrap能找到他們,bootstrap 內部通過 Zend_Loader_PluginLoader可以讓我們只需要指定資源外掛程式的類首碼,值為資源類的類路徑便可以輕鬆註冊資源外掛程式。

例如,如果編寫的資源外掛程式存放在APPLICATION_PATH/resources/ 下,類首碼為My_Resource. 可以使用如下方法註冊載入:

$application = new Zend_Application(APPLICATION_ENV, array(  'pluginPaths' => array(    'My_Resource' => APPLICATION_PATH . '/resources/',  ),  'resources' => array(    'FrontController' => array(      'controllerDirectory' => APPLICATION_PATH . '/controllers',    ),  ),));

在應用程式中比可以使用指定目錄下的資源。

和資源方法類似,通過使用 the bootstrap() 方法可以載入資源外掛程式。載入單一,多個,全部的資源外掛程式的配置方式也類似.

例如:

// Execute one:$bootstrap->bootstrap('FrontController');// Execute several:$bootstrap->bootstrap(array('FrontController', 'Foo'));// Execute all resource methods and plugins:$bootstrap->bootstrap();

資源註冊表

為了避免資源的重複註冊,導致不必要的浪費Zend_Application_Bootstrap_BootstrapAbstract 提供了一個本地註冊表Object Storage Service這些資來源物件.當你想要存放一個資源的時候,只需要在方法中返回這個資源即可。

為了靈活性,註冊表是作為一個內部“容器”存在的。只要是對象都可以存入到容器中。資源名稱對應為容器的屬性。預設情況下,可以通過Zend_Registry擷取執行個體使用,也可以自訂其他對象。 setContainer() and getContainer() 方法可用於操縱容器本身。getResource($resource) 可用於擷取一個指定資源。hasResource($resource) 可以檢查資源是否已經註冊存在

例如,註冊一個view資源:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{  protected function _initView()  {    $view = new Zend_View();    // more initialization...    return $view;  }}

資源的相關操作:

// Using the has/getResource() pair:if ($bootstrap->hasResource('view')) {  $view = $bootstrap->getResource('view');}// Via the container:$container = $bootstrap->getContainer();if (isset($container->view)) {  $view = $container->view;}

請注意:註冊表容器是不是全域的。這意味著你需要通過訪問的bootstrap來擷取資源。 Zend_Application_Bootstrap_Bootstrap提供了 run() , 執行了 run() 之後,它會註冊為前端控制器參數的“bootstrap”,通過他可以擷取路由器,分發器,外掛程式和動作控制器。

具體使用方法:

class FooController extends Zend_Controller_Action{  public function init()  {    $bootstrap = $this->getInvokeArg('bootstrap');    $view = $bootstrap->getResource('view');    // ...  }}

為了防止重複註冊載入資源方法和外掛程式或一些資源可能依賴於其他資源。為瞭解決這兩個問題,Zend_Application_Bootstrap_BootstrapAbstract提供了一個簡單的依賴性跟蹤機制。

如前所述,所有的資源 - 無論是方法或外掛程式 - 是通過 bootstrap($resource)載入啟動並執行,其中 $resource是資源的名稱,或者資源名稱數組,或者為空白,為空白表示載入運行所有資源。

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{  protected function _initRequest()  {    // Ensure the front controller is initialized    $this->bootstrap('FrontController');    // Retrieve the front controller from the bootstrap registry    $front = $this->getResource('FrontController');    $request = new Zend_Controller_Request_Http();    $request->setBaseUrl('/foo');    $front->setRequest($request);    // Ensure the request is stored in the bootstrap registry    return $request;  }}

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.