自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

選擇 Yii 2 框架的 7 個(gè)理由

開發(fā) 前端 后端
去年,SitePoint網(wǎng)站發(fā)布了一篇文章重點(diǎn)介紹了一些頂尖的PHP開發(fā)框架。 排名第四的是Yii(發(fā)音同Yee)框架。 那時(shí)Yii框架最新的版本是1.1.14。最近,Yii 2.0版發(fā)布了,你可以在產(chǎn)品中使用2.0版本。

去年,SitePoint網(wǎng)站發(fā)布了一篇文章重點(diǎn)介紹了一些頂尖的PHP開發(fā)框架。 排名第四的是Yii(發(fā)音同Yee)框架。 那時(shí)Yii框架最新的版本是1.1.14。最近,Yii 2.0版發(fā)布了,你可以在產(chǎn)品中使用2.0版本。

當(dāng) Yii框架仍處于 RC(候選版)階段時(shí),我們 對(duì)它進(jìn)行過報(bào)道,那時(shí)它剛剛?cè)孢_(dá)到候選版本階段,(現(xiàn)在它已經(jīng)發(fā)布了正式版本)我們感覺是時(shí)候再次討論這個(gè)話題:選擇 Yii框架的原因。

1. 易于安裝

對(duì)于web開發(fā)人員來(lái)說(shuō),時(shí)間就是金錢,沒有人愿意把寶貴的時(shí)間花在一個(gè)復(fù)雜的安裝和配置過程。

安裝處理使用Composer。如果你想要描述安裝的過程,Sitepoint最近發(fā)表了一篇很棒的文章,在這兒。我傾向于使用基本的應(yīng)用程序模板,即使我的網(wǎng)站有一個(gè)單獨(dú)的前端和后端組件。相反,我選擇使用一個(gè)模塊給我的網(wǎng)站的后臺(tái)部分。(Yii模塊是最好的描述,小應(yīng)用駐留在主應(yīng)用程序里面)。

注意:許多目錄的引用在后面的示例中,從簡(jiǎn)單的模板去使用目錄的結(jié)構(gòu)。

2. 利用現(xiàn)代技術(shù)

Yii是一種純粹的面向?qū)ο罂蚣?,并且利用PHP的一些更高級(jí)的功能,包括延遲靜態(tài)綁定,SPL類和接口,和匿名函數(shù)。

所有的類名稱空間,它允許你利用PSR-4兼容的自動(dòng)裝載器。這意味著包括Yii 的 HTML的幫助類一樣的簡(jiǎn)單:

 
  1. use yii\helpers\Html; 

Yii 也允許你定義別名來(lái)幫助簡(jiǎn)化你的命名空間。 在上面的示例中,  use 語(yǔ)句將加載一個(gè)類定義,默認(rèn)放的目錄 /vendor/yiisoft/yii2/helpers.  這個(gè)別名在BaseYii 類在第79行中定義: 

  1. public static $aliases = ['@yii' => __DIR__]; 

框架本身的安裝使用Composer,是其擴(kuò)展。 甚至出版的過程擴(kuò)展一樣容易創(chuàng)建自己的 composer.json,并在Github托管代碼,列出您的擴(kuò)展在Packagist。

3. 高度可擴(kuò)展性

Yii 看起來(lái)就像一件樣式很棒的西裝,但也非常容易根據(jù)你的需求來(lái)進(jìn)行定制. 實(shí)際上框架的每一個(gè)組件都是可以擴(kuò)展的。一個(gè)簡(jiǎn)單的示例就是添加一個(gè)唯一的主體ID到你的視圖上。 (你如果對(duì)自己為什么可能會(huì)想要這樣做感興趣的話,可以看看這篇 文章).

