composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-basic basic
composer global require "fxp/composer-asset-plugin:^1.2.0" composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application /path/to/php-bin/php /path/to/yii-application/init
詳情參考GitHub官網javascript
composer install
composer update
composer require [options] [--] [vendor/packages]...
Yii的數據庫讀取對象,在PDO之上,DAO後有了Query Builder和ARphp
$conn = Yii::$app->db;
Yii::$app->db->createCommand("SELECT * FROM `user`"); Yii::$app->db->createCommand("SELECT * FROM `user` WHERE uid=:uid",[":uid"=>1]); Yii::$app->db->createCommand("SELECT * FROM `user` WHERE uid=:uid")->addValue([":uid"=>1]);
Yii::$app->db->createCommand('INSERT INTO user (email, password) VALUES("test3@example.com", "test3");')->execute();
Yii::$app->db->createCommand()->insert('user', [ 'email' => 'test4@example.com', 'password' => 'changeme7', 'first_name' => 'Test' ])->execute();
Yii::$app->db->createCommand()->batchInsert('user', ['email', 'password', 'first_name'], [ ['james.franklin@example.com', 'changeme7', 'James'], ['linda.marks@example.com', 'changeme7', 'Linda'] ['roger.martin@example.com', 'changeme7'] ])->execute();
Yii::$app->db->createCommand()->update('user', ['updated_at' => time()], 'id = 2')->execute();
Yii::$app->db->createCommand()->delete('user', 'id = 3')->execute();
Yii::$app->db->createCommand("SELECT * FROM `user`")->queryAll();
Yii::$app->db->createCommand("SELECT * FROM `user` WHERE id = 1")->queryOne();
Yii::$app->db->createCommand("SELECT count(*) AS total FROM `user` WHERE id = 1")->queryScalar();
Yii::$app->db->createCommand("SELECT username FROM `user`")->queryColumn();
日誌功能css
Yii::trace($message,$category) //記錄一條消息去跟蹤一段代碼是怎樣運行的。這主要在開發的時候使用。
Yii::info($message,$category) //記錄一條消息來傳達一些有用的信息。
Yii::warning($message,$category) //記錄一個警告消息用來指示一些已經發生的意外。
Yii::error($message,$category) //記錄一個致命的錯誤,這個錯誤應該儘快被檢查。
數據驗證,最經常使用於模型的rules()函數html
["username",'required'] [["username","email"],'required'] [["username"],'required',"message"=>"{attribute}必須填寫"] [["username"],'required','requiredValue'=>"abei"] //用戶填寫的值必須等於requiredValue才能經過驗證。
["email",'email'] [["email","work_email"],'email']
['sex', 'boolean', 'trueValue' => true, 'falseValue' => false, 'strict' => true]; //能夠認爲置頂 true / false 值。
['verificationCode', 'captcha'];
['username', 'compare', 'compareAttribute' => 'province','message'=>'username和province必須同樣'] //錯誤信息將提示給username ['age', 'compare', 'compareValue' => 30, 'operator' => '>=','type' => 'number'];//compareValue:比較常量值 operator:比較操做符 type爲值類型,默認爲string,會一個每一個字符對比,若爲number則直接判斷數值 //operator 待選值==、===、!=、!==、>、>=、<、<=
["birth","date","format"=>"Y-m-d"]
['age','default','value'=>null] //當age爲空的時候設置爲null ['country','default','value'=>'USA'] //當 country爲空時設置爲USA /* 若是from爲空,則=今天+3天,若是to爲空,則=今天+6天 */ [['from','to'],'default','value'=>function($model,$attribute){ return date('Y-m-d', strtotime($attribute === 'to' ? '+3 days' : '+6 days')); }]
['v','double'] //判斷v是否爲數字 ['v','double','max'=>90,'min'=>1]//判斷v是否爲數字且大於等於一、小於等於90
["categoryIds","each","rule"=>['integer']]
/* 所謂對存在的檢查實質爲where的與操做,必須同時瞞住的記錄存在方可。兄弟們能夠研究下,exist是對sql語句EXISTS的應用*/ ["username","exist"] //username輸入的值已經存在 ["username","exist","targetAttribute"=>"province"] //username的輸入值必須在province列存在 ["username","exist",'targetAttribute' => ['username', 'province']] //username的輸入值必須在username和province中存在 [["username","province"],"exist",'targetAttribute' => ['username', 'province']] //username和province的輸入值必須在username和province中存在
/* maxFiles表明一次最多傳幾個,mimeTypes表明上傳文件類型 */ ['primaryImage', 'file', 'extensions' => ['png', 'jpg', 'gif'],'mimeTypes'=>["image/*"], 'maxSize' => 1024*1024,'minSize'=>100*1024,'maxFiles'=>6,'checkExtensionByMimeType'=>true],
[['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true], ['phone', 'filter', 'filter' => function ($value) { //normalize phone input here return $value; }],
/* 上傳png/jpg格式,最大寬度不能超過1000px,最小寬度不能低於100px,最大高度不能高於1000px。最小高度不能低於100px */ ['primaryImage', 'image', 'extensions' => 'png, jpg','minWidth' => 100, 'maxWidth' => 1000,'minHeight' => 100, 'maxHeight' => 1000]
["ip_addess","ip"]
["level","in","range"=>[1,2,3]]
["age",'integer']; ["age","integer","max"=>90,"min"=>1]
["username","match","pattern"=>"/^[a-z]\w*$/i"]
["description","safe"]
["username","string","length"=>[4,24]]; ["username","string","min"=>4]; ["username","string","max"=>32]; ["username","string","encoding"=>"UTF-8"];
["username","unique"] ["username","unique","targetAttribute"=>"province"]
["website","url"] ["website","url","validSchemes"=>["http","https"]]
Session被封裝成一個應用組件,直接經過Yii::$app->session來訪問;Cookie經過Request和Response來操做。前端
$session = Yii::$app->session;java
Yii::$app->session->isActive
Yii::$app->session->open()
Yii::$app->session->close();
Yii::$app->session->destroy();
/* 如下三種方法效果等同 */ $language = $session->get('language'); $language = $session['language']; $language = isset($_SESSION['language']) ? $_SESSION['language'] : null;
/* 如下三種方法效果等同 */ $session->set('language', 'en-US'); $session['language'] = 'en-US'; $_SESSION['language'] = 'en-US';
/* 下面三種方法效果等同 */ $session->remove('language'); unset($session['language']); unset($_SESSION['language']);
/* 如下三種方法效果一致 */ if ($session->has('language')) ... if (isset($session['language'])) ... if (isset($_SESSION['language'])) ...
$cookies = Yii::$app->request->cookies;
$cookies = Yii::$app->response->cookies;
$language = $cookies->getValue('language', 'en'); //若是獲取language失敗,則返回"en"代替
if (($cookie = $cookies->get('language')) !== null) { $language = $cookie->value; }
if (isset($cookies['language'])) { $language = $cookies['language']->value; }
if ($cookies->has('language')) ... if (isset($cookies['language'])) ...
$cookies->add(new \yii\web\Cookie([ 'name' => 'language', 'value' => 'zh-CN', ]));
$cookies->remove('language'); unset($cookies['language']);
Request 被配置爲一個應用組件,咱們能夠經過Yii::$app->request訪問它。git
Yii::$app->request->getAbsoluteUrl();
Yii::$app->request->getHostInfo();
Yii::$app->request->getQueryString()
Yii::$app->request->getServerPort();
Yii::$app->request-> getAcceptableContentTypes (); //Header Accept
Yii::$app->request-> getAcceptableLanguages(); //Header Accept-Language
Yii::$app->request->get(); Yii::$app->request->get("id"); Yii::$app->request->POST(); Yii::$app->request->POST("username");
Yii::$app->request->isAjax //判斷是否爲ajax請求 Yii::$app->request->isConsoleRequest //判斷是否爲控制發起的請求 Yii::$app->request->isDelete //判斷是否爲DELETE請求 Yii::$app->request->isGet //判斷是否爲GET請求 Yii::$app->request->isPost //判斷是否爲POST請求 Yii::$app->request->isPjax //判斷是否爲isPjax請求
Yii::$app->request->getUserIP();
和Request同樣,Response被封裝成Yii的一個組件,你能夠經過Yii::$app->response輕鬆的訪問它。github
Yii::$app->response->statusCode = 200;
yii\web\BadRequestHttpException: status code 400. yii\web\ConflictHttpException: status code 409. yii\web\ForbiddenHttpException: status code 403. yii\web\GoneHttpException: status code 410. yii\web\MethodNotAllowedHttpException: status code 405. yii\web\NotAcceptableHttpException: status code 406. yii\web\NotFoundHttpException: status code 404. yii\web\ServerErrorHttpException: status code 500. yii\web\TooManyRequestsHttpException: status code 429. yii\web\UnauthorizedHttpException: status code 401. yii\web\UnsupportedMediaTypeHttpException: status code 415.
throw new \yii\web\HttpException(402); //若是系統沒有,能夠經過HttpException本身寫狀態碼 throw new \yii\web\HttpException(402,"message");
$headers = Yii::$app->response->headers;
$headers->add('Pragma', 'no-cache');
$headers->set('Pragma', 'no-cache');
$values = $headers->remove('Pragma');
Yii::$app->response->content = 'hello world!';
重點!列出最經常使用的ActiveForm方法。web
經過Html類的一些靜態方法生成Html標籤。ajax
Html::a('連接的文本', $url);
Html::a('連接文本', Url::to(['/site/index'], true)); Html::a('連接文本', Yii::$app->urlManager->createUrl(['/site/index']));
Html::img("/images/logo.png",['class'=>'img']);
Html::button("按鈕文本",['class'=>'button-action']);
Html::mailto("阿北",'abei@nai8.me',$options);
$list = ['china','usa']; Html::ol($list);
$list = ['china','usa','japan']; Html::ul($list);
Html::script("alert('hello world');")
Html::style("color:#F60"); Html::style(".list {background:#FFF;}");
Html::cssFile("http://baidu.com/style.css",[]);
Html::jsFile($url,[]);
Html::encode($html);
Html::decode($string);
定義和使用
Yii::setAlias('@baidu', 'http://www.baidu.com');
Yii::getAlias($name);
Yii::getAlias('@yii')
Yii::getAlias('@app')
Yii::getAlias("@vendor")
Yii::getAlias("@bower");
Yii::getAlias("@npm");
Yii::getAlias("@runtime");
Yii::getAlias("@webroot");
Yii::getAlias("@web");
Yii::getAlias("@common");
Yii::getAlias("@frontend");
Yii::getAlias("@backend");
Yii::getAlias("@console");
主要解決DAO在查詢語句上的繁瑣問題,無需輸入原生SQL語句就能夠完成數據庫檢索。
$query = (new \yii\db\Query()); //yii2使用Query對象來採集SQL的各個部分,而後由Query Builder組成SQL語句後由DAO發給數據庫得到請求。
$query->select("id,username"); //字符串形式 $query->select(['id','username']); //數組形式 $query->select(["userId"=>"id","fName"=>"user.frist_name"]); //起別名 $query->select(["full_name"=>"CONCAT(id,'-',username)"]); //支持MYSQL函數
$query->from("user"); //字符串形式 $query->from(["u"=>"user"]); //數據表別名
$query->select("username")->distinct()->from("user"); //distinct
/* 傳遞字符串 */ $query->where("id = 1"); $query->where("id = :id")->addParams([":id"=>1]); $query->where("id = :id",[":id"=>1]); /* 傳遞數組 */ $query->where(["username"=>"abei","age"=>[20,19,26]])->from("user"); //select * from user where username="abei" AND age in (20,19,26) /* 操做符 */ $query->where([">","id",10]); //id > 10 $query->where(["<","id",10]); //id < 10 $query->where(["<>","id",10]); //id <> 10 $query->where(["in","id",[10,12]]); //id in (10,20) $query->where(["not in","id",[10,12]]); //id not in (10,20) $query->where(["and","id=1","id=2"]); id=1 AND id=2 $query->where(['or', ['type' => [7, 8, 9]], ['id' => [1, 2, 3]]]); //(type IN (7, 8, 9) OR (id IN (1, 2, 3))) $query->where(["between", 'id', 1, 10]); //id between 1 AND 10 $query->where(["not",["id"=>5]]); //not (id=5) $query->where(["not between","id",1,10]); //id not between 1 AND 10 $query->where(["like","username","abei"]); //username like "%abei%" $query->where([['like', 'username', ['abei', 'liuhuan']]]); //username like "%abei%" AND username like "%liuhuan%" $query->where(['like', 'username', '%abei', false]); //username like "%abei" $query->where(["or like", 'username', ['abei', 'liuhuan']]); //username like "%abei%" OR username like "%liuhuan%",只做用於範圍爲數組的形式 $query->where(["not like",xxxxx]); //與like用法一致 $query->where(["or not like",xxx]) //與not like用法一致
/* EXISTS用於檢查子查詢是否至少會返回一行數據,該子查詢實際上並不返回任何數據,而是返回值True或False */ $query->where(['exists', (new Query())->select('id')->from('user')->where(['id' => 1])]);
$query->orderBy("id DESC"); $query->orderBy(["id"=>SORT_DESC]); $query->orderBy(["id"=>SORT_DESC,'create_time'=>SORT_ASC]);
$query->groupBy(["username"]); $query->groupBy(["id"])->having([">",'id',20]);
$query->createCommand()->sql;
$query->all(); //二位數組
$query->one();
(new \yii\db\Query)->from('user')->exists();
$query->count();
$query->scalar();
$query->column(); //一位數組
$query = new \yii\db\Query; $query->from("user"); $query->select(["fname"=>"username"]); $query->where([">",'id',10]); $query->all();
幾個經常使用也好用的文件幫助方法
// 遍歷一個文件夾下文件&子文件夾 FileHelper::findFiles('/path/to/search/'); FileHelper::findFiles('.', ['only' => ['*.php', '*.txt']]); // 只返回php和txt文件 FileHelper::findFiles('.', ['except' => ['*.php', '*.txt']]); // 排除php和txt文件 // 得到指定文件的MIME類型 FileHelper::getMimeType('/path/to/img.jpeg'); // 複製文件夾 FileHelper::copyDirectory($src, $dst, $options = []) // 刪除一個目錄及內容 FileHelper::removeDirectory($dir, $options = []) // 生成一個文件夾(同時設置權限) FileHelper::createDirectory($path, $mode = 0775, $recursive = true)