YII2入门学习记录

安装YII2

在确保composer安装完成后通过composer安装YII2

composer global require "fxp/composer-asset-plugin:^1.3.1"
composer create-project --prefer-dist yiisoft/yii2-app-basic basic

第一条命令为全局安装一个js的包管理工具,是为了通过composer管理bower与npm包。
第二条命令为安装yii2-app-basic(并不是安装yii2),并命名为basic。与laravel不同,yii2是项目与应用分开管理的。所以如果执行以下命令会安装yii2项目。

composer require yiisoft/yii2

composer在安装yii2过程中会要求github账户信息(因为github对匿名调用API有次数限制),所以要为composer配置github的OAuth token

composer config -g github-oauth.github.com <your oauth token>
注意

github的OAuth token并不是ssh,他应该长这个样子

token => axxxxxxx69a76f7b4021e2bbebcxxxxxxxxxxd
ssh => 79:xx:xx:xx:xx:9d:8f:51:xx:2b:xx:27:xx:xx:xf:xx

此外OAuth token只会在你配置完github的Personal access tokens后才会生成,并且只会出现一次,但你可以重新生成或者再创建一个token。所以个人建议再新建token,方便权限管理,同时避免token修改后使用原token的应用重新配置。
项目安装完成后配置nginx服务器。注意yii2与laravel美化url的参数不同。此后访问相应地址即可。

 location / {
        try_files $uri $uri/ /index.php?$args;
    }

目录结构

yii2与laravel目录结构类似

basic/                  应用根目录
    composer.json       Composer 配置文件, 描述包信息
    config/             包含应用配置及其它配置
        console.php     控制台应用配置信息
        web.php         Web 应用配置信息
    commands/           包含控制台命令类
    controllers/        包含控制器类
    models/             包含模型类
    runtime/            包含 Yii 在运行时生成的文件,例如日志和缓存文件
    vendor/             包含已经安装的 Composer 包,包括 Yii 框架自身
    views/              包含视图文件
    web/                Web 应用根目录,包含 Web 入口文件
        assets/         包含 Yii 发布的资源文件(javascript 和 css)
        index.php       应用入口文件
    yii                 Yii 控制台命令执行脚本

HELLO YII2

由于yii2也采用mvc模式,所以同样拥有视图,模型与控制器。

  • 视图文件
    layouts文件夹存放布局文件;
    site文件夹存放页面文件
  • 控制器文件
    控制器文件位于controllers目录下,命名规则为(类似驼峰命名):
    控制器名+Controller => SiteController.php
    与laravel类似,但控制器中部分方法名有特殊意义(类似驼峰命名)。
    action+操作名 => actionSay($message){}
    此方法可使用户通过路由进行访问,如
    index.php?r=site/say&message=Hello+World
    其中r为路由,site/say为SiteController@actionSay,这点与laravel不同 ,message=Hello+World为actionSay($message)的参数

使用表单

  • model文件
    位于models文件夹下,model类的命名空间为
namespace app\models;

其中app为预定义别名,与laravel中别名相似,可用以下方法定义

Yii::setAlias('@foo', '/path/to/foo');

[[yii\base\Model]] 被用于普通模型类的父类并与数据表无关。[[yii\db\ActiveRecord]] 通常是普通模型类的父类但与数据表有关联,[[yii\db\ActiveRecord]] 类其实也是继承自 [[yii\base\Model]],增加了数据库处理,与laravel的model类相似。

<?php
namespace app\models;
use yii\base\Model;
class EntryForm extends Model
{
    public $name;
    public $email;

    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}

其中rules()功能与larvel的过滤类似,只是写法上不太一样。而且如果有数据验证失败,yii2将把 [[yii\base\Model::hasErrors|hasErrors]] 属性设为 ture,想要知道具体发生什么错误就调用 [[yii\base\Model::getErrors|getErrors]]。

  • 修改控制器
<?php
namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\EntryForm;
class SiteController extends Controller
{
    // ...其它代码...
    public function actionEntry()
    {
        $model = new EntryForm;

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            // 验证 $model 收到的数据

            // 做些有意义的事 ...

            return $this->render('entry-confirm', ['model' => $model]);
        } else {
            // 无论是初始化显示还是数据验证错误
            return $this->render('entry', ['model' => $model]);
        }
    }
}

render('entry-confirm', ['model' => $model])意为将该模型$model(EntryForm)命名为model并提交到entry-confirm.php页面进行渲染。

  • view页面
    创建entry-confirm.php与entry.php页面
    =>entry-confirm.php
<?php
use yii\helpers\Html;
?>
<p>You have entered the following information:</p>
<ul>
    <li><label>Name</label>: <?= Html::encode($model->name) ?></li>
    <li><label>Email</label>: <?= Html::encode($model->email) ?></li>
</ul>

=>entry.php

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name') ?>
    <?= $form->field($model, 'email') ->label('My Email') ?>
    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end(); ?>

