Yii 是一個高性能,基於組件的 PHP 框架,用於快速開發現代 Web 應用程序。名字 Yii (讀做 易
)在中文裏有「極致簡單與不斷演變」兩重含義,也可看做 Yes It Is! 的縮寫。javascript
Yii 是一個通用的 Web 編程框架,便可以用於開發各類用 PHP 構建的 Web 應用。由於基於組件的框架結構和設計精巧的緩存支持,它特別適合開發大型應用,如門戶網站、社區、內容管理系統(CMS)、電子商務項目和 RESTful Web 服務等。php
Yii 2.0 須要 PHP 5.4.0 或以上版本支持。css
學習Yii框架首先要知道它的應用結構java
composer.json Composer 配置文件, 描述包信息 web
config/ 包含應用配置及其它配置 編程
console.php 控制檯應用配置信息 json
web.php Web 應用配置信息 設計模式
commands/ 包含控制檯命令類 瀏覽器
controllers/ 包含控制器類 緩存
models/ 包含模型類
runtime/ 包含 Yii 在運行時生成的文件,例如日誌和緩存文件
vendor/ 包含已經安裝的 Composer 包,包括 Yii 框架自身 views/ 包含視圖文件
web/ Web 應用根目錄,包含 Web 入口文件
assets/ 包含 Yii 發佈的資源文件(javascript 和 css)
index.php 應用入口文件
yii Yii 控制檯命令執行腳本
簡單的實現helloworld
Yii 也是基於 MVC(Model-View-Controller)設計模式並基於該模式組織代碼。
應用操做
爲了 「Hello」,須要建立一個 say
操做,從請求中接收 message
參數並顯示給最終用戶。若是請求沒有提供 message
參數,操做將顯示默認參數 「Hello」。
操做必須聲明在控制器中。爲了簡單起見,你能夠直接在 SiteController
控制器裏聲明 say
操做。這個控制器是由文件controllers/SiteController.php
定義的。如下是一個操做的聲明:
<?php namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { public function actionSay($message = 'Hello') { return $this->render('say', ['message' => $message]); } }
在上述 SiteController
代碼中,say
操做被定義爲 actionSay
方法。Yii 使用 action
前綴區分普通方法和操做。action
前綴後面的名稱被映射爲操做的 ID。
涉及到給操做命名時,你應該理解 Yii 如何處理操做 ID。操做 ID 老是被以小寫處理,若是一個操做 ID 由多個單詞組成,單詞之間將由連字符鏈接(如 create-comment
)。操做 ID 映射爲方法名時移除了連字符,將每一個單詞首字母大寫,並加上 action
前綴。 例子:操做 IDcreate-comment
至關於方法名 actionCreateComment
。
上述代碼中的操做方法接受一個參數 $message
,它的默認值是 「Hello」
(就像你設置 PHP 中其它函數或方法的默認值同樣)。當應用接收到請求並肯定由 say
操做來響應請求時,應用將從請求的參數中尋找對應值傳入進來。換句話說,若是請求包含一個 message
參數,它的值是 「Goodybye」
, 操做方法中的 $message
變量也將被填充爲 「Goodbye」
。
在操做方法中,yii\web\Controller::render() 被用來渲染一個名爲 say
的視圖文件。 message
參數也被傳入視圖,這樣就能夠在裏面使用。操做方法會返回渲染結果。結果會被應用接收並顯示給最終用戶的瀏覽器(做爲整頁 HTML 的一部分)。
建立視圖
視圖是你用來生成響應內容的腳本。爲了說 「Hello」,你須要建立一個 say
視圖,以便顯示從操做方法中傳來的 message
參數。
<?php use yii\helpers\Html; ?> <?= Html::encode($message) ?>
say
視圖應該存爲 views/site/say.php
文件。當一個操做中調用了 yii\web\Controller::render() 方法時,它將會按 views/控制器 ID/視圖名.php
路徑加載 PHP 文件。
注意以上代碼,message
參數在輸出以前被 yii\helpers\Html::encode() 方法處理過。這頗有必要,當參數來自於最終用戶時,參數中可能隱含的惡意 JavaScript 代碼會致使跨站腳本(XSS)攻擊。
固然了,你大概會在 say
視圖裏放入更多內容。內容能夠由 HTML 標籤,純文本,甚至 PHP 語句組成。實際上 say
視圖就是一個由 yii\web\Controller::render() 執行的 PHP 腳本。視圖腳本輸出的內容將會做爲響應結果返回給應用。應用將依次輸出結果給最終用戶。
試運行
建立完操做和視圖後,你就能夠經過下面的 URL 訪問新頁面了:
http://hostname/index.php?r=site/say&message=Hello+World
Yii2.0實現註冊登陸
首先看SiteController.php
如下是必須引入的
use frontend\models\SiteLoginForm; use frontend\models\User; use frontend\models\SignupForm; public function actionSignup() { $model = new SignupForm(); if ($model->load(Yii::$app->request->post())) { if ($user = $model->signup()) { // $login = new SiteLoginForm(); if(Yii::$app->getUser()->login($user)) { return $this->goHome(); } else { var_dump($user); } } } return $this->render('signup', [ 'model' => $model, ]); } public function actionLogin() { if (!\Yii::$app->user->isGuest) { return $this->goHome(); } $model = new SiteLoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { return $this->render('login', [ 'model' => $model, ]); } }
frontend/models/User.php文件
namespace frontend\models; use Yii; use yii\web\IdentityInterface; class User extends \yii\db\ActiveRecord implements \yii\web\IdentityInterface { /** * @inheritdoc */ public static function tableName() { return 'shop_user'; } /** * @inheritdoc */ public function rules() { return [ [['username', 'pwd', 'create_time'], 'required'], [['create_time'], 'integer'], [['username'], 'string', 'max' => 20], [['pwd'], 'string', 'max' => 32] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID', 'username' => 'Username', 'pwd' => 'Pwd', 'create_time' => 'Create Time', ]; } /** * Generates password hash from password and sets it to the model * * @param string $password */ public function setPassword($password) { $this->pwd = md5($password); } /** * @inheritdoc */ public static function findIdentity($id) { return static::findOne($id); //return isset(self::$users[$id]) ? new static(self::$users[$id]) : null; } /** * @inheritdoc */ public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(['access_token' => $token]); /*foreach (self::$users as $user) { if ($user['accessToken'] === $token) { return new static($user); } } return null;*/ } /** * Finds user by username * * @param string $username * @return static|null */ public static function findByUsername($username) { $user = User::find() ->where(['username' => $username]) ->asArray() ->one(); if($user){ return new static($user); } return null; /*foreach (self::$users as $user) { if (strcasecmp($user['username'], $username) === 0) { return new static($user); } } return null;*/ } /** * @inheritdoc */ public function getId() { return $this->id; } /** * @inheritdoc */ public function getAuthKey() { return $this->authKey; } /** * @inheritdoc */ public function validateAuthKey($authKey) { return $this->authKey === $authKey; } /** * Validates password * * @param string $password password to validate * @return boolean if password provided is valid for current user */ public function validatePassword($password) { return $this->pwd === md5($password); } }
config/main.php代碼
'components' => [ 'user' => [ 'identityClass' => 'frontend\models\User', 'enableAutoLogin' => true, ], ],
SignupForm.php代碼
//注意這裏的規則由你本身定義有幾個地段哈 public function rules() { return [ ['username', 'filter', 'filter' => 'trim'], ['username', 'required','message' => '用戶名不能爲空'], ['username', 'unique', 'targetClass' => '\frontend\models\User', 'message' => '用戶名已存在'], ['username', 'string', 'min' => 2, 'max' => 255], ['password', 'required','message' => '密碼不能爲空'], ['password', 'string', 'min' => 6], ]; } //注意這個方法裏user表的字段 public function signup() { if ($this->validate()) { $user = new User(); $user->username = $this->username; $user->setPassword($this->password); $user->create_time = time(); if ($user->save()) { return $user; } } return null; }