資源插件是 Zend Framework 實現「配置驅動、按需載入、可重用」的關鍵機制。本文系統解析資源介面、抽象基類、命名策略與實戰整合技巧。
資源插件必須實作的標準介面,定義生命週期契約:
__construct($options) - 接收配置選項setBootstrap($bootstrap) - 注入父引導物件,可存取其他資源getBootstrap() - 取得引導物件setOptions() / getOptions() - 選項管理init() - 核心方法,策略模式實現資源初始化,回傳值將自動存入資源註冊表實作上述介面的抽象基類,提供預設行為,未實作 init() 方法,需子類別覆寫。快速建立自訂資源的最佳起點。
資源名稱決定了如何在引導程式中引用與取得資源:
$app = new Zend_Application(APPLICATION_ENV, array(
'pluginPaths' => array('My_Resource' => 'My/Resource/'),
'resources' => array(
'My_Resource_View' => array(), // 完整類名
'View' => array(), // 短名稱(同樣指向 My_Resource_View)
),
));
$bootstrap->bootstrap('view');
$view = $bootstrap->getResource('view');
$app = new Zend_Application(APPLICATION_ENV, array(
'resources' => array(
'View' => array(), // Zend 內建
'My_Resource_View' => array(), // 自訂完整類名
),
));
$bootstrap->bootstrap('My_Resource_View');
$view = $bootstrap->getResource('My_Resource_View');
class My_Resource_View extends Zend_Application_Resource_ResourceAbstract {
public $_explicitType = 'My_View'; // 自訂資源識別名
public function init() {
// 初始化邏輯
}
}
// 使用自訂名稱引導
$bootstrap->bootstrap('My_View');
$view = $bootstrap->getResource('My_View');
class My_Resource_View extends Zend_Application_Resource_ResourceAbstract {
protected $_view;
public function init() {
return $this->getView();
}
public function getView() {
if (null === $this->_view) {
$options = $this->getOptions();
$title = isset($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;
}
}
$application = new Zend_Application(APPLICATION_ENV, array(
'pluginPaths' => array(
'My_Resource' => APPLICATION_PATH . '/resources/',
),
'resources' => array(
'FrontController' => array(
'controllerDirectory' => APPLICATION_PATH . '/controllers',
),
'My_View' => array('title' => 'My Application'),
),
));
// 載入單一/多個/所有資源
$bootstrap->bootstrap('FrontController');
$bootstrap->bootstrap(array('FrontController', 'My_View'));
$bootstrap->bootstrap(); // 全部
hasResource() / getResource() 安全存取init() 中呼叫 $this->getBootstrap()->bootstrap('dependency')$this->getInvokeArg('bootstrap')->getResource('view')善用資源插件系統,將應用程式初始化邏輯模組化、配置化,大幅提升程式碼重用性與維護性。