學習yii2.0框架閱讀代碼(一)

Yii 是什麼

Yii 是一個高性能,基於組件的 PHP 框架,用於快速開發現代 Web 應用程序。名字 Yii (讀做 )在中文裏有「極致簡單與不斷演變」兩重含義,也可看做 Yes It Is! 的縮寫。javascript

Yii 最適合作什麼?

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;
}
相關文章
相關標籤/搜索