yii默認是site控制器,能夠在web.php中設置$config中的'defaultRoute'='xxxx';使用自定義默認的控制器。也能夠改寫Yii::$app->defaultRoute屬性。javascript
yii的默認方法是index,能夠在vender/yiisoft/yii2/base/Controller.php 中進行初始設置,也能夠在控制器中改寫defaltAction='action'。php
yii能夠在modules文件夾中添加自定義模塊,添加完成後在web.php中的$config中的'modules'=[id=..class=...]設置模塊的開關。html
模塊通常用於一些獨立的功能,像我站裏的admin模塊總體負責後臺邏輯。java
yii的模型有Model和ActiveRecord兩種,Model類用來處理基本的業務邏輯,沒有數據庫相關方法,若是要操做同名數據表,請繼承ActiveRecord類。ios
咱們用一個在models文件夾中的Operation.class裏Operation類來繼承yii\db\ActiveRecord來操做Operation表。web
若是要操做其餘表,也能夠重寫public $tableName屬性來設置。或改寫其tableName方法(注意是靜態方法) : public static function tableName(){return 'tableName'}ajax
yii的視圖層使用.php文件,並且其內部的實現也多采用yii內置小部件的形式,如<?= LinkPager::widget(['pagination'=>$pagination]) ?>來表示其分頁類。sql
並且,像input這樣的小部件,用ActiveForm類來展示,yii會對每一個自動加入ajax驗證,其通常的小部件都放在yii\widget\裏,咱們還能夠在此文件夾裏構建自定義的小部件類。數據庫
yii會默認開啓佈局模式,其佈局模板爲view中的layout中的main.php,咱們能夠在veder/yiisoft/yii2/web/controller.php基礎類中public $layout屬性修改模板文件的配置。數組
咱們還能夠設置關閉或指定特定的layout:
yii的模型是MVC的處理器,它執行對MVC邏輯的處理。 model的屬性定義是其核心,因爲默認定義魔術方法get/set,因此能夠直接在model外調用$modle->attr='value',對模型的屬性進行獲取/賦值。
yii中有對場景的定義,定義場景能夠使得yii在不一樣的狀況下返回不一樣的數據信息。用model的scenarios()方法來設置返回數據。
咱們在使用model時傳入場景名 $model=new Model(['scenario'=>'login']);來肯定場景。
yii中對驗證規則的定義,使用rules()方法能夠一條定義多條規則,也能夠根據不一樣的場景進行定義。外部驗證時用$model->validate()方法來執行驗證。
在安全模式下,要進行安全驗證,即每個屬性都要在rules裏驗證,若是沒有特定規則,也要添加'safe'驗證。不然驗證失敗,存入數據庫也會失敗。
在處理表單時,多用$model->attributes屬性來表示所有的屬性。其中attributeLabels方法return一個數組用來表示視圖層中ActiveForm產生的各個表單項的label標籤
yii中的view也使用面向對象方式 ,因此引入CSS和JS文件要用特殊的方法。
//在模型中計算出總數量 $count=$this->find()->where()->count(); //用總條數和設定的每頁個數實例化一個yii\data\Pagination類 $page=new Pagination([totalCount' => $count,'defaultPageSize' => 2,]); //使用分頁類的屬性搜索想要的數據,並返回數據 $res=$this->find()->where()->offset($page->offset)->limit($page->limit)->all(); return [$res,$page]; //使用控制器渲染頁面 $data=$model->getData(); return $this->render('index',$data); //在視圖頁面中使用數據。 foreach($res as key)... yii\widgets\LinkPager::widget([pagination=$page,prevPageLabel='上一頁'])。
use yii\helpers\Url; Url::to(['xxx/xxx']); //或 Yii::$app->urlManager->createUrl('xxx.xxx')
yii裏的QUERY查詢語句構造器很是簡單好用,它能夠用在模型和控制器中,雖然可能會形成模型與表不對應,但其構成接近sql語句,使用它能夠輕易寫出複雜的sql語句而沒必要嚴格聽從yii的內置規則。
方法爲:
$res=(new yii\db\Query())->select()->from()->leftJoin()->where->()->all();
其中where語句較爲複雜:
where('in','id',$array)或where('id'=>$array)
具體能夠查看http://www.yiichina.com/doc/guide/2.0/db-query-builder中對where方法的解析。
yii裏面自定義函數能夠在vendor/yiisoft/yii2/helpers/文件夾裏,新建一個XXX.php文件,而後定義一個自定義類,再定義靜態方法YYY()。
使用時應用基命名空間,use yii\helpers\XXX,而後用類來引用基靜態方法XXX::YYY()
yii裏面的關聯模型,用來在取得當前表內的一條記錄時,會取出對應表的記錄。如A表內每取出一條信息,也取出B表中跟A表對應有信息,在ModelA裏定義一個getBtable方法
function getBtable() { return $this->hasOne/hasMany(Btable::className,['bid'=>'aid']); }
查詢時能夠使用joinWith('Btable')->find();
會在查找時查找其關聯對象;也能夠使用$this->find()等方法結果對象
使用$res->btable來直接引用對象。
使用$res[n]->btable->attr來引用B表的對應屬性。
yii2中使用小部件建立view視圖的步驟: 設置一個Model設置其屬性
public $username; public $password;
設置其rule或場景等
public function rules(){ return [ [['username', 'password','conpass'], 'required'], ['conpass', 'password', ]; }
設置其label
public function attributeLabels(){ return [ 'username' => '管理員', 'password' => '密碼', ]; }
而後在controller中將model的實例渲染進去:
$this->render('index',['model'=>(new Model/ActiveRecord)])
最後在頁面中使用ActiveForm
use yii\widgets\ActiveForm; <?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(); ?>
在controller中設置驗證碼的獨立方法
public function actions() { return [ 'captcha' => [ 'class' => 'yii\captcha\CaptchaAction', 'height' => 50, 'width' => 80, 'minLength' => 4, 'maxLength' => 4 ], ]; }
在model裏設置rule和label,label同上
public function rules(){ return [['verifyCode', 'captcha','captchaAction'=>'admin/log/captcha'],]; }
(captchaAction要設置爲controller中的位置,若是自定義module要設置module) 在view中使用
use yii\captcha\Captcha; <?= $form->field($model, 'verifyCode')->widget(Captcha::className(), ['captchaAction'=>'log/captcha', 'imageOptions'=> ['alt'=>'點擊換圖', 'style'=>'cursor:pointer'] ]) ?>
塊內容在$this->beginBlock(['id'=>xxx])和$this->endBlock()之間定義,在layout中使用$view->block[id]來引用。能夠在完成向模板中導入視圖數據。
也能夠定義$this->var=xxx;在layout中用$this->var來引用。
//查找到一條結果 $res=$this->find()->where()->one(); //對結果修改 $res->attr='xxx'; //執行更新操做 $res->update();
//刪除一條數據 $this->findOne($id)->delete(); //刪除全部符合條件的數據 $this->deleteAll([where]);
在模塊中用Url::to()方法建立URL時,會自動在前面添加模塊名,致使沒法跳轉到其餘模塊,咱們能夠在字符串前添加'//'符來返回根模塊,例如Url::to(['//index/index'])表示跳轉到初始地址。
想在控制器中每個操做前,初始化一個變量的話不要重寫__construct構造函數,由於它須要傳入各類變量。最好重寫beforeAction()函數,它會在執行每個action時都執行一下。
而且注意:方法的最後必定要添加return true語句。
若想在JS中使用YII的URL變量等,能夠使用html中的script標籤,將變量在第一次渲染視圖時預先解析出來,將下面代碼放在須要使用變量的地方以前。
<script type="text/javascript"> var key="<?=Url::to(['xxx/xxx']) ?>" </script>
而後在JS文件中正常使用。
咱們能夠在config文件夾中的params.php中定義全局常量。
而後在腳本中用Yii::$app->params['key']來引用。
YII用toArray()方法能夠將模型的屬性轉換爲數組進行輸出,可獨立使用,也能夠在查詢時用連續操做方式使用。