多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > ZendFramework > Zend Framework教程-Application和Bootstrap

Zend Framework教程-Application和Bootstrap

來源:程序員人生   發布時間:2014-01-24 08:06:14 閱讀次數:3581次

在一個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
具體代碼如下:
<?php


class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{




}




2.配置文件
│   ├── configs
│   │   └── application.ini
具體代碼如下:
[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.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 = 1
phpSettings.display_errors = 1


[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1


3.項目入口文件
├── public
│   └── index.php
<?php


// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));


// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));


// Ensure library/ is on include_path
set_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 提供了一個本地注冊表對象存儲這些資源對象.當你想要存放一個資源的時候,只需要在方法中返回這個資源即可。


為了靈活性,注冊表是作為一個內部“容器”存在的。只要是對象都可以存入到容器中。資源名稱對應為容器的屬性。默認情況下,可以通過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;
    }
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲伦理一二三四 | 日本欧美韩国 | 久草在线新首页 | 欧美人与性动交α欧美精品 | 欧美jizzhd欧美精品巨大 | 欧美一区二区在线观看 | 日本免费区 | 亚洲久久网站 | 亚洲精品视频免费 | 欲色综合| 国产综合视频在线观看 | 日韩精品片 | 国产亚洲精品自在久久不卡 | 久久婷五月综合 | 午夜福免费福利在线观看 | 国产一区二三区 | 动漫美女毛片 | 日本不卡不码高清免费观看 | 午夜在线观看视频在线播放版 | 中文字幕视频免费在线观看 | 怡红院免费的全部视频国产a | 欧美成成人免费 | www久久久 | 国产人做人爱免费视频 | 女人aaaaa片一级一毛片 | 色吊丝一区二区 | 68久久久久欧美精品观看 | 欧美羞羞视频 | 999精品视频在线观看 | 欧美午夜在线观看理论片 | 国产精品一区久久精品 | 欧美黑人在线视频 | 久久精品国产主播一区二区 | 欧美黑人两根巨大挤入 | 最近的中文字幕免费完整 | 国产精品福利在线观看秒播 | 中文字幕一二三区乱码老 | h视频在线免费看 | h免费在线 | 日本xxxxx黄区免费看动漫 | 一二三四视频观看中文在线看 |