為什么我們要選擇yii框架

為什么我們要選擇yii框架

背景介紹:

SitePoint曾發表過一篇文章,著重強調了一些頂級的PHP框架,當時并列排名第四的是Yii(發音Yee)框架,最新版本為1.1.14。最近,Yii發布了2.0版本。

(推薦教程:yii

然而我們對它進行報導的時候,它還處在RC狀態,如今剛好完整新版本發布,我覺得是時候重新考慮一下選擇它的因素了。

選擇yii框架的七大理由:

1、安裝簡單

對Web開發者來說,時間就是金錢。沒有人會希望把自己的時間浪費在繁瑣的安裝和配置上。

Composer會來處理安裝程序。那如果你想要一個安裝過程的描述,Sitepoint最近發表了一篇關于此的文章,你可以參閱以下。而我比較喜歡傾向于使用基本的應用模板,哪怕我的站點上有一個單獨的前端和后端組件。相反,我選擇在我站點的后端部分使用一個模塊。(Yii模塊是迷你應用程序的最佳寫照,用來嵌入到你的主應用程序中。)

注:后面的很多例子中的目錄引用都使用到了簡單模板的目錄結構。

2、使用現代技術

Yii是一個純粹的OOP框架,它充分利用了PHP一些較先進的功能,包括延遲靜態綁定,SPL類和接口,以及匿名函數。

所有的類都被稱為命名空間,并允許你利用它們的PSR-4兼容的自動加載機。也就是說,包括Yii中的HTML輔助類,也是同樣如此簡單:

use?yiihelpersHtml;

Yii還可以定義別名,來幫助簡化你的命名空間。在上面的例子中,use聲明會加載一個類定義,目錄中的默認路徑為?/vendor/yiisoft/yii2/helpers。這個別名被定義在BaseYii類中第79行:

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

該框架本身是使用Composer安裝的,和它的擴展一樣。發布擴展的程序甚至和創建composer.json一樣簡單,在Github上托管你的代碼,并在Packagist上列出擴展。Yii還可以定義別名,來幫助簡化你的命名空間。在上面的例子中,use聲明會加載一個類定義,目錄中的默認路徑為?/vendor/yiisoft/yii2/helpers。這個別名被定義在BaseYii類中第79行:

3、高度的可擴展性

Yii就像一套西裝,看起來很大,但其實卻很容易調整來滿足你的需求。實際上,框架的每個組件都是可擴展的。舉一個簡單的例子就是,在你的觀點上增加了一個獨特的body?ID。(如果想知道你為什么想這樣做,可以查看此文章)

首先,我會在我的appcomponents中創建一個名為View.php的文件,并添加以下內容:

namespaceappcomponents; ? classView?extendsyiiwebView?{ ? ????public$bodyId; ? ????/*?Yii?allows?you?to?add?magic?getter?methods?by?prefacing?method?names?with?"get"?*/ ? ????publicfunction?getBodyIdAttribute()?{ ????????return($this->bodyId?!='')??'id="'?.?$this->bodyId?.'"'?:?''; ????} ? }

然后,在我的主布局文件(appviewslayoutsmain.php)中,我想在HTML的body標簽中補充以下內容:

BodyIdAttribute?>>

最后,我想在主配置文件中添加如下內容,讓Yii可以使用擴展的View類,而不是默認的:

return[ ????//?... ????'components'=>?[ ????????//?... ????????'view'=>?[ ????????????'class'=>?'appcomponentsView' ????????]?? ????] ];

4、鼓勵測試

Yii與Codeception是緊密相連的。Codeception是一個了不起的PHP測試框架,有助于簡化應用創建部件、功能測試和驗收測試的過程。因為你寫的所有應用均是自動化測試,對吧?

測試過程中,Codeception擴展會使配置應用程序變得更簡單。只需簡單提供/tests/_config.php文件,即可配置你的測試程序。例如:

return[ ????'components'=>?[ ????????'mail'=>?[ ????????????'useFileTransport'=>?true, ????????], ????????'urlManager'=>?[ ????????????'showScriptName'=>?true, ????????], ????????'db'=>?[ ????????????????'dsn'=>?'mysql:host=localhost;dbname=mysqldb_test', ????????], ????], ];

使用該配置,將會發生如下幾種情況:

1、?在功能測試和驗收測試期間發送的任何一封郵件,將會被寫入一個文件中,而不是被發送。使用該配置,將會發生如下這種情況:

2、?在你測試中的URLs將會采取這種格式:?index.php/controller/action?而不是這種:/controller/action

3、?測試將會使用你的測試數據庫,而不是你的產品數據庫。

存在Yii框架中的特殊模塊,同樣也存在Codeception內。它TestGuy類中增加了幾個方法,協助你在功能測試中的活動記錄(Yii中的ORM)。舉例來說,如果你想看看是否成功創建了一個用戶名為“testuser”的新user,你可以做以下幾點:

$I->amOnPage('register'); $I->fillField('username','testuser'); $I->fillField('password','qwerty'); $I->click('Register'); $I->seeRecord('appmodelsUser',array('name'=>?'testuser'));

5、簡化安全性

安全性是任何一個web應用的重要組成部分,幸運的是,Yii有一些很棒的功能可以幫你解決這方面的煩惱。
Yii帶有一個安全應用組件,其中公開的幾個方法可以幫助創建一個更安全的應用。其中一些比較有用的方法如下:

·generatePasswordHash:?從一個密碼和隨機因子生成一個安全的單向散列函數。這種方法為你編譯了一個隨機因子,然后通過PHP?crypt函數功能提供的字符串創建了一個單項散列函數。

·validatePassword:對于generatePasswordHash,這是一個伴侶功能,并且允許你檢查用戶提供的密碼是否與你存儲的散列函數相匹配。

·generateRandomKey:允許你創建一個任意長度的隨機字符串。

Yii會對所有不安全的HTTP請求方法(PUT,POST,DELETE)進行自動檢查,當你使用ActiveForm::begin()方法創建開放表單標簽時,它會生成并輸出一個token。通過編輯你的主配置文件可以禁止此功能,方法如下:

return[ ????'components'=>?[ ????????'request'=>?[ ????????????'enableCsrfValidation'=>?false, ????????] ];

為了防止XSS,Yii提供了一個叫HtmlPurifier的輔助類。這個類有一個名為process的靜態方法,并且會使用popular?filter?library過濾出同名的輸出庫。

Yii還包括備用類,用來進行用戶身份驗證和授權。授權分為兩種類型:ACF(訪問控制過濾器)和RBAC(基于角色的訪問控制)。

這兩種授權方法,較簡單的要數ACF了,它是通過在你的控制器中添加以下行為方法來實現的:

useyiifiltersAccessControl; ? classDefaultController?extendsController?{ ????//?... ????publicfunction?behaviors()?{ ????????return[ ????????????//?... ????????????'class'=>?AccessControl::className(), ????????????'only'=>?['create','login','view'], ????????????????'rules'=>?[ ????????????????[ ????????????????????'allow'=>?true, ????????????????????'actions'=>?['login','view'], ????????????????????'roles'=>?['?'] ????????????????], ????????????????[ ????????????????????'allow'=>?true, ????????????????????'actions'=>?['create'], ????????????????????'roles'=>?['@'] ????????????????] ????????????] ????????]; ????} ????//?... }

上面的代碼用于區分DefaultControllerto,允許guest用戶的訪問login?和view行為,而不是create?行為。(??是一個匿名用戶別名,@?指的是已認證用戶)。

RBAC是指那些用戶可以在整個應用中執行特定操作行為的更有效的方法。包括為用戶創建角色,定義app權限,然后使這些權限試用于相應的角色。如果你想創建一個Moderator的角色,并允許分配給該角色的所有用戶批準文章。

你也可以使用RBAC定義角色,它允許你在特定條件下,授權訪問應用的某些方面的自定義規則。例如,你可以創建一個規則,即允許用戶編輯自己的文章,而不是那些其他人創建的。

6、縮短開發時間

大多數項目都會涉及一定的重復任務,沒有人愿意浪費時間。而Yii提供的一些工具可以幫助你減少在這些任務中所花費的時間,將更多的時間用于定制讓客戶滿意的應用。

在這些工具中,其中有一個名為“Gii”的工具最為強大。Gii是一個基于web的基架代碼工具,可以讓你快速創建代碼模板:

  • ·模型

  • ·控制器

  • ·形式

  • ·模塊

  • ·擴展

  • ·CRUD控制器行為和視圖

Gii是高度可配置的。你可以將其設置為僅在特定的環境下加載。只需簡單編輯下你的web配置文件即可,方法如下:

if?(YII_ENV_DEV)?{ ????//?... ????$config['modules']['gii']?=?[ ????????'class'?=>?'yiigiiModule', ????????'allowedIPs'?=>?['127.0.0.1',?'::1'] ????] }

這樣就可以確保黨Yii的環境設置為開發的時候,Gii僅支持加載,并且它只通過本地主機訪問時才會加載。

現在,讓我們來看下模型生成器吧:

為什么我們要選擇yii框架

表名使用的是一個預輸入控件,來試圖猜測哪個表格與你的模型相關聯,并且所有領域都有一個翻轉工具,提示你如何填寫出來。在用Gii生成它之前,你可以預覽代碼,并且所有代碼模板是完全可以自定義的。

還有幾個命令行工具可以幫你為你的自動化測試創建數據庫遷移,信息翻譯(I18N:國際化)和數據庫fixtures?代碼模板。例如,你可以使用如下命令創建一個新的數據庫遷移文件:

yii?migrate/create?create_user_table

這將會在?{appdir}/migrations上創建一個新的遷移模板,看起來像這樣的:

<?php       use yiidbSchema;       class m140924_153425_create_user_table extends yiidbMigration     {         public function up()         {           }           public function down()         {             echo "m140924_153425_create_user_table cannot be reverted.n";               return false;         } }

所以我們可以說,我想添加在該表中再添加幾列。我只想添加以下內容到up?方法中:

public?function?up() { ????$this-&gt;createTable('user',?[ ????????'id'?=&gt;?Schema::TYPE_PK, ????????'username'?=&gt;?Schema::TYPE_STRING?.?'?NOT?NULL', ????????'password_hash'?=&gt;?Schema::?TYPE_STRING?.?'?NOT?NULL' ????],?null); }

然后,保證我可以反向遷移,下面我將添加down?方法:

public?function?down() { $this-&gt;dropTable('user'); }

創建該表將會簡單包括一個在運行在命令行的命令:

./yii?migrate

然后移除該表:

./yii?migrate/down

7、容易調整為最佳性能

大家都知道,一個網站很慢的話會很容易讓用戶產生不滿,所以Yii提供了幾種工具來幫助你從應用中“擠”出更多的速度。

所有Yii的緩存組件都是從yii/caching/Cache擴展來的,你可以選擇任何一種,你想同時使用一個通用API擴展的緩存系統。你甚至可以注冊多個高速緩存組件。Yii目前支持數據庫和文件緩存,APC,Memcache,?Redis,?WinCache,?XCache和Zend?數據緩存。

默認情況下,如果你正在使用Active?Record,然后Yii會運行一個額外的查詢,來確定表參與生成模型的架構。你可以通過編輯注配置文件設置應用程序,從而緩存這些架構:

return?[ ????//?... ????'components'?=&gt;?[ ????????//?... ????????'db'?=&gt;?[ ????????????//?... ????????????'enableSchemaCache'?=&gt;?true, ????????????'schemaCacheDuration'?=&gt;?3600, ????????????'schemaCache'?=&gt;?'cache', ????????], ????????'cache'?=&gt;?[ ????????????'class'?=&gt;?'yiicachingFileCache', ????????], ????], ];

最后,Yii有一個命令行工具,使前端資源極簡化更容易。只需運行以下命令來生成配置模板:

./yii?asset/template?config.php

然后,編輯該配置來指定工具,達到你想要的簡化效果(如關閉編譯器,?YUI?Compressor,或UglifyJS)。生成的配置模板,如下所示:

<?php     return [         &#39;jsCompressor&#39; =>?'java?-jar?compiler.jar?--js?{from}?--js_output_file?{to}', ????????'cssCompressor'?=&gt;?'java?-jar?yuicompressor.jar?--type?css?{from}?-o?{to}', ????????'bundles'?=&gt;?[ ????????????//?'yiiwebYiiAsset', ????????????//?'yiiwebJqueryAsset', ????????], ????????'targets'?=&gt;?[ ????????????'appconfigAllAsset'?=&gt;?[ ????????????????'basePath'?=&gt;?'path/to/web', ????????????????'baseUrl'?=&gt;?'', ????????????????'js'?=&gt;?'js/all-{hash}.js', ????????????????'css'?=&gt;?'css/all-{hash}.css', ????????????], ????????], ????????'assetManager'?=&gt;?[ ????????????'basePath'?=&gt;?__DIR__, ????????????'baseUrl'?=&gt;?'', ????????], ????];

接著,運行此控制臺命令來實現壓縮:

'components'?=&gt;?[ ????//?... ????'assetManager'?=&gt;?[ ????????'bundles'?=&gt;?require?'/app/assets_compressed.php' ????] ]

注意:你必須要手動下載和安裝這些外部工具。

結論:

像任何一個好的框架一樣,Yii能夠幫助你快速創建流行的web應用,并確保它們可以做的很好。通過做許多繁瑣的事情,它幫你你創建安全的和可測試的網站。你可以輕松的使用它提供的大部分功能,或者你也可以修改其中任何一個來適應你的需求。真心建議你在你的下一個web項目中考慮一下它!

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享