美文网首页
YII2入门学习记录

YII2入门学习记录

作者: 某不科学的XX | 来源:发表于2017-07-16 15:21 被阅读0次

    安装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

    相关文章

      网友评论

          本文标题:YII2入门学习记录

          本文链接:https://www.haomeiwen.com/subject/edighxtx.html