- zendframework官網php
1.php經常使用框架:zendframework,thinkphp(國人開發),yii(外企用的較多),cakephpcss
2.mvc框架:model 模型,view 試圖,controller 控制器html
3.zf的優點:固定的文件夾歸類,程序更加規範化,開發效率提升了,程序的可讀性增長,可維護性增長等等,不足之處就是配置比較複雜。mysql
4.開發環境配置步驟:
1-下載庫,
2-建立zf工程(手工建立,使用ZendStudio建立zf項目,使用zf.bat程序建立--進入zf.bat所在目錄,使用zf.bat create project 項目路徑 建立項目)詳細見:http://my.oschina.net/maomi/blog/86080
3-使用zendstudio建立一個空項目
4-把建立的項目結構拷貝到新建的空項目中
5-引入zf庫到該項目中,將zf解壓後library中的zend包拷貝到library目錄下便可
6-配置apache,讓它支持zf框架(wamp配置步驟見:http://my.oschina.net/maomi/blog/86076)
6.1開啓PDO和PDO相關數據庫引擎
;extension=php_pdo_mysql.dll 去掉前面的分號就能夠(wamp已經配置好這一點)
6.2開啓apache的rewrite模塊
在httpd.conf文件中,啓用 LoadModule rewrite_module modules/mod_rewrite.so
再將, AllowOverride None 改爲 All
7-配置虛擬主機(自定義和wamp安裝環境不同)
自定義:在httpd.conf文件中,啓用---->
dns 添加示例: 127.1.10 marong.com // 前面是ip地址,後面是在瀏覽器中輸入的地址
8-從新啓動apache服務器sql
---------------------------------------------------------------------------------------------------------chrome
1.zend原理剖析
hosts 127.0.0.1 marong.com :
瀏覽器地址 marong.com ----http請求---->apache服務器----轉發給index.php------>public/index.php(總控,apache 使用反射機制)-------->controller/indexController.php(分控:init方法默認執行 - indexAction方法執行[可使用model] - 引入對應模板視圖)------------>生成靜態頁面--------->apache服務器--------->瀏覽器thinkphp
2.程序調試
1-使用 file_put_contents在不中斷程序的狀況下,輸出信息到文件,能夠隨時查看記錄
2-能夠經過debug工具來完成調試
3-若是提示 require_once()所引用的文件不存在,則能夠將文件的引用路徑改成絕對路徑
如: require_once APPLICATION_PATH.'../models/Message.php';
其中,APPLICATION_PATH是在總控中初始化的全局變量數據庫
3.zend整合數據庫(示例)
1-在application.ini中配置數據庫信息
[mysql]
db.adapter = PDO_MYSQL
db.params.host = localhost
db.params.username = root
db.params.pwd = root
db.params.dbname = test
2-在bootstrap.php中初始化數據庫適配器
(最好是新建一個抽象父類baseController,該類專門供其餘須要初始化數據庫的類來繼承,繼承該類的子類必須
require_once(‘baseController.php’))
class BaseController extends Zend_Controller_Action{
public function init(){apache
}
json
}
注意:http://blog.csdn.net/wang_jingxiang/article/details/6011210 (另外一種配置數據庫的方法)
3-在models文件夾中編寫模型類(模型類文件名應該跟要操做的數據表名稱相同)
//設置私有變量,數據庫表名和表的主鍵
4-在indexController的index方法中,實例化模型類並查詢數據,將數據傳遞給模板對象
5-在模板中引用變量
6-在.htaaccess文件中設置url重寫規則,將全部以.php結尾的地址都指向 index.php總控文件,讓項目只有一個入口
4.新建控制器方法和對應視圖
5.注意事項
1-控制器中的方法名(Action前面的單詞)必須是小寫,不然將沒法正常解析
2-必須設置url重寫規則,保證項目只有一個入口文件(存在不理解的問題,待解決)
---------------------------------------------------------------------------------------------------------
一、使用Zend_View與Zend_Layout玩佈局
layout是很是方便的視圖庫,這裏列舉經常使用的ZF版本爲1.11.11的具體用法
在layout中加載其餘layout頁面
默認的layout頁面,nav頁面與layout同一個目錄
<?php $this->render('nav.phtml') ?>
設置其餘layout或關閉:
//設置其餘 控制器中的layout $this->_helper->layout->setLayout('japan_layout'); //設置其餘 視圖中的layout $this->layout()->setLayout('chinese_layout'); //關閉 控制器中的layout $this->_helper->layout->disableLayout(); //關閉 視圖中中的layout $this->layout()->disableLayout();
二、如何在controller中傳遞變量到view,而後輸出變量
public function indexAction() { // action body //爲變量賦值 $this->view->a = "Hay"; $this->view->b = "bbb"; $this->view->c = "ccc"; }
從上邊的程序能夠看出來,用此方式賦值特麻煩,要屢次賦值。能夠將變量放進一個數組或者對象中。assign()方法呢就容許經過數組或者對象賦值:
public function indexAction() { // action body $array = array( 'a' => "Hay", 'b' => "bbb", 'c' => "ccc", ); $this->view->assign($array); }
其效果和上邊效果是同樣的,那麼經過對象賦值就有點小不同了,就是要先把對象轉型爲數組:
public function indexAction() { // action body $obj = new stdClass(); $obj->a = "Hay"; $obj->b= "bbb"; $obj->c = "ccc"; $this->view->assign((array) $obj); }
assign()方法還有一種用法就是使用兩個字符串做爲assign()方法的參數。這樣第一個參數爲賦值的變量名,第二個參數做爲對應的值。以下:
$this->view->assign('a',"Hay"); $this->view->assign('b',"bbb"); $this->view->assign('c',"ccc");
至於視圖部分代碼以下:index.phtml
<?php echo $this->a."<br>"; echo $this->b."<br><br><br><br>"; echo $this->c."<br>"; ?>
三、禁用視圖並輸出內容
a、先輸出內容再禁用試圖
$this->_helper->viewRenderer->setNoRender(true); // 可省略 print_r(Zend_Json::encode(array('error'=>403))); // 輸出內容 exit(); // 禁用試圖 return; // 可省略
輸出結果:
{"error":403}
b、直接禁用試圖同時輸出內容
$this->_helper->viewRenderer->setNoRender(true); // 可省略 exit(json_encode(array('error'=>403))); return; // 可省略
輸出結果:
{"error":403}
c、經過拋出「error」關閉視圖
exit(json_encode('error')); //"error" exit('error'); //error
四、render,_forward,_redirect的用法和區別
render:
不指定render
結果:<當前Module>/<當前Controller>/<當前Action>.phtml
$this->render(‘bar’);
Result: <當前Module>/<當前Controller>/bar.phtml
_forward:
$this->_forward(‘bar’);
Result: <當前Module>/<當前Controller>/bar
$this->_forward(‘bar’,’foo’);
Result: <當前Module>/foo/bar
$this->_forward(‘bar’,’foo’,’hoge’);
Result: hoge/foo/bar
$params = array(
‘a’ -> ‘1’,
‘b’ -> ‘2'
);
$this->_forward(‘bar’,’foo’,’hoge’,$params);
Result: hoge/foo/bar/a/1/b/2
_redirect:
$this->_redirect(‘/hoge’);
Result: /hoge
$this->_redirect(‘/hoge/foo’);
Result: /hoge/foo
$this->_redirect(‘/hoge/foo/bar’);
Result: /hoge/foo/bar
$this->_redirect(‘http://localhost/hoge/foo/bar'’);
Result: http://localhost/hoge/foo/bar
$this->_redirect('http://localhost/hoge/foo/bar?a=1&b=2'');
Result: http://localhost/hoge/foo/bar?a=1&b=2
五、placeholder 的使用和設置
placeholder 的使用:官方教程
//在bootstarp中 $this->bootstrap('view'); $view = $this->getResource('view'); //成功調用了placeholder $view ->placeholder('test’) ->setPrefix('<h1>HI</h1>’);
placeholder 的設置:在你的applicateion.ini中加入 resources.view[] = "" ;若是沒有這個設置,你的bootstrap中的$this->bootstrap('view');將會報錯
---------------------------------------------------------------------------------------------------------
虛擬目錄指向 public 目錄:
引入圖片時,能夠設置虛擬目錄,用'/images/a.jpg'這樣的方式來引入public目錄下的圖片,css等內容。
虛擬目錄指向非 public 目錄:
解決:方法是使用絕對路徑來引入css,這樣就絕對錯不了了,所以考慮設置一個常量,路徑直指public
步驟一:Bootstrap.php 因爲這個文件每次都被調用,因此就把常量設到這裏了,代碼以下
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function __construct($application){ parent::__construct($application); $url = dirname(__FILE__);//獲取當前文件Bootstrap.php目錄路徑 $url = str_replace('application','public',$url);//把當前路徑更換爲public路徑 $url = str_replace('\\','/',$url);//更改路徑中的「\」爲「/」 define('__PUBLIC__',$url);//定放常量 } } ?>
步驟二:控制器中代碼
<?php class AdminController extends Zend_Controller_Action{ public function indexAction(){ $this->view->public=__PUBLIC__;//分配到MVC中的「V」也即視圖 $this->render('index');//能夠不寫 } } ?>
步驟三:視圖中代碼 index.phtml
<link rel="stylesheet" type="text/css" href="<?php echo $this->public; ?>/style/admin.css" />
P.S.火狐瀏覽器、google的chrome 不支持絕對路徑,使用下面的代碼,更換步驟一中代碼,其餘不變
<?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function __construct($application){ parent::__construct($application); $url = $_SERVER['SCRIPT_NAME']; $url = dirname($url); $url = str_replace('\\','/',$url); define('__PUBLIC__',$url); } } ?>
---------------------------------------------------------------------------------------------------------
在application/configs/application.ini中添加數據庫的配置信息
[production] //在這一行的後面添加數據庫鏈接信息 resources.db.adapter = PDO_MYSQL resources.db.params.host = 127.0.0.1 resources.db.params.username = root resources.db.params.password = resources.db.params.dbname = zend_example
在index.php入口文件中加入:
$config = new Zend_Config_Ini('../application/configs/application.ini','production'); $register = Zend_Registry::getInstance(); $register->set('config', $config); $db = Zend_Db::factory($config->resources->db); Zend_Db_Table::setDefaultAdapter($db);