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 
注意

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类相似。

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

  • 修改控制器
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

You have entered the following information:

  • : name) ?>
  • : email) ?>

=>entry.php



    field($model, 'name') ?>
    field($model, 'email') ->label('My Email') ?>
    
'btn btn-primary']) ?>

视图使用了一个功能强大的小部件 [[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表的数据。

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

  • 创建控制器
    新控制器名为 CountryController,并在其中创建一个 index 操作。
 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 的视图文件,内容如下:

Countries

  • name} ({$country->code})") ?>: population ?>
$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是一个代码生成器,功能十分强大,给我有种点几下鼠标就能快速构建应用的感觉。

END

你可能感兴趣的:(YII2入门学习记录)