视图使用了一个功能强大的小部件 [[yii\widgets\ActiveForm|ActiveForm]] 去生成 HTML 表单。其中的 begin() 和 end() 分别用来渲染表单的开始和关闭标签。在这两个方法之间使用了 [[yii\widgets\ActiveForm::field()|field()]] 方法去创建输入框。
yii2的前端渲染的写法有点类似jsp,个人感觉laravel的前端渲染框架要更加优雅。不过yii2的前端渲染与后端过滤协同,会分别对数据进行验证,这样在快速构建应用时会方便很多。

使用数据库

  • 填充测试数据
CREATE TABLE `country` (
  `code` CHAR(2) NOT NULL PRIMARY KEY,
  `name` CHAR(52) NOT NULL,
  `population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `country` VALUES ('AU','Australia',24016400);
INSERT INTO `country` VALUES ('BR','Brazil',205722000);
INSERT INTO `country` VALUES ('CA','Canada',35985751);
INSERT INTO `country` VALUES ('CN','China',1375210000);
INSERT INTO `country` VALUES ('DE','Germany',81459000);
INSERT INTO `country` VALUES ('FR','France',64513242);
INSERT INTO `country` VALUES ('GB','United Kingdom',65097000);
INSERT INTO `country` VALUES ('IN','India',1285400000);
INSERT INTO `country` VALUES ('RU','Russia',146519759);
INSERT INTO `country` VALUES ('US','United States',322976000);

按照官方文档的做法是直接使用sql语句去生成数据库,感觉没有laravel通过seed生成数据方便,应该是两个框架的侧重点不同吧。

  • 数据库连接配置
    修改config/db.php如下,写法与jdbc类似
return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];
  • 创建model
    创建一个继承自活动记录类的类 Country,把它放在 models/Country.php文件,去代表和读取 country表的数据。
<?php
namespace app\models;
use yii\db\ActiveRecord;
class Country extends ActiveRecord
{
}

这个类使用了yii2的ActiveRecord,增加了数据库处理,这个就与laravel中所介绍的model类一样了,不过yii2这个例子并没有具体描述该类,而是直接留空,根据文档中的介绍是:Yii 就能根据类名去猜测对应的数据表名。

  • 创建控制器
    新控制器名为 CountryController,并在其中创建一个 index 操作。
<?php
namespace app\controllers;
use yii\web\Controller;
use yii\data\Pagination;
use app\models\Country;
class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();
        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);
        $countries = $query->orderBy('name')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();
        return $this->render('index', [
            'countries' => $countries,
            'pagination' => $pagination,
        ]);
    }
}

不同框架ORM函数名与写法稍有不同,但功能上大题应该一致。

  • 创建视图
    在 views 目录下先创建一个名为 country 的子目录。这个目录存储所有由 country 控制器渲染的视图。在 views/country 目录下创建一个名为 index.php 的视图文件,内容如下:
<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
    <li>
        <?= Html::encode("{$country->name} ({$country->code})") ?>:
        <?= $country->population ?>
    </li>
<?php endforeach; ?>
</ul>
<?= LinkPager::widget(['pagination' => $pagination]) ?>

视图中使用 [[yii\widgets\LinkPager]] 去渲染从操作中传来的分页信息。
yii2这边控制器与视图之间通过控制器名与视图的文件夹相互绑定,与laravel的控制器中指定视图文件路径稍有不同。

使用 Gii

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = [
        'class' => 'yii\debug\Module',
        'allowedIPs' => ['127.0.0.1', '::1','192.168.10.1'],
        // uncomment the following to add your IP if you are not connecting from localhost.
        //'allowedIPs' => ['127.0.0.1', '::1'],
    ];

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1','192.168.10.1'],
        // uncomment the following to add your IP if you are not connecting from localhost.
        //'allowedIPs' => ['127.0.0.1', '::1'],
    ];
}

yii2自带的调试工具与laravel的Debugbar 扩展包功能类似,但功能上似乎多一点,不过这个调试工具不能在页面上改变大小,有点不方便。
Gii是一个代码生成器,功能十分强大,给我有种点几下鼠标就能快速构建应用的感觉。

END

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • Composer 基本用法 // 安装yii程序 composercreate-project--prefer-d...
    热过豆腐干阅读 1,242评论 0 4
  • 配置 修改config/database.php在connection数组中添加mongodb的配置信息,如下 '...
    jooohnny阅读 8,413评论 3 8
  • 包管理Package Management Libraries for package and dependenc...
    CaptainKK阅读 5,973评论 5 50
  • 嘘……告诉你培训机构内幕 做小吃要结合当地人的饮食习惯,生活习俗,消费标准,还有自己的目标人群定位。 第一步先决定...
    轻轻飘过阅读 600评论 14 5
  • 不知道大家有没有这样的体验,当你在其他地方下载文件的时候,你家的网速可以达到几兆每秒,但是当你去百度云下载文件的时...
    西米人二阅读 775评论 2 1