首先,我會(huì)在我的 app\components 目錄相面創(chuàng)建一個(gè)名為 View.php 的文件, 并加入如下代碼:

  1. namespace app\components; 
  2.   
  3. class View extends yii\web\View { 
  4.   
  5.     public $bodyId
  6.   
  7.     /* Yii allows you to add magic getter methods by prefacing method names with "get" */ 
  8.   
  9.     public function getBodyIdAttribute() { 
  10.         return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : ''
  11.     } 
  12.   

然后,在我的主布局文件 (app\views\layouts\main.php) 中,我會(huì)將如下代碼添加到我的HTML中body標(biāo)簽的里面:

  1. <body <?=$this->BodyIdAttribute?>> 

而最后,我會(huì)加下列的代碼添加到我的主配置文件中,以便讓Yii知道如何去使用我擴(kuò)展的視圖類,而不是它自己默認(rèn)的那個(gè)類:

  1. return [ 
  2.     // ... 
  3.     'components' => [ 
  4.         // ... 
  5.         'view' => [ 
  6.             'class' => 'app\components\View' 
  7.         ]    
  8.     ] 
  9. ]; 

4. 鼓勵(lì)測(cè)試

Yii 框架和Codeception框架緊密地集成在一起。 Codeception 是一個(gè)優(yōu)秀的PHP測(cè)試框架,它幫助簡(jiǎn)化創(chuàng)建單元測(cè)試、功能驗(yàn)收測(cè)試的流程。 條件是你在為所有的應(yīng)用程序編寫自動(dòng)化的測(cè)試用例,對(duì)吧?

Codeception 擴(kuò)展使得在測(cè)試時(shí)配置應(yīng)用程序變得簡(jiǎn)單。 測(cè)試應(yīng)用程序,只需編輯一個(gè)已存在的文件/tests/_config.php。例如:

  1. return [ 
  2.     'components' => [ 
  3.         'mail' => [ 
  4.             'useFileTransport' => true, 
  5.         ], 
  6.         'urlManager' => [ 
  7.             'showScriptName' => true, 
  8.         ], 
  9.         'db' => [ 
  10.                 'dsn' => 'mysql:host=localhost;dbname=mysqldb_test'
  11.         ], 
  12.     ], 
  13. ]; 

使用上面的配置,需要注意下面一些事項(xiàng):

  1. 在功能驗(yàn)收測(cè)試期間,所有發(fā)送的郵件都會(huì)被寫入一個(gè)文件中保存,而非真正地發(fā)送出去。

  2. 測(cè)試時(shí)URL的格式是index.php/controller/action,而非/controller/action。

  3. 測(cè)試時(shí)需要使用測(cè)試數(shù)據(jù)庫(kù),而非生產(chǎn)數(shù)據(jù)庫(kù)。

Codeception 內(nèi)部存在一個(gè)特殊的模塊,專門用于Yii 框架測(cè)試。 它在TestGuy類里添加了一些方法,保證功能測(cè)試時(shí) Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注冊(cè)表單是否成功地創(chuàng)建了一個(gè)用戶名為testuser的User對(duì)象,你可以這樣做:

  1. $I->amOnPage('register'); 
  2. $I->fillField('username''testuser'); 
  3. $I->fillField('password''qwerty'); 
  4. $I->click('Register'); 
  5. $I->seeRecord('app\models\User'array('name' => 'testuser')); 

5. 簡(jiǎn)化的安全方案

安全性是任何web應(yīng)用的重要組成部分,幸運(yùn)的是Yii有許多很棒的特性能幫你減輕負(fù)擔(dān).

Yii 帶來(lái)了一個(gè) 安全性 應(yīng)用程序組件,它暴露了一些可以幫助可以用來(lái)創(chuàng)建一個(gè)更加安全的應(yīng)用程序的方法. 其中一些相對(duì)而言更加有用的方法有:

  • generatePasswordHash: 從一個(gè)密碼和一個(gè)隨機(jī)的鹽值生成一個(gè)安全的哈希值. 這個(gè)方法會(huì)為你創(chuàng)建一個(gè)隨機(jī)的鹽值,然后使用PHP的 crypt 函數(shù)來(lái)根據(jù)所提供的字符串創(chuàng)建一個(gè)哈希值.

  • validatePassword: 這是一個(gè)可以同 generatePasswordHash 搭配使用的方法, 并可以讓你檢查用戶提供的密碼是否同你存儲(chǔ)的哈希值匹配.

  • generateRandomKey: 可逆讓你創(chuàng)建一個(gè)任何長(zhǎng)度的隨機(jī)字符串

Yii 會(huì)自動(dòng)對(duì)所有非安全 HTTP 請(qǐng)求方法 (PUT, POST, DELETE) 的可用CSRF令牌進(jìn)行檢查, 并將在你使用 ActiveForm::begin() 方法創(chuàng)建你的開發(fā)表單標(biāo)簽時(shí)生成并輸出一個(gè)令牌值. 這個(gè)特性可以通過編輯你的主配置文件,包含下面的代碼來(lái)禁用:

  1. return [ 
  2.     'components' => [ 
  3.         'request' => [ 
  4.             'enableCsrfValidation' => false, 
  5.         ] 
  6. ]; 

為了堤防跨站腳本XSS的攻擊,Yii提供了另外一個(gè)叫做 HtmlPurifier 的輔助類. 這個(gè)類有一個(gè)名為 process 的靜態(tài)方法, 而它將會(huì)使用同名的 流行過濾器庫(kù) 來(lái)過濾你的輸出.

Yii 也包含了隨時(shí)就緒的用于用戶認(rèn)證和授權(quán)的類. 授權(quán)被分成了兩個(gè)類型: ACF (訪問控制過濾器) 和RBAC (基于角色訪問的控制).

兩者中更加的是 ACF, 其實(shí)現(xiàn)是通過在你控制器的添加下列的 行為 方法:

  1. use yii\filters\AccessControl; 
  2.   
  3. class DefaultController extends Controller { 
  4.     // ... 
  5.     public function behaviors() { 
  6.         return [ 
  7.             // ... 
  8.             'class' => AccessControl::className(), 
  9.             'only' => ['create''login''view'], 
  10.                 'rules' => [ 
  11.                 [ 
  12.                     'allow' => true, 
  13.                     'actions' => ['login''view'], 
  14.                     'roles' => ['?'
  15.                 ], 
  16.                 [ 
  17.                     'allow' => true, 
  18.                     'actions' => ['create'], 
  19.                     'roles' => ['@'
  20.                 ] 
  21.             ] 
  22.         ]; 
  23.     } 
  24.     // ... 

上面的代碼會(huì)告訴 DefaultControllerto 讓訪客用戶訪問login和view的action, 而不是create這個(gè)action. (問號(hào) ? 是匿名用戶的別名, 而 @ 表示的是已經(jīng)被授權(quán)的用戶).

RBAC 是一個(gè)可以在應(yīng)用程序中指定那些用戶可以執(zhí)行特定的動(dòng)作的強(qiáng)大方法. 它涉及為你的用戶創(chuàng)建角色,為你的app定義權(quán)限,并然后為他們預(yù)期的角色使用這些角色. 如果你想要?jiǎng)?chuàng)建一個(gè)審核員(Moderator)的角色就可以使用這個(gè)方法, 并可以讓所有分配到這個(gè)角色的用戶可以對(duì)文章進(jìn)行審核.

你也還可以使用 RBAC 定義規(guī)則, 它可以讓你在特定條件下針對(duì)你應(yīng)用程序的某些方面進(jìn)行授權(quán). 例如,你可以創(chuàng)建一個(gè)規(guī)則讓用戶可以編輯他們自己的文章, 而不能修改由其他人創(chuàng)建的文章.

6. 縮短開發(fā)時(shí)間

大多數(shù)的項(xiàng)目都包含了重復(fù)的任務(wù),沒有人想把時(shí)間浪費(fèi)在這些重復(fù)工作上面。Yii 提供了一些工具來(lái)幫助你在這些任務(wù)上花費(fèi)更少的時(shí)間,把大多數(shù)時(shí)間都用在定制應(yīng)用來(lái)滿足你客戶的需求上。

其中最強(qiáng)大的一個(gè)工具就是“Gii”。Gii是一個(gè)基于web腳手架代碼工具,它可以讓你快速的創(chuàng)建一個(gè)代碼模板如下所示:

  • Models

  • Controllers

  • Forms

  • Modules

  • Extensions

  • CRUD controller actions and views

Gii是高度可配置的。你可以設(shè)置它只從一個(gè)特定的環(huán)境加載。簡(jiǎn)單的編輯web配置文件如下:

  1. if (YII_ENV_DEV) { 
  2.     // ... 
  3.     $config['modules']['gii'] = [ 
  4.         'class' => 'yii\gii\Module'
  5.         'allowedIPs' => ['127.0.0.1''::1'
  6.     ] 

這確保了Gii只有設(shè)置了Yii的環(huán)境變量為(development)開發(fā)環(huán)境時(shí)才加載,并且只在通過本地環(huán)境訪問的時(shí)候加載。

現(xiàn)在,讓我們來(lái)看看模型的生成:

表格名稱使用了一個(gè)響應(yīng)敲擊就會(huì)顯示的小窗口來(lái)嘗試給出對(duì)你的模型將會(huì)關(guān)聯(lián)的表格的猜測(cè), 并且所有的域值輸入框都會(huì)有一個(gè)翻轉(zhuǎn)效果顯示出來(lái)的提示,提醒你如何完成對(duì)它們的填寫. 你可以在讓Gii輸出代碼之前先進(jìn)行一下預(yù)覽, 而所有的代碼模板都是完全可定制的.

也有幾個(gè)可以用于數(shù)據(jù)庫(kù)遷移、消息翻譯(I18N)以及生成用于自動(dòng)化測(cè)試數(shù)據(jù)庫(kù)道具的命令行輔助工具. 例如,你可以使用如下代碼創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)遷移 文件:

  1. yii migrate/create create_user_table 

這將會(huì)在 {應(yīng)用目錄}/migrations 創(chuàng)建一個(gè)新的看起來(lái)像下面這樣的遷移模板:

  1. <?php 
  2.   
  3.     use yii\db\Schema; 
  4.   
  5.     class m140924_153425_create_user_table extends \yii\db\Migration 
  6.     { 
  7.         public function up() 
  8.         { 
  9.   
  10.         } 
  11.   
  12.         public function down() 
  13.         { 
  14.             echo "m140924_153425_create_user_table cannot be reverted.\n"
  15.   
  16.             return false; 
  17.         } 

如此假如說(shuō)我想要想這個(gè)表添加一些列. 我就只要簡(jiǎn)單的將下面的代碼添加到 up 方法中:

  1. public function up() 
  2.     $this->createTable('user', [ 
  3.         'id' => Schema::TYPE_PK, 
  4.         'username' => Schema::TYPE_STRING . ' NOT NULL'
  5.         'password_hash' => Schema:: TYPE_STRING . ' NOT NULL' 
  6.     ], null); 

然后為了確保我可以進(jìn)行遷移的逆向操作,我就會(huì)編輯down方法:

  1. public function down() 
  2.     $this->dropTable('user'); 

創(chuàng)建表格可能就是簡(jiǎn)單的設(shè)計(jì)到在命令行上運(yùn)行一個(gè)命令:

  1. ./yii migrate 

而刪除表格是下面的這個(gè)命令:

  1. ./yii migrate/down 

7. 很容易通過調(diào)整獲得更好的性能

所有人都知道一個(gè)慢吞吞的網(wǎng)站會(huì)造就許多心懷不滿的用戶, 因此Yii為你提供了一些工具來(lái)幫助你讓應(yīng)用程序獲得更快的速度.

所有的Yii緩存組件都擴(kuò)展自 yii/caching/Cache, 它能讓你在使用一個(gè)公共API的同時(shí)選擇任意某一個(gè)緩存系統(tǒng). 你甚至可以同時(shí)注冊(cè)多個(gè)高速緩存組件. Yii 當(dāng)前支持?jǐn)?shù)據(jù)庫(kù)和文件系統(tǒng)緩存, 還有 APC, Memcache, Redis, WinCache, XCache 以及 Zend Data Cache.

默認(rèn)情況下,如果你是使用的 Active Record ,那么 Yii 會(huì)額外運(yùn)行一個(gè)查詢來(lái)確定生成你模型的表的結(jié)構(gòu). 你可以通過像下面這樣編輯你的主配置文件,對(duì)你的應(yīng)用程序進(jìn)行設(shè)置,以緩存這些表結(jié)構(gòu):

  1. return [ 
  2.     // ... 
  3.     'components' => [ 
  4.         // ... 
  5.         'db' => [ 
  6.             // ... 
  7.             'enableSchemaCache' => true, 
  8.             'schemaCacheDuration' => 3600, 
  9.             'schemaCache' => 'cache'
  10.         ], 
  11.         'cache' => [ 
  12.             'class' => 'yii\caching\FileCache'
  13.         ], 
  14.     ], 
  15. ]; 

最后,Yii有一個(gè)命令行工具可以便于對(duì)前端字段進(jìn)行縮小化. 簡(jiǎn)單地運(yùn)行下面的命令就可以生成一個(gè)配置模板:

  1. ./yii asset/template config.php 

然后編輯該配置,指定你想要用那些工具來(lái)執(zhí)行縮小化操作(比如. Closure Compiler, YUI Compressor, 或者 UglifyJS). 生成的配置模板如下所示:

  1. <?php 
  2.     return [ 
  3.         'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}'
  4.         'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}'
  5.         'bundles' => [ 
  6.             // 'yii\web\YiiAsset', 
  7.             // 'yii\web\JqueryAsset', 
  8.         ], 
  9.         'targets' => [ 
  10.             'app\config\AllAsset' => [ 
  11.                 'basePath' => 'path/to/web'
  12.                 'baseUrl' => ''
  13.                 'js' => 'js/all-{hash}.js'
  14.                 'css' => 'css/all-{hash}.css'
  15.             ], 
  16.         ], 
  17.         'assetManager' => [ 
  18.             'basePath' => __DIR__, 
  19.             'baseUrl' => ''
  20.         ], 
  21.     ]; 

接下來(lái),運(yùn)行這個(gè)控制臺(tái)命令以執(zhí)行壓縮.

  1. yii asset config.php /app/assets_compressed.php 

最后,修改你的web應(yīng)用程序配置文件,使用壓縮后的資源.

  1. 'components' => [ 
  2.     // ... 
  3.     'assetManager' => [ 
  4.         'bundles' => require '/app/assets_compressed.php' 
  5.     ] 

注意: 你需要手動(dòng)下載并安裝這些額外的工具.

總結(jié)

跟任何好的框架類似,Yii可以幫助你快速的創(chuàng)建現(xiàn)代的web應(yīng)用程序,并確保它們表現(xiàn)的良好. 它能通過為你代勞一些體力活,來(lái)促使你創(chuàng)建安全并且可測(cè)試的網(wǎng)站. 你可以簡(jiǎn)單的使用到他們所提供的大多數(shù)特性,或者你也可以修改它們以適應(yīng)你自己的需要. 我真心鼓勵(lì)你在你的下一個(gè)web項(xiàng)目中能試上它一試!

你嘗試過 Yii 2 么? 你將會(huì)嘗試它么? 讓我們了解下吧!

責(zé)任編輯:張偉 來(lái)源: oschina
相關(guān)推薦

2009-04-30 08:58:39

微軟操作系統(tǒng)Windows 7

2010-02-12 09:26:28

XP系統(tǒng)更新

2009-08-08 08:47:07

Windows 7新特性

2023-04-20 15:53:05

綜合布線光纖

2010-12-24 14:32:17

迪普

2011-12-14 14:32:17

郵箱

2022-08-11 11:43:01

CISO首席信息安全官

2022-08-26 12:10:49

MSS服務(wù)網(wǎng)絡(luò)安全

2009-11-29 17:15:53

Linux操作系統(tǒng)

2020-04-27 21:31:28

智慧城市物聯(lián)網(wǎng)IOT

2022-07-13 13:33:39

企業(yè)開源開發(fā)

2015-04-07 13:48:53

框架編程語(yǔ)言7種理由

2011-08-01 17:16:06

WindowsEC7嵌入式

2021-02-26 10:39:10

物聯(lián)網(wǎng)智能物聯(lián)網(wǎng)IoT

2012-03-08 09:17:14

程序員

2010-03-03 13:40:14

Linux認(rèn)證之路

2010-06-03 14:32:26

2017-05-04 22:30:19

Python學(xué)習(xí)理由

2020-03-07 15:25:38

TypeScript代碼開發(fā)

2021-02-28 13:28:25

Linux藝術(shù)設(shè)計(jì)操作系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)