安装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
- 修改配置
在 config/web.php 文件添加可以访问gii与调试工具的ip,然后访问相应网页即可http://192.168.10.10:100/index.php?r=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是一个代码生成器,功能十分强大,给我有种点几下鼠标就能快速构建应用的感觉。