yii2開發後記

基礎總結

1.修改默認控制器/方法

yii默認是site控制器,能夠在web.php中設置$config中的'defaultRoute'='xxxx';使用自定義默認的控制器。也能夠改寫Yii::$app->defaultRoute屬性。javascript

yii的默認方法是index,能夠在vender/yiisoft/yii2/base/Controller.php 中進行初始設置,也能夠在控制器中改寫defaltAction='action'。php

2.添加獨立模塊

yii能夠在modules文件夾中添加自定義模塊,添加完成後在web.php中的$config中的'modules'=[id=..class=...]設置模塊的開關。html

模塊通常用於一些獨立的功能,像我站裏的admin模塊總體負責後臺邏輯。java

3.模型操做表設置

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

4.視圖層構成

yii的視圖層使用.php文件,並且其內部的實現也多采用yii內置小部件的形式,如<?= LinkPager::widget(['pagination'=>$pagination]) ?>來表示其分頁類。sql

並且,像input這樣的小部件,用ActiveForm類來展示,yii會對每一個自動加入ajax驗證,其通常的小部件都放在yii\widget\裏,咱們還能夠在此文件夾裏構建自定義的小部件類。數據庫

5.佈局模式

yii會默認開啓佈局模式,其佈局模板爲view中的layout中的main.php,咱們能夠在veder/yiisoft/yii2/web/controller.php基礎類中public $layout屬性修改模板文件的配置。數組

咱們還能夠設置關閉或指定特定的layout:

  • 控制器內控制 public $layout=false/'layout'
  • 控制器成員方法內控制 $this->layout=false/'layout'
  • 視圖中選擇佈局 $this->context->layout=false/'layout'

6.模型的基本設置

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標籤

7.引用JS/CSS文件

yii中的view也使用面向對象方式 ,因此引入CSS和JS文件要用特殊的方法。

  • 使用$this->registerJsFile('js.js')來引入js文件;
  • 使用$this->registerJsFile('js.js')來引入js文件;

8.分頁類的使用

//在模型中計算出總數量
$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='上一頁'])。

9.建立url

use yii\helpers\Url;
Url::to(['xxx/xxx']);
//或
Yii::$app->urlManager->createUrl('xxx.xxx')

  

10查詢構建器

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方法的解析。

11.自定義函數

yii裏面自定義函數能夠在vendor/yiisoft/yii2/helpers/文件夾裏,新建一個XXX.php文件,而後定義一個自定義類,再定義靜態方法YYY()。

使用時應用基命名空間,use yii\helpers\XXX,而後用類來引用基靜態方法XXX::YYY()

12.關聯模型

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表的對應屬性。

13.使用ActiveForm建立表單

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(); ?>

  

14.使用驗證碼

在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']
    ]) ?>

  

15.視圖中塊的使用

塊內容在$this->beginBlock(['id'=>xxx])和$this->endBlock()之間定義,在layout中使用$view->block[id]來引用。能夠在完成向模板中導入視圖數據。

也能夠定義$this->var=xxx;在layout中用$this->var來引用。

16.更新和刪除

更新
//查找到一條結果
$res=$this->find()->where()->one();
//對結果修改
$res->attr='xxx';
//執行更新操做
$res->update();
刪除
//刪除一條數據
$this->findOne($id)->delete();
//刪除全部符合條件的數據
$this->deleteAll([where]);

  

注意和竅門

1.URL模塊間跳轉

在模塊中用Url::to()方法建立URL時,會自動在前面添加模塊名,致使沒法跳轉到其餘模塊,咱們能夠在字符串前添加'//'符來返回根模塊,例如Url::to(['//index/index'])表示跳轉到初始地址。

2.初始化變量

想在控制器中每個操做前,初始化一個變量的話不要重寫__construct構造函數,由於它須要傳入各類變量。最好重寫beforeAction()函數,它會在執行每個action時都執行一下。

而且注意:方法的最後必定要添加return true語句。

3.在JS中使用YII的變量

若想在JS中使用YII的URL變量等,能夠使用html中的script標籤,將變量在第一次渲染視圖時預先解析出來,將下面代碼放在須要使用變量的地方以前。

<script type="text/javascript">
    var key="<?=Url::to(['xxx/xxx']) ?>"
</script>

  

而後在JS文件中正常使用。

4.全局常量的定義

咱們能夠在config文件夾中的params.php中定義全局常量。

而後在腳本中用Yii::$app->params['key']來引用。

5.yii模型屬性轉數組

YII用toArray()方法能夠將模型的屬性轉換爲數組進行輸出,可獨立使用,也能夠在查詢時用連續操做方式使用。

6.在使用controller渲染view頁面時,必定要在render前加echo或return 寫做echo/return $this->render('view',$data);

7.yii中的屬性,謹記!在ActiveForm中若是數據表中有了此字段,就不要再用public聲明一個屬性了,會致使attribute沒法賦值。。。。(血淚)。

相關文章
相關標籤/搜索