列舉PHP的Yii 2框架的開發(fā)優(yōu)勢
當(dāng) Yii框架仍處于 RC(候選版)階段時,我們 對它進行過報道,那時它剛剛?cè)孢_到候選版本階段,(現(xiàn)在它已經(jīng)發(fā)布了正式版本)我們感覺是時候再次討論這個話題:選擇 Yii框架的原因。
1. 易于安裝
對于web開發(fā)人員來說,時間就是金錢,沒有人愿意把寶貴的時間花在一個復(fù)雜的安裝和配置過程。
安裝處理使用Composer。如果你想要描述安裝的過程,Sitepoint最近發(fā)表了一篇很棒的文章,在這兒。我傾向于使用基本的應(yīng)用程序模板,即使我的網(wǎng)站有一個單獨的前端和后端組件。相反,我選擇使用一個模塊給我的網(wǎng)站的后臺部分。(Yii模塊是最好的描述,小應(yīng)用駐留在主應(yīng)用程序里面)。
注意:許多目錄的引用在后面的示例中,從簡單的模板去使用目錄的結(jié)構(gòu)。
2. 利用現(xiàn)代技術(shù)
Yii是一種純粹的面向?qū)ο罂蚣?,并且利用PHP的一些更高級的功能,包括延遲靜態(tài)綁定,SPL類和接口,和匿名函數(shù)。
所有的類名稱空間,它允許你利用PSR-4兼容的自動裝載器。這意味著包括Yii 的 HTML的幫助類一樣的簡單:
use yii\helpers\Html;
Yii 也允許你定義別名來幫助簡化你的命名空間。 在上面的示例中, use 語句將加載一個類定義,默認放的目錄 /vendor/yiisoft/yii2/helpers. 這個別名在BaseYii 類在第79行中定義:
public static $aliases = ['@yii' => __DIR__];
框架本身的安裝使用Composer,是其擴展。 甚至出版的過程擴展一樣容易創(chuàng)建自己的 composer.json,并在Github托管代碼,列出您的擴展在Packagist。
3. 高度可擴展性
Yii 看起來就像一件樣式很棒的西裝,但也非常容易根據(jù)你的需求來進行定制. 實際上框架的每一個組件都是可以擴展的。一個簡單的示例就是添加一個唯一的主體ID到你的視圖上。 (你如果對自己為什么可能會想要這樣做感興趣的話,可以看看這篇 文章).
首先,我會在我的 app\components 目錄相面創(chuàng)建一個名為 View.php 的文件, 并加入如下代碼:
namespace app\components; class View extends yii\web\View { public $bodyId; /* Yii allows you to add magic getter methods by prefacing method names with "get" */ public function getBodyIdAttribute() { return ($this->bodyId != '') ? 'id="' . $this->bodyId . '"' : ''; } }
然后,在我的主布局文件 (app\views\layouts\main.php) 中,我會將如下代碼添加到我的HTML中body標(biāo)簽的里面:
<body <?=$this->BodyIdAttribute?>>
而最后,我會加下列的代碼添加到我的主配置文件中,以便讓Yii知道如何去使用我擴展的視圖類,而不是它自己默認的那個類:
return [ // ... 'components' => [ // ... 'view' => [ 'class' => 'app\components\View' ] ] ];
4. 鼓勵測試
Yii 框架和Codeception框架緊密地集成在一起。 Codeception 是一個優(yōu)秀的PHP測試框架,它幫助簡化創(chuàng)建單元測試、功能驗收測試的流程。 條件是你在為所有的應(yīng)用程序編寫自動化的測試用例,對吧?
Codeception 擴展使得在測試時配置應(yīng)用程序變得簡單。 測試應(yīng)用程序,只需編輯一個已存在的文件/tests/_config.php。例如:
return [ 'components' => [ 'mail' => [ 'useFileTransport' => true, ], 'urlManager' => [ 'showScriptName' => true, ], 'db' => [ 'dsn' => 'mysql:host=localhost;dbname=mysqldb_test', ], ], ];
使用上面的配置,需要注意下面一些事項:
- 在功能驗收測試期間,所有發(fā)送的郵件都會被寫入一個文件中保存,而非真正地發(fā)送出去。
- 測試時URL的格式是index.php/controller/action,而非/controller/action。
- 測試時需要使用測試數(shù)據(jù)庫,而非生產(chǎn)數(shù)據(jù)庫。
Codeception 內(nèi)部存在一個特殊的模塊,專門用于Yii 框架測試。 它在TestGuy類里添加了一些方法,保證功能測試時 Active Record(Yii 的ORM)可以正常工作。 例如,如果你想查看注冊表單是否成功地創(chuàng)建了一個用戶名為testuser的User對象,你可以這樣做:
$I->amOnPage('register'); $I->fillField('username', 'testuser'); $I->fillField('password', 'qwerty'); $I->click('Register'); $I->seeRecord('app\models\User', array('name' => 'testuser'));
5. 簡化的安全方案
安全性是任何web應(yīng)用的重要組成部分,幸運的是Yii有許多很棒的特性能幫你減輕負擔(dān).
Yii 帶來了一個安全性 應(yīng)用程序組件,它暴露了一些可以幫助可以用來創(chuàng)建一個更加安全的應(yīng)用程序的方法. 其中一些相對而言更加有用的方法有:
generatePasswordHash: 從一個密碼和一個隨機的鹽值生成一個安全的哈希值. 這個方法會為你創(chuàng)建一個隨機的鹽值,然后使用PHP的 crypt 函數(shù)來根據(jù)所提供的字符串創(chuàng)建一個哈希值.
validatePassword: 這是一個可以同 generatePasswordHash 搭配使用的方法, 并可以讓你檢查用戶提供的密碼是否同你存儲的哈希值匹配.
generateRandomKey: 可逆讓你創(chuàng)建一個任何長度的隨機字符串
Yii 會自動對所有非安全 HTTP 請求方法 (PUT, POST, DELETE) 的可用CSRF令牌進行檢查, 并將在你使用 ActiveForm::begin() 方法創(chuàng)建你的開發(fā)表單標(biāo)簽時生成并輸出一個令牌值. 這個特性可以通過編輯你的主配置文件,包含下面的代碼來禁用:
return [ 'components' => [ 'request' => [ 'enableCsrfValidation' => false, ] ];
為了堤防跨站腳本XSS的攻擊,Yii提供了另外一個叫做 HtmlPurifier 的輔助類. 這個類有一個名為 process 的靜態(tài)方法, 而它將會使用同名的 流行過濾器庫 來過濾你的輸出.
Yii 也包含了隨時就緒的用于用戶認證和授權(quán)的類. 授權(quán)被分成了兩個類型: ACF (訪問控制過濾器) 和RBAC (基于角色訪問的控制).
兩者中更加的是 ACF, 其實現(xiàn)是通過在你控制器的添加下列的 行為 方法:
use yii\filters\AccessControl; class DefaultController extends Controller { // ... public function behaviors() { return [ // ... 'class' => AccessControl::className(), 'only' => ['create', 'login', 'view'], 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'view'], 'roles' => ['?'] ], [ 'allow' => true, 'actions' => ['create'], 'roles' => ['@'] ] ] ]; } // ... }
上面的代碼會告訴 DefaultControllerto 讓訪客用戶訪問login和view的action, 而不是create這個action. (問號 ? 是匿名用戶的別名, 而 @ 表示的是已經(jīng)被授權(quán)的用戶).
RBAC 是一個可以在應(yīng)用程序中指定那些用戶可以執(zhí)行特定的動作的強大方法. 它涉及為你的用戶創(chuàng)建角色,為你的app定義權(quán)限,并然后為他們預(yù)期的角色使用這些角色. 如果你想要創(chuàng)建一個審核員(Moderator)的角色就可以使用這個方法, 并可以讓所有分配到這個角色的用戶可以對文章進行審核.
你也還可以使用 RBAC 定義規(guī)則, 它可以讓你在特定條件下針對你應(yīng)用程序的某些方面進行授權(quán). 例如,你可以創(chuàng)建一個規(guī)則讓用戶可以編輯他們自己的文章, 而不能修改由其他人創(chuàng)建的文章.
6. 縮短開發(fā)時間
大多數(shù)的項目都包含了重復(fù)的任務(wù),沒有人想把時間浪費在這些重復(fù)工作上面。Yii 提供了一些工具來幫助你在這些任務(wù)上花費更少的時間,把大多數(shù)時間都用在定制應(yīng)用來滿足你客戶的需求上。
其中最強大的一個工具就是“Gii”。Gii是一個基于web腳手架代碼工具,它可以讓你快速的創(chuàng)建一個代碼模板如下所示:
- Models
- Controllers
- Forms
- Modules
- Extensions
- CRUD controller actions and views
Gii是高度可配置的。你可以設(shè)置它只從一個特定的環(huán)境加載。簡單的編輯web配置文件如下:
if (YII_ENV_DEV) { // ... $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', 'allowedIPs' => ['127.0.0.1', '::1'] ] }
這確保了Gii只有設(shè)置了Yii的環(huán)境變量為(development)開發(fā)環(huán)境時才加載,并且只在通過本地環(huán)境訪問的時候加載。
現(xiàn)在,讓我們來看看模型的生成:
表格名稱使用了一個響應(yīng)敲擊就會顯示的小窗口來嘗試給出對你的模型將會關(guān)聯(lián)的表格的猜測, 并且所有的域值輸入框都會有一個翻轉(zhuǎn)效果顯示出來的提示,提醒你如何完成對它們的填寫. 你可以在讓Gii輸出代碼之前先進行一下預(yù)覽, 而所有的代碼模板都是完全可定制的.
也有幾個可以用于數(shù)據(jù)庫遷移、消息翻譯(I18N)以及生成用于自動化測試數(shù)據(jù)庫道具的命令行輔助工具. 例如,你可以使用如下代碼創(chuàng)建一個新的數(shù)據(jù)庫遷移 文件:
yii migrate/create create_user_table
這將會在 {應(yīng)用目錄}/migrations 創(chuàng)建一個新的看起來像下面這樣的遷移模板:
<?php use yii\db\Schema; class m140924_153425_create_user_table extends \yii\db\Migration { public function up() { } public function down() { echo "m140924_153425_create_user_table cannot be reverted.\n"; return false; } }
如此假如說我想要想這個表添加一些列. 我就只要簡單的將下面的代碼添加到 up 方法中:
public function up() { $this->createTable('user', [ 'id' => Schema::TYPE_PK, 'username' => Schema::TYPE_STRING . ' NOT NULL', 'password_hash' => Schema:: TYPE_STRING . ' NOT NULL' ], null); }
然后為了確保我可以進行遷移的逆向操作,我就會編輯down方法:
public function down() { $this->dropTable('user'); }
創(chuàng)建表格可能就是簡單的設(shè)計到在命令行上運行一個命令:
./yii migrate
而刪除表格是下面的這個命令:
./yii migrate/down
7. 很容易通過調(diào)整獲得更好的性能
所有人都知道一個慢吞吞的網(wǎng)站會造就許多心懷不滿的用戶, 因此Yii為你提供了一些工具來幫助你讓應(yīng)用程序獲得更快的速度.
所有的Yii緩存組件都擴展自yii/caching/Cache, 它能讓你在使用一個公共API的同時選擇任意某一個緩存系統(tǒng). 你甚至可以同時注冊多個高速緩存組件. Yii 當(dāng)前支持數(shù)據(jù)庫和文件系統(tǒng)緩存, 還有 APC, Memcache, Redis, WinCache, XCache 以及 Zend Data Cache.
默認情況下,如果你是使用的 Active Record ,那么 Yii 會額外運行一個查詢來確定生成你模型的表的結(jié)構(gòu). 你可以通過像下面這樣編輯你的主配置文件,對你的應(yīng)用程序進行設(shè)置,以緩存這些表結(jié)構(gòu):
return [ // ... 'components' => [ // ... 'db' => [ // ... 'enableSchemaCache' => true, 'schemaCacheDuration' => 3600, 'schemaCache' => 'cache', ], 'cache' => [ 'class' => 'yii\caching\FileCache', ], ], ];
最后,Yii有一個命令行工具可以便于對前端字段進行縮小化. 簡單地運行下面的命令就可以生成一個配置模板:
./yii asset/template config.php
然后編輯該配置,指定你想要用那些工具來執(zhí)行縮小化操作(比如. Closure Compiler, YUI Compressor, 或者 UglifyJS). 生成的配置模板如下所示:
<?php return [ 'jsCompressor' => 'java -jar compiler.jar --js {from} --js_output_file {to}', 'cssCompressor' => 'java -jar yuicompressor.jar --type css {from} -o {to}', 'bundles' => [ // 'yii\web\YiiAsset', // 'yii\web\JqueryAsset', ], 'targets' => [ 'app\config\AllAsset' => [ 'basePath' => 'path/to/web', 'baseUrl' => '', 'js' => 'js/all-{hash}.js', 'css' => 'css/all-{hash}.css', ], ], 'assetManager' => [ 'basePath' => __DIR__, 'baseUrl' => '', ], ];
接下來,運行這個控制臺命令以執(zhí)行壓縮.
yii asset config.php /app/assets_compressed.php
最后,修改你的web應(yīng)用程序配置文件,使用壓縮后的資源.
'components' => [ // ... 'assetManager' => [ 'bundles' => require '/app/assets_compressed.php' ] ]
注意: 你需要手動下載并安裝這些額外的工具.
- PHP的Yii框架的常用日志操作總結(jié)
- 詳解PHP的Yii框架中日志的相關(guān)配置及使用
- PHP的Yii框架入門使用教程
- 在Mac OS上搭建PHP的Yii框架及相關(guān)測試環(huán)境
- win7安裝php框架Yii的方法
- Nginx配置PHP的Yii與CakePHP框架的rewrite規(guī)則示例
- 實例講解yii2.0在php命令行中運行的步驟
- Yii 連接、修改 MySQL 數(shù)據(jù)庫及phpunit 測試連接
- PHP YII框架開發(fā)小技巧之模型(models)中rules自定義驗證規(guī)則
- PHP Yii框架之表單驗證規(guī)則大全
- PHP基于yii框架實現(xiàn)生成ICO圖標(biāo)
- 全面解讀PHP的Yii框架中的日志功能
相關(guān)文章
PHP保存session到memcache服務(wù)器的方法
這篇文章主要介紹了PHP保存session到memcache服務(wù)器的方法,涉及PHP操作session及memcache的相關(guān)技巧,需要的朋友可以參考下2016-01-01php+mysql開發(fā)中的經(jīng)驗與常識小結(jié)
這篇文章主要介紹了php+mysql開發(fā)中的經(jīng)驗與常識,簡單總結(jié)分析了php+mysql數(shù)據(jù)庫程序設(shè)計中的命名規(guī)范、數(shù)據(jù)庫表、字段、索引等相關(guān)設(shè)計與使用規(guī)范,需要的朋友可以參考下2019-03-03Http 1.1 Etag 與 Last-Modified提高php效率
2008-01-01PHP微信開發(fā)之微信錄音臨時轉(zhuǎn)永久存儲
這篇文章主要為大家詳細介紹了PHP微信開發(fā)之微信錄音臨時轉(zhuǎn)永久存儲,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01PHP中break及continue兩個流程控制指令區(qū)別分析
php中常用的for與foreach循環(huán)中,經(jīng)常遇到條件判斷或中止循環(huán)的情況。而處理方式主要用到break及continue兩個流程控制指令,現(xiàn)在說明主要區(qū)別2011-04-04