2.0 çæ¡æ¶æ¯å®å ¨éåçï¼å¨ 1.1 å 2.0 两个çæ¬ä¹é´åå¨ç¸å½å¤å·®å¼ã å æ¤ä» 1.1 çå级并ä¸åå°çæ¬é´çè·¨è¶é£ä¹ç®åï¼ éè¿æ¬æåä½ å°ä¼äºè§£ä¸¤ä¸ªçæ¬é´ä¸»è¦çä¸åä¹å¤ã
å¦æä½ ä¹å没æç¨è¿ Yii 1.1ï¼å¯ä»¥è·³è¿æ¬ç« ï¼ç´æ¥ä»"å ¥é¨ç¯"å¼å§è¯»èµ·ã
请注æï¼Yii 2.0 å¼å ¥äºå¾å¤æ¬ç« 并没ææ¶åå°çæ°åè½ã 强çå»ºè®®ä½ é读æ´é¨æå¨æåæ¥äºè§£æææ°ç¹æ§ã è¿æ ·æå¯è½ä¼åç°ä¸äºä»¥åä½ è¦èªå·±å¼åçåè½ï¼èç°å¨å·²ç»è¢«å å«å¨æ ¸å¿ä»£ç ä¸äºã
Yii 2.0 å®å ¨æ¥æ± Composerï¼å®æ¯äºå®ä¸ç PHP ä¾èµç®¡çå·¥å ·ã æ ¸å¿æ¡æ¶ä»¥åæ©å±çå®è£ é½éè¿ Composer æ¥å¤çãæ³è¦äºè§£æ´å¤å¦ä½å®è£ Yii 2.0 请åé æ¬æåç å®è£ Yii ç« èãå¦æä½ æ³å建æ°æ©å±ï¼ æè æä½ å·²æç Yii 1.1 çæ©å±æ¹åæå ¼å®¹ 2.0 ççæ¬ï¼ ä½ å¯ä»¥åè å建æ©å± ç« èã
Yii 2.0 éè¦ PHP 5.4 ææ´é«çæ¬ï¼è¯¥çæ¬ç¸å¯¹äº Yii 1.1 æéæ±ç PHP 5.2 èè¨æ巨大çæ¹è¿ã å æ¤å¨è¯è¨å±é¢ä¸æå¾å¤çå¼å¾æ³¨æçä¸åä¹å¤ã ä¸é¢æ¯ PHP å±ç主è¦ååæ±æ»ï¼
[...å
ç´ ...]
ç¨äºå代 array(...å
ç´ ...)
<?=
ï¼èª PHP 5.4 èµ·æ»ä¼è¢«è¯å«å¹¶ä¸åæ³ï¼æ 论 short_open_tag ç设置æ¯ä»ä¹ï¼å¯ä»¥å®å
¨ä½¿ç¨ãintl
æ¥æ¯æå½é
åçç¸å
³åè½ãYii 2.0 éæææ¾çæ¹å¨å°±æ°å½å空é´ç使ç¨äºãå ä¹æ¯ä¸ä¸ªæ ¸å¿ç±»é½å¼å
¥äºå½å空é´ï¼
æ¯å¦ yii\web\Request
ã1.1 çç±»ååç¼ âCâ å·²ç»ä¸å使ç¨ã
å½åçå½åæ¹æ¡ä¸ç®å½ç»æç¸å»åãä¾å¦ï¼yii\web\Request
就表æ对åºçç±»æä»¶æ¯ Yii æ¡æ¶æ件夹ä¸ç web/Request.php
æ件ã
ï¼æäº Yii çç±»èªå¨å è½½å¨ï¼ ä½ å¯ä»¥ç´æ¥ä½¿ç¨å ¨é¨æ ¸å¿ç±»èä¸éè¦æ¾å¼å å«å ·ä½æ件ãï¼
Yii 2.0 æ 1.1 ä¸ç CComponent
ç±»æåæäºä¸¤ä¸ªç±»ï¼yii\base\Object å yii\base\Componentã
Object ç±»æ¯ä¸ä¸ªè½»é级çåºç±»ï¼ä½ å¯ä»¥éè¿ getters å setters æ¥å®ä¹å¯¹è±¡çå±æ§ã
Component 类继æ¿èª Objectï¼
åæ¶è¿ä¸æ¥æ¯æ äºä»¶ å è¡ä¸ºã
å¦æä½ ä¸éè¦ç¨å°äºä»¶æè¡ä¸ºï¼ åºè¯¥èèä½¿ç¨ Object ç±»ä½ä¸ºåºç±»ã è¿ç§ç±»é常ç¨æ¥è¡¨ç¤ºåºæ¬çæ°æ®ç»æã
Object ç±»å¼å ¥äºä¸ç§ç»ä¸å¯¹è±¡é ç½®çæ¹æ³ã ææ Object çåç±»é½åºè¯¥ç¨ä»¥ä¸æ¹æ³å£°æå®çæé æ¹æ³ï¼å¦æéè¦çè¯ï¼ï¼ 以æ£ç¡®é ç½®å®èªèº«ï¼
class MyClass extends \yii\base\BaseObject
{
public function __construct($param1, $param2, $config = [])
{
// ... é
ç½®çæåçåå§åè¿ç¨
parent::__construct($config);
}
public function init()
{
parent::init();
// ... é
ç½®çæåçåå§åè¿ç¨
}
}
å¨ä¸é¢çä¾åéï¼æé æ¹æ³çæåä¸ä¸ªåæ°å¿ é¡»ä¼ å ¥ä¸ä¸ªé ç½®æ°ç»ï¼ å å«ä¸ç³»åç¨äºå¨æ¹æ³ç»å°¾åå§åç¸å ³å±æ§çé®å¼å¯¹ã ä½ å¯ä»¥éå init() æ¹æ³æ¥æ§è¡ä¸äºéè¦å¨é ç½®çæåè¿è¡çåå§åå·¥ä½ã
ä½ å¯ä»¥éè¿éµå¾ªä»¥ä¸çº¦å®ä¿æçç¼ç ä¹ æ¯ï¼ æ¥ä½¿ç¨é ç½®æ°ç»å建并é ç½®æ°ç对象ï¼
$object = Yii::createObject([
'class' => 'MyClass',
'property1' => 'abc',
'property2' => 'cde',
], [$param1, $param2]);
æ´å¤æå ³é ç½®çç»èå¯ä»¥å¨é ç½®ç« èæ¾å°ã
å¨ Yii 1 ä¸ï¼é常éè¿å®ä¹ on
å¼å¤´çæ¹æ³ï¼ä¾å¦ onBeforeSave
ï¼æ¥å建äºä»¶ã
èå¨ Yii 2 ä¸ï¼ä½ å¯ä»¥ä½¿ç¨ä»»æçäºä»¶åäºãåæ¶éè¿è°ç¨ trigger() æ¹æ³æ¥è§¦åç¸å
³äºä»¶ï¼
$event = new \yii\base\Event;
$component->trigger($eventName, $event);
è¦ç»äºä»¶éå ä¸ä¸ªäºä»¶äºä»¶å¤çå¨ï¼éè¦ä½¿ç¨ on() æ¹æ³ï¼
$component->on($eventName, $handler);
// 解é¤äºä»¶å¤çå¨ï¼ä½¿ç¨ off æ¹æ³ï¼
// $component->off($eventName, $handler);
äºä»¶åè½è¿ææ´å¤å¢å¼ºä¹å¤ãè¦äºè§£å®ä»¬ï¼è¯·æ¥çäºä»¶ç« èã
Yii 2.0 å°è·¯å¾å«åçåºç¨æ©å¤§è³æ件/ç®å½è·¯å¾å URLãYii 2.0 ä¸è·¯å¾å«åå¿
须以 @
符å·å¼å¤´ï¼
以åºå«äºæ®éæ件ç®å½è·¯å¾æ URLãä¾å¦ @yii
å°±æ¯æå Yii å®è£
ç®å½çå«åã
ç»å¤§å¤æ° Yii æ ¸å¿ä»£ç é½æ¯æå«åã
ä¾å¦ yii\caching\FileCache::$cachePath
å°±åæ¶æ¯æè·¯å¾å«åææ®éçç®å½å°åã
è·¯å¾å«åä¹åç±»çå½å空é´å¯åç¸å
³ã建议ç»æ¯ä¸ä¸ªæ ¹å½å空é´å®ä¹ä¸ä¸ªè·¯å¾å«åï¼
ä»èæ é¡»é¢å¤é
ç½®ï¼ä¾¿å¯å¯å¨ Yii çç±»èªå¨å è½½æºå¶ã
ä¾å¦ï¼å 为æ @yii
æå Yii å®è£
ç®å½ï¼
é£ç±»ä¼¼ yii\web\Request
ç类就è½è¢« Yii èªå¨å è½½ãåçï¼è¥ä½ ç¨äºä¸ä¸ªç¬¬ä¸æ¹çç±»åºï¼
å¦ Zend Frameworkï¼ä½ åªéå®ä¹ä¸ä¸ªå为 @Zend
çè·¯å¾å«åæå该æ¡æ¶çå®è£
ç®å½ã
ä¹å Yii å°±å¯ä»¥èªå¨å 载任æ Zend Framework ä¸çç±»äºã
æ´å¤è·¯å¾å«åä¿¡æ¯è¯·åé è·¯å¾å«åç« èã
Yii 2 ä¸è§å¾æææ¾çæ¹å¨æ¯è§å¾å
çç¹æ®åé $this
ä¸åæåå½åæ§å¶å¨æå°é¨ä»¶ï¼
èæ¯æåè§å¾å¯¹è±¡ï¼å®æ¯ 2.0 ä¸å¼å
¥çå
¨æ°æ¦å¿µãè§å¾å¯¹è±¡ä¸º yii\web\View çå®ä¾ï¼
ä»ä»£è¡¨äº MVC 模å¼ä¸çè§å¾é¨åãå¦æä½ æ³è¦å¨è§å¾ä¸è®¿é®ä¸ä¸ªæ§å¶å¨æå°é¨ä»¶ï¼
å¯ä»¥ä½¿ç¨ $this->context
ã
è¦å¨å
¶ä»è§å¾é渲æä¸ä¸ªå±é¨è§å¾ï¼ä½¿ç¨ $this->render()
ï¼èä¸æ¯ $this->renderPartial()
ã
render()
ç°å¨åªè¿å渲æç»æï¼èä¸æ¯ç´æ¥æ¾ç¤ºå®ï¼æ以ç°å¨ä½ å¿
é¡»æ¾å¼å°æå® echo åºæ¥ãåè¿æ ·ï¼
echo $this->render('_item', ['item' => $item]);
é¤äºä½¿ç¨ PHP ä½ä¸ºä¸»è¦ç模æ¿è¯è¨ï¼Yii 2.0 ä¹è£
å¤äºä¸¤ç§æµè¡æ¨¡æ¿å¼æçå®æ¹æ¯æï¼Smarty å Twigã
è¿å»ç Prado 模æ¿å¼æä¸å被æ¯æãè¦ä½¿ç¨è¿äºæ¨¡æ¿å¼æï¼
ä½ éè¦é
ç½® view
åºç¨ç»ä»¶ï¼
ç»å®è®¾ç½® View::$renderers å±æ§ã
å
·ä½è¯·åé
模æ¿å¼æç« èã
Yii 2.0 ä½¿ç¨ yii\base\Model ä½ä¸ºæ¨¡ååºç±»ï¼ç±»ä¼¼äº 1.1 ç CModel
ã
CFormModel
被å®å
¨å¼ç¨äºï¼ç°å¨è¦å建表å模åç±»ï¼å¯ä»¥éè¿ç»§æ¿ yii\base\Model ç±»æ¥å®ç°ã
Yii 2.0 å¼è¿äºå为 scenarios() çæ°æ¹æ³æ¥å£°ææ¯æçåºæ¯ï¼ 并ææå¨åªä¸ªåºæ¯ä¸æå±æ§å¿ é¡»ç»è¿éªè¯ï¼å¯å¦è¢«è§ä¸ºå®å ¨å¼ççãå¦ï¼
public function scenarios()
{
return [
'backend' => ['email', 'role'],
'frontend' => ['email', '!role'],
];
}
ä¸é¢ç代ç 声æäºä¸¤ä¸ªåºæ¯ï¼backend
å frontend
ãå¯¹äº backend
åºæ¯ï¼email
å role
å±æ§å¼é½æ¯å®å
¨çï¼
ä¸è½è¿è¡æ¹éèµå¼ãå¯¹äº frontend
åºæ¯ï¼email
è½æ¹éèµå¼è role
ä¸è½ã
email
å role
é½å¿
é¡»éè¿è§åéªè¯ã
rules() æ¹æ³ä»ç¨äºå£°æéªè¯è§åã注æï¼ç±äºå¼å
¥äº scenarios()ï¼ç°å¨å·²ç»æ²¡æ unsafe
éªè¯å¨äºã
大å¤æ°æ
åµä¸ï¼å¦æ rules() æ¹æ³å
å·²ç»å®æ´å°æå®åºæ¯äºï¼
é£å°±ä¸å¿
è¦å scenarios()ï¼
ä¹ä¸å¿
声æ unsafe
å±æ§å¼ã
è¦äºè§£æ´å¤æå ³æ¨¡åçç»èï¼è¯·åè模åç« èã
Yii 2.0 ä½¿ç¨ yii\web\Controller ä½ä¸ºæ§å¶å¨çåºç±»ï¼
å®ç±»ä¼¼äº 1.1 ç CController
ãä½¿ç¨ yii\base\Action ä½ä¸ºæä½ç±»çåºç±»ã
è¿äºååæææ¾çå½±åæ¯ï¼å½ä½ å¨åæ§å¶å¨æä½ç代ç æ¶ï¼ åºè¯¥è¿åï¼returnï¼è¦æ¸²æçå 容èä¸æ¯è¾åºï¼echoï¼å®ï¼
public function actionView($id)
{
$model = \app\models\Post::findOne($id);
if ($model) {
return $this->render('view', ['model' => $model]);
} else {
throw new \yii\web\NotFoundHttpException;
}
}
请æ¥çæ§å¶å¨ï¼Controllerï¼ç« èäºè§£æå ³æ§å¶å¨çæ´å¤ç»èã
Yii 2.0 ä½¿ç¨ yii\base\Widget ä½ä¸ºå°é¨ä»¶åºç±»ï¼ç±»ä¼¼äº 1.1 ç CWidget
ã
为äºè®©æ¡æ¶è·å¾æ´å¥½ç IDE æ¯æï¼Yii 2.0 å¼è¿äºä¸ä¸ªè°ç¨å°é¨ä»¶çæ°è¯æ³ã å å« begin()ï¼end() å widget() ä¸ä¸ªéææ¹æ³ï¼ç¨æ³å¦ä¸ï¼
use yii\widgets\Menu;
use yii\widgets\ActiveForm;
// 注æå¿
é¡» **"echo"** ç»æ以æ¾ç¤ºå
容
echo Menu::widget(['items' => $items]);
// ä¼ éä¸ä¸ªç¨äºåå§å对象å±æ§çæ°ç»
$form = ActiveForm::begin([
'options' => ['class' => 'form-horizontal'],
'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']],
]);
... 表åè¾å
¥æ é½å¨è¿éå
¥æ é½å¨è¿éé½å¨è¿é::end();
æ´å¤ç»è请åé å°é¨ä»¶ç« èã
2.0 主é¢çè¿ä½æ¹å¼è·ä»¥å¾å®å
¨ä¸åäºãå®ä»¬ç°å¨åºäºè·¯å¾æ å°æºå¶ï¼è¯¥æºå¶ä¼æä¸ä¸ªæºè§å¾æ件çè·¯å¾æ å°å°ä¸ä¸ªä¸»é¢è§å¾æ件路å¾ã
举ä¾æ¥è¯´ï¼å¦æè·¯å¾æ å°ä¸º ['/web/views' => '/web/themes/basic']
ï¼
é£ä¹ /web/views/site/index.php
è§å¾ç»è¿ä¸»é¢ä¿®é¥°ççæ¬å°±ä¼æ¯ /web/themes/basic/site/index.php
ã
ä¹å æ¤è®©ä¸»é¢ç°å¨å¯ä»¥åºç¨å¨ä»»ä½è§å¾æ件ä¹ä¸ï¼
çè³æ¯æ¸²ææ§å¶å¨ä¸ä¸æç¯å¢ä¹å¤çè§å¾æ件æå°é¨ä»¶ã
åæ ·ï¼CThemeManager
ç»ä»¶å·²ç»è¢«ç§»é¤äºã
åè代ä¹ç theme
æä¸ºäº view
åºç¨ç»ä»¶çä¸ä¸ªå¯é
ç½®å±æ§ã
æ´å¤ç»è请åè主é¢ç« èã
æ§å¶å°åºç¨ç°å¨å¦æ®éç Web åºç¨ç¨åºä¸æ ·ï¼ç±æ§å¶å¨ç»æï¼
æ§å¶å°çæ§å¶å¨ç»§æ¿èª yii\console\Controllerï¼ç±»ä¼¼äº 1.1 ç CConsoleCommand
ã
è¿è¡æ§å¶å°å½ä»¤ä½¿ç¨ yii <route>
ï¼
å
¶ä¸ <route>
代表æ§å¶å¨çè·¯ç±ï¼å¦ sitemap/index
ï¼ã
é¢å¤çå¿ååæ°ä¼ éå°å¯¹åºçæ§å¶å¨æä½æ¹æ³ï¼
èæåçåæ°æ ¹æ® yii\console\Controller::options() ç声ææ¥è§£æã
Yii 2.0 æ¯æåºäºä»£ç 注éèªå¨çæç¸çå ³å½ä»¤è¡å¸®å©ï¼helpï¼ä¿¡æ¯ã
æ´å¤ç»è请åé æ§å¶å°å½ä»¤ç« èã
Yii 2.0 移é¤äºåæ¥å ç½®çæ¥ææ ¼å¼å¨åæ°åæ ¼å¼å¨ï¼ä¸ºäºæ¯æ PECL intl PHP moduleï¼PHP çå½é åæ©å±ï¼ç使ç¨ã
æ¶æ¯ç¿»è¯ç°å¨ç± i18n
åºç¨ç»ä»¶æ§è¡ã
该ç»ä»¶ç®¡çä¸ç³»åæ¶æ¯æºï¼
å
许使ç¨åºäºæ¶æ¯ç±»å«çä¸åæ¶æ¯æºã
æ´å¤ç»è请åé å½é åï¼Internationalizationï¼ç« èã
æä½çè¿æ»¤ç°å¨éè¿è¡ä¸ºï¼behaviorï¼æ¥å®ç°ãè¦å®ä¹ä¸ä¸ªæ°çï¼èªå®ä¹çè¿æ»¤å¨ï¼è¯·ç»§æ¿ yii\base\ActionFilter ç±»ã
è¦ä½¿ç¨ä¸ä¸ªè¿æ»¤å¨ï¼éè¦æè¿æ»¤å¨ç±»ä½ä¸ºä¸ä¸ª behavior
ç»å®å°æ§å¶å¨ä¸ã
ä¾å¦ï¼è¦ä½¿ç¨ yii\filters\AccessControl è¿æ»¤å¨ï¼ä½ éè¦å¨æ§å¶å¨å
æ·»å å¦ä¸ä»£ç ï¼
public function behaviors()
{
return [
'access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
],
],
];
}
æ´å¤ç»è请åèè¿æ»¤å¨ç« èã
Yii 2.0 å¼å ¥äºä¸ä¸ªæ°çæ¦å¿µï¼ç§°ä¸ºèµæºå ï¼Asset Bundleï¼ï¼ä»¥ä»£æ¿ 1.1 çèæ¬å æ¦å¿µã
ä¸ä¸ªèµæºå æ¯ä¸ä¸ªç®å½ä¸çèµæºæ件éåï¼å¦ JavaScript æ件ãCSS æ件ãå¾çæ件çï¼ã æ¯ä¸ä¸ªèµæºå 被表示为ä¸ä¸ªç±»ï¼è¯¥ç±»ç»§æ¿èª yii\web\AssetBundleã ç¨ yii\web\AssetBundle::register() æ¹æ³æ³¨åä¸ä¸ªèµæºå åï¼ å°±ä½¿å®çèµæºå¯è¢« Web 访é®äºï¼ 注åäºèµæºå ç页é¢ä¼èªå¨å å«åå¼ç¨èµæºå å æå®ç JS å CSS æ件ã
æ´å¤ç»è请åé å端èµæºç®¡çï¼Assetï¼ ç« èã
Yii 2.0 å¾å¤å¸¸ç¨çéæå©æç±»ï¼å æ¬ï¼
请åèå©æä¸è§ ç« èæ¥äºè§£æ´å¤ã
Yii 2.0 å¼è¿äºè¡¨åæ ï¼fieldï¼çæ¦å¿µï¼ç¨æ¥å建ä¸ä¸ªåºäº yii\widgets\ActiveForm ç表åã ä¸ä¸ªè¡¨åæ æ¯ä¸ä¸ªç±æ ç¾ãè¾å ¥æ¡ãé误æ¶æ¯ï¼å¯è½è¿ææ示æåï¼ç»æç容å¨ï¼ 被表示为ä¸ä¸ª ActiveField 对象ã 使ç¨è¡¨åæ 建ç«è¡¨åçè¿ç¨æ¯ä»¥åæ´æ´æ´å©è½ï¼
<?php $form = yii\widgets\ActiveForm::begin(); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<div class="form-group">
<?= Html::submitButton('Login') ?>
</div>
<?php yii\widgets\ActiveForm::end(); ?>
请åèå建表åç« èæ¥äºè§£æ´å¤ç»èã
Yii 1.1 ä¸ï¼æ¥è¯¢è¯å¥ççæåæ£å¨å¤ä¸ªç±»ä¸ï¼å
æ¬ CDbCommand
ï¼CDbCriteria
以å CDbCommandBuilder
ã
Yii 2.0 以 Query 对象çå½¢å¼è¡¨ç¤ºä¸ä¸ªæ°æ®åºæ¥è¯¢ï¼
è¿ä¸ªå¯¹è±¡ä½¿ç¨ QueryBuilder å¨å¹åçæ SQL è¯å¥ã
ä¾å¦ï¼
$query = new \yii\db\Query();
$query->select('id, name')
->from('user')
->limit(10);
$command = $query->createCommand();
$sql = $command->sql;
$rows = $command->queryAll();
æéè¦çæ¯ï¼è¿äºæ¥è¯¢çææ¹æ³è¿å¯ä»¥åæ´»å¨è®°å½é å使ç¨ã
请åèæ¥è¯¢çæå¨ï¼Query Builderï¼ç« èäºè§£æ´å¤å 容ã
Yii 2.0 çæ´»å¨è®°å½æ¹å¨äºå¾å¤ã 两个ææ¾èæè§çæ¹å¨åå«æ¶åæ¥è¯¢è¯å¥ççæï¼query buildingï¼åå ³èæ¥è¯¢çå¤çï¼relational query handlingï¼ã
1.1 ä¸ç CDbCriteria
ç±»å¨ Yii 2 ä¸è¢« yii\db\ActiveQuery ææ¿ä»£ã
è¿ä¸ªç±»æ¯ç»§æ¿èª yii\db\Queryï¼å æ¤ä¹ç»§æ¿äºæææ¥è¯¢çææ¹æ³ãå¼å§æ¼è£
ä¸ä¸ªæ¥è¯¢å¯ä»¥è°ç¨ yii\db\ActiveRecord::find() æ¹æ³è¿è¡ï¼
// æ£ç´¢ææâæ´»å¨çâ客æ·å订åï¼å¹¶ä»¥ ID æåºï¼
$customers = Customer::find()
->where(['status' => $active])
->orderBy('id')
->all();
è¦å£°æä¸ä¸ªå
³èå
³ç³»ï¼åªéç®åå°å®ä¹ä¸ä¸ª getter æ¹æ³æ¥è¿åä¸ä¸ª ActiveQuery 对象ã
getter æ¹æ³å®ä¹çå±æ§å代表å
³è表å称ã
å¦ï¼ä»¥ä¸ä»£ç 声æäºä¸ä¸ªå为 orders
çå
³ç³»ï¼1.1 ä¸å¿
é¡»å¨ relations()
æ¹æ³å
声æå
³ç³»ï¼ï¼
class Customer extends \yii\db\ActiveRecord
{
public function getOrders()
{
return $this->hasMany('Order', ['customer_id' => 'id']);
}
}
ç°å¨ä½ å°±å¯ä»¥éè¿è°ç¨ $customer->orders
æ¥è®¿é®å
³è表ä¸æç¨æ·ç订åäºã
ä½ è¿å¯ä»¥ç¨ä»¥ä¸ä»£ç è¿è¡ä¸åºæå®æ¡ä»¶çå®æ¶å
³èæ¥è¯¢ï¼
$orders = $customer->getOrders()->andWhere('status=1')->all();
å½è´ªå©ªå è½½ä¸æ®µå ³èå ³ç³»æ¶ï¼Yii 2.0 å 1.1 çè¿ä½æºç并ä¸ç¸åã å ·ä½æ¥è¯´ï¼å¨ 1.1 ä¸ä½¿ç¨ä¸æ¡ JOIN è¯å¥åæ¶æ¥è¯¢ä¸»è¡¨åå ³è表记å½ã å¨ Yii 2.0 ä¸ä¼ä½¿ç¨ä¸¤ä¸ªæ²¡æ JOIN ç SQL è¯å¥ï¼ç¬¬ä¸æ¡è¯å¥åå主表记å½ï¼ 第äºæ¡éè¿ä¸»è¡¨è®°å½ç»ä¸»é®çéåæ¥è¯¢å ³è表记å½ã
å½çæè¿å大éè®°å½çæ¥è¯¢æ¶ï¼å¯ä»¥é¾å¼ä¹¦å asArray() æ¹æ³ï¼ è¿æ ·ä¼ä»¥æ°ç»çå½¢å¼è¿åæ¥è¯¢ç»æï¼èä¸å¿ è¿å ActiveRecord 对象ï¼è¿è½æ¾èéä½å 大éè®°å½è¯»åææ¶èç CPU æ¶é´åå åãå¦ï¼
$customers = Customer::find()->asArray()->all();
å¦ä¸ä¸ªæ¹åæ¯ä½ ä¸è½åéè¿å
Œ
±åéå®ä¹å±æ§ï¼Attributeï¼çé»è®¤å¼äºã
å¦æä½ éè¦è¿ä¹åçè¯ï¼å¯ä»¥å¨ä½ çè®°å½ç±»ç init
æ¹æ³ä¸è®¾ç½®å®ä»¬ã
public function init()
{
parent::init();
$this->status = self::STATUS_NEW;
}
æ¾å ä½æ¶ï¼å¨ 1.1 ä¸éåä¸ä¸ªæ´»å¨è®°å½ç±»çæé æ¹æ³ä¼å¯¼è´ä¸äºé®é¢ãå®ä»¬ä¸ä¼å¨ 2.0 ä¸åºç°äºã éè¦æ³¨æçæ¯ï¼å¦æä½ éè¦å¨æé æ¹æ³ä¸æ·»å ä¸äºåæ°ï¼ææå¿ é¡»éå yii\db\ActiveRecord::instantiate() æ¹æ³ã
æ´»å¨è®°å½æ¹é¢è¿æå¾å¤å ¶ä»çååä¸æ¹è¿ï¼ 请åèæ´»å¨è®°å½ç« è以äºè§£æ´å¤ç»èã
å¨ 2.0 ä¸éå¼äºæ´»å¨è®°å½è¡ä¸ºåºç±» CActiveRecordBehavior
ã
å¦æä½ æ³å建活å¨è®°å½è¡ä¸ºï¼éè¦ç´æ¥ç»§æ¿ yii\base\Behavior
ã
å¦æè¡ä¸ºç±»ä¸éè¦è¡¨ç¤ºä¸äºäºä»¶ï¼éè¦åè¿æ ·è¦å events()
æ¹æ³ï¼
namespace app\components;
use yii\db\ActiveRecord;
use yii\base\Behavior;
class MyBehavior extends Behavior
{
// ...
public function events()
{
return [
ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
];
}
public function beforeValidate($event)
{
// ...
}
}
1.1 ä¸ç CWebUser
ç±»ç°å¨è¢« yii\web\User æå代ï¼éä¹ CUserIdentity
ç±»ä¹ä¸å¨äºã
ä¸ä¹ç¸å¯¹çï¼ä¸ºè¾¾å°ç¸åç®çï¼ä½ å¯ä»¥å®ç° yii\web\IdentityInterface æ¥å£ï¼å®ä½¿ç¨èµ·æ¥æ´ç´è§ã
å¨é«çº§åºç¨æ¨¡çéæä¾äºä¸ä¸ªè¿æ ·çä¸ä¸ªä¾åã
è¦äºè§£æ´å¤ç»è请åè认è¯ï¼Authenticationï¼ï¼ææï¼Authorizationï¼ä»¥åé«çº§åºç¨æ¨¡ç è¿ä¸ä¸ªç« èã
Yii 2.0 ç URL 管çè· 1.1 ä¸å¾åãä¸ä¸ªä¸»è¦çæ¹è¿æ¯ç°å¨ç URL 管çæ¯æå¯éåæ°äºã
æ¯å¦ï¼å¦æä½ å¨ 2.0 ä¸å®ä¹äºä¸ä¸ªä¸é¢è¿æ ·çè§åï¼é£ä¹å®å¯ä»¥åæ¶å¹é
post/popular
å post/1/popular
ä¸¤ç§ URLã
èå¨ 1.1 ä¸ä¸ºè¾¾æç¸åææï¼å¿
é¡»è¦ä½¿ç¨ä¸¤æ¡è§åã
[
'pattern' => 'post/<page:\d+>/<tag>',
'route' => 'post/index',
'defaults' => ['page' => 1],
]
请åèURL 解æåçæ ç« èï¼ä»¥äºè§£æ´å¤ç»èã.
ä¸ä¸ªéè¦ååæ¯è·¯ç±å½åç约å®ï¼
ç°å¨çæ§å¶å¨åå¨ä½ç驼峰å½åä¼è¢«è½¬æ¢æå°ååæ¯ï¼
å
¶ä¸æ¯ä¸ªåè¯ç±ä¸ä¸ªä¸æçè¿åå·åéï¼ä¾å¦ï¼CamelCaseController
å°ä¸º camel-case
ã
æå
³æ´å¤è¯¦ç»ä¿¡æ¯ï¼è¯·åé
å
³äº controller IDs å action IDs çé¨åã
å¦æä½ æä¸äºéçç Yii 1.1 代ç ï¼éè¦è· Yii 2.0 ä¸èµ·ä½¿ç¨ï¼ å¯ä»¥åè 1.1 å 2.0 å ±ç¨ç« èã
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.