前些天準(zhǔn)備寫一個自己的博客CMS,考慮html' target='_blank'>PHP框架的時候想到了據(jù)說非常強大的yii,接觸yii時發(fā)現(xiàn)有2.0版本,果斷嘗最鮮的。這么一嘗試感覺入了坑了,yii2.0是2014年12月發(fā)布的,估計國內(nèi)用的人比較少,資料比較少,遇到問題百度yii2.0查出來好多1.0版本的答案,只好去google看英文站。一個小問題沒人提醒,又是STACK OVERFLOW又是自己翻源碼,弄了一天多。。??芍^是吃盡了苦頭。
不過網(wǎng)站總算是做出來了,地址:http://www.alwayscoding.cn,以后博客在此站同步更新,而且,我也可以在上面肆無忌憚的放上自己喜歡的文章了~~另外源碼也放在了github上,地址:https://github.com/zhenbianshu/blog-cms,有想使用本CMS的我可以提供支持~最后自己也總結(jié)出來了下列的使用心得,準(zhǔn)備入手yii2.0的可以看一下,留個爪。
yii默認(rèn)是site控制器,可以在web.php中設(shè)置$config中的'defaultRoute'='xxxx';使用自定義默認(rèn)的控制器。也可以改寫Yii::$app->defaultRoute屬性。
yii的默認(rèn)方法是index,可以在vender/yiisoft/yii2/base/Controller.php 中進(jìn)行初始設(shè)置,也可以在控制器中改寫defaltAction='action'。
2.添加獨立模塊yii可以在modules文件夾中添加自定義模塊,添加完成后在web.php中的$config中的'modules'=[id=..class=...]設(shè)置模塊的開關(guān)。
模塊一般用于一些獨立的功能,像我站里的admin模塊整體負(fù)責(zé)后臺邏輯。
3.模型操作表設(shè)置yii的模型有Model和ActiveRecord兩種,Model類用來處理基本的業(yè)務(wù)邏輯,沒有數(shù)據(jù)庫相關(guān)方法,如果要操作同名數(shù)據(jù)表,請繼承ActiveRecord類。
我們用一個在models文件夾中的Operation.class里Operation類來繼承yiidbActiveRecord來操作Operation表。
如果要操作其他表,也可以重寫public $tableName屬性來設(shè)置?;蚋膶懫鋞ableName方法(注意是靜態(tài)方法) : public static function tableName(){return 'tableName'}
4.視圖層構(gòu)成yii的視圖層使用.php文件,而且其內(nèi)部的實現(xiàn)也多采用yii內(nèi)置小部件的形式,如<?= LinkPager::widget(['pagination'=>$pagination]) ?>來表示其分頁類。
而且,像input這樣的小部件,用ActiveForm類來展現(xiàn),yii會對每個自動加入ajax驗證,其一般的小部件都放在yiiwidget里,我們還可以在此文件夾里構(gòu)建自定義的小部件類。
5.布局模式yii會默認(rèn)開啟布局模式,其布局模板為view中的layout中的main.php,我們可以在veder/yiisoft/yii2/web/controller.php基礎(chǔ)類中public $layout屬性修改模板文件的配置。
我們還可以設(shè)置關(guān)閉或指定特定的layout:
控制器內(nèi)控制 public $layout=false/'layout' 控制器成員方法內(nèi)控制 $this->layout=false/'layout' 視圖中選擇布局 $this->context->layout=false/'layout'6.模型的基本設(shè)置yii的模型是MVC的處理器,它執(zhí)行對MVC邏輯的處理。 model的屬性定義是其核心,由于默認(rèn)定義魔術(shù)方法get/set,所以可以直接在model外調(diào)用$modle->attr='value',對模型的屬性進(jìn)行獲取/賦值。
場景設(shè)置yii中有對場景的定義,定義場景可以使得yii在不同的情況下返回不同的數(shù)據(jù)信息。用model的scenarios()方法來設(shè)置返回數(shù)據(jù)。
我們在使用model時傳入場景名 $model=new Model(['scenario'=>'login']);來確定場景。
規(guī)則設(shè)置yii中對驗證規(guī)則的定義,使用rules()方法可以一條定義多條規(guī)則,也可以根據(jù)不同的場景進(jìn)行定義。外部驗證時用$model->validate()方法來執(zhí)行驗證。
在安全模式下,要進(jìn)行安全驗證,即每一個屬性都要在rules里驗證,如果沒有特定規(guī)則,也要添加'safe'驗證。否則驗證失敗,存入數(shù)據(jù)庫也會失敗。
標(biāo)簽設(shè)置在處理表單時,多用$model->attributes屬性來表示全部的屬性。其中attributeLabels方法return一個數(shù)組用來表示視圖層中ActiveForm產(chǎn)生的各個表單項的label標(biāo)簽
7.引用JS/CSS文件yii中的view也使用面向?qū)ο?/u>方式 ,所以引入CSS和JS文件要用特殊的方法。
使用$this->registerJsFile('js.js')來引入js文件; 使用$this->registerJsFile('js.js')來引入js文件;8.分頁類的使用//在模型中計算出總數(shù)量$count=$this->find()->where()->count();//用總條數(shù)和設(shè)定的每頁個數(shù)實例化一個yiidataPagination類$page=new Pagination([totalCount' => $count,'defaultPageSize' => 2,]);//使用分頁類的屬性搜索想要的數(shù)據(jù),并返回數(shù)據(jù)$res=$this->find()->where()->offset($page->offset)->limit($page->limit)->all();return [$res,$page];//使用控制器渲染頁面$data=$model->getData();return $this->render('index',$data);//在視圖頁面中使用數(shù)據(jù)。foreach($res as key)...yiiwidgetsLinkPager::widget([pagination=$page,prevPageLabel='上一頁'])。9.創(chuàng)建urluse yiihelpersUrl;Url::to(['xxx/xxx']);//或Yii::$app->urlManager->createUrl('xxx.xxx')10查詢構(gòu)建器yii里的QUERY查詢語句構(gòu)造器非常簡單好用,它可以用在模型和控制器中,雖然可能會造成模型與表不對應(yīng),但其構(gòu)成接近sql語句,使用它可以輕易寫出復(fù)雜的sql語句而不必嚴(yán)格遵從yii的內(nèi)置規(guī)則。
方法為:
$res=(new yiidbQuery())->select()->from()->leftJoin()->where->()->all();其中where語句較為復(fù)雜:
where('in','id',$array)或where('id'=>$array)具體可以查看http://www.yiichina.com/doc/guide/2.0/db-query-builder中對where方法的解析。
11.自定義函數(shù)yii里面自定義函數(shù)可以在vendor/yiisoft/yii2/helpers/文件夾里,新建一個XXX.php文件,然后定義一個自定義類,再定義靜態(tài)方法YYY()。
使用時應(yīng)用基命名空間,use yiihelpersXXX,然后用類來引用基靜態(tài)方法XXX::YYY()
12.關(guān)聯(lián)模型yii里面的關(guān)聯(lián)模型,用來在取得當(dāng)前表內(nèi)的一條記錄時,會取出對應(yīng)表的記錄。如A表內(nèi)每取出一條信息,也取出B表中跟A表對應(yīng)有信息,在ModelA里定義一個getBtable方法
function getBtable(){ return $this->hasOne/hasMany(Btable::className,['bid'=>'aid']);}查詢時可以使用joinWith('Btable')->find();會在查找時查找其關(guān)聯(lián)對象;也可以使用$this->find()等方法結(jié)果對象
使用$res->btable來直接引用對象。
使用$res[n]->btable->attr來引用B表的對應(yīng)屬性。
13.使用ActiveForm創(chuàng)建表單yii2中使用小部件創(chuàng)建view視圖的步驟: 設(shè)置一個Model設(shè)置其屬性
public $username;public $password;設(shè)置其rule或場景等
public function rules(){ return [ [['username', 'password','conpass'], 'required'], ['conpass', 'password', ];}設(shè)置其label
public function attributeLabels(){ return [ 'username' => '管理員', 'password' => '密碼', ]; }然后在controller中將model的實例渲染進(jìn)去:
$this->render('index',['model'=>(new Model/ActiveRecord)])最后在頁面中使用ActiveForm
use yiiwidgetsActiveForm;<?php $form = ActiveForm::begin([ 'action' => ['log/login'], 'method'=>'post' ]); ?> <?= $form->field($model, 'username') ?> <?= $form->field($model, 'password') ?> <div class='form-group'> <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?> </div><?php ActiveForm::end(); ?>14.使用驗證碼在controller中設(shè)置驗證碼的獨立方法
public function actions() { return [ 'captcha' => [ 'class' => 'yiicaptchaCaptchaAction', 'height' => 50, 'width' => 80, 'minLength' => 4, 'maxLength' => 4 ], ]; }在model里設(shè)置rule和label,label同上
public function rules(){ return [['verifyCode', 'captcha','captchaAction'=>'admin/log/captcha'],];}(captchaAction要設(shè)置為controller中的位置,如果自定義module要設(shè)置module) 在view中使用
use yiicaptchaCaptcha;<?= $form->field($model, 'verifyCode')->widget(Captcha::className(), ['captchaAction'=>'log/captcha', 'imageOptions'=> ['alt'=>'點擊換圖', 'style'=>'cursor:pointer'] ]) ?>15.視圖中塊的使用塊內(nèi)容在$this->beginBlock(['id'=>xxx])和$this->endBlock()之間定義,在layout中使用$view->block[id]來引用??梢栽谕瓿上蚰0逯袑?dǎo)入視圖數(shù)據(jù)。
也可以定義$this->var=xxx;在layout中用$this->var來引用。
16.更新和刪除更新//查找到一條結(jié)果$res=$this->find()->where()->one();//對結(jié)果修改$res->attr='xxx';//執(zhí)行更新操作$res->update();刪除//刪除一條數(shù)據(jù)$this->findOne($id)->delete();//刪除所有符合條件的數(shù)據(jù)$this->deleteAll([where]);在模塊中用Url::to()方法創(chuàng)建URL時,會自動在前面添加模塊名,導(dǎo)致無法跳轉(zhuǎn)到其他模塊,我們可以在字符串前添加'//'符來返回根模塊,例如Url::to(['//index/index'])表示跳轉(zhuǎn)到初始地址。
2.初始化變量想在控制器中每一個操作前,初始化一個變量的話不要重寫__construct構(gòu)造函數(shù),因為它需要傳入各種變量。最好重寫beforeAction()函數(shù),它會在執(zhí)行每一個action時都執(zhí)行一下。
并且注意:方法的最后一定要添加return true語句。
3.在JS中使用YII的變量若想在JS中使用YII的URL變量等,可以使用html中的script標(biāo)簽,將變量在第一次渲染視圖時預(yù)先解析出來,將下面代碼放在需要使用變量的地方之前。
<script type='text/javascript'> var key='<?=Url::to(['xxx/xxx']) ?>'</script>然后在JS文件中正常使用。
4.全局常量的定義我們可以在config文件夾中的params.php中定義全局常量。
然后在腳本中用Yii::$app->params['key']來引用。
5.yii模型屬性轉(zhuǎn)數(shù)組YII用toArray()方法可以將模型的屬性轉(zhuǎn)換為數(shù)組進(jìn)行輸出,可獨立使用,也可以在查詢時用連續(xù)操作方式使用。
6.在使用controller渲染view頁面時,一定要在render前加echo或return 寫作echo/return $this->render('view',$data);7.yii中的屬性,謹(jǐn)記!在ActiveForm中如果數(shù)據(jù)表中有了此字段,就不要再用public聲明一個屬性了,會導(dǎo)致attribute無法賦值。。。。(血淚)。PHP編程鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選