YII2 学习

下载地址:

http://www.yiiframework.com/download/

http://www.yiichina.com/download

直接选择basic模板下载即可

下载之后解压到www中即可

打开/config/web.php

找到cookieValidationKey,将它的值修改为jtthink(命名随意)

然后打开浏览器输入网址:http://localhost/basic/web  看到以下效果图说明安装成功

应用结构学习

# 第三方整理:
http://blog.csdn.net/lamp_yang_3533/article/details/52186829

# 官方整理:
http://www.yiichina.com/doc/guide/2.0/start-workflow

Yii 实现了模型-视图-控制器 (MVC)设计模式,这点在目录结构中也得以体现。 models 目录包含了所有模型类, views 目录包含了所有视图脚本, controllers 目录包含了所有控制器类。

生命周期学习

  1. 用户向入口脚本 web/index.php 发起请求。
  2. 入口脚本加载应用配置 并创建一个应用实例去处理请求。
  3. 应用通过请求组件 解析请求的路由
  4. 应用创建一个控制器实例去处理请求。
  5. 控制器创建一个操作实例并针对操作执行过滤器。
  6. 如果任何一个过滤器返回失败,则操作退出。
  7. 如果所有过滤器都通过,操作将被执行。
  8. 操作会加载一个数据模型,或许是来自数据库。
  9. 操作会渲染一个视图,把数据模型提供给它。
  10. 渲染结果返回给响应组件。
  11. 响应组件发送渲染结果给用户浏览器。

demo1 : Hello World

# 官方demo
http://www.yiichina.com/doc/guide/2.0/start-hello

通过本章节你将接触 MVC 设计模式中的控制器和视图部分。 创建了一个操作作为控制器的一部分去处理特定请求。然后又创建了一个视图去构造响应内容。 

1、创建操作

由文件/controllers/SayController.php 定义的。 以下是一个操作的声明:

<?php
namespace appcontrollers;
use yiiwebcontroller;

class SayController extends controller{
    public function actionSay($message = 'hello')
    {
        return $this->render('say',['message'=>$message]);
    }
}

say 操作被定义为 actionSay 方法。 Yii 使用 action 前缀区分普通方法和操作。

2、创建视图

say 视图应该存为 views/say/say.php 文件

<?php 
use yiihelpersHtml;
?>

<?= Html::encode($message) ?>

注意以上代码,message 参数在输出之前被 yiihelpersHtml::encode() 方法处理过。 这很有必要,当参数来自于最终用户时, 参数中可能隐含的恶意 JavaScript 代码会导致 跨站脚本(XSS)攻击。

3、试运行

创建完操作和视图后,你就可以通过下面的 URL 访问新页面了:

http://localhost/basic/web/index.php?r=say/say&message=Hello+World

上面 URL 中的参数 r 需要更多解释。 它代表路由,是整个应用级的, 指向特定操作的独立 ID。路由格式是 控制器 ID/操作 ID

DEMO2: 使用表单

# 官方demo
http://www.yiichina.com/doc/guide/2.0/start-forms

本demo介绍如何创建一个让用户提交数据的表单页。 该页将显示一个包含 name 输入框和 email 输入框的表单。 当提交这两部分信息后,页面将会显示用户所输入的信息。

1、创建模型

该类如下所示并存储在 models/EntryForm.php 文件中

<?php

namespace appmodels;

use Yii;
use yiiaseModel;

class EntryForm extends Model
{
    public $name;
    public $email;

    public function rules(){
        return [
            [['name','email'],'required'],
            ['email','email']
        ];
    }
}
  • name 和 email 值都是必填的
  • email 的值必须满足email规则验证

2、创建操作

由文件/controllers/EntryController.php 定义的。 以下是一个操作的声明:

<?php 

namespace appcontrollers;

use Yii;
use yiiwebController;
use appmodelsEntryForm;

class EntryController extends Controller{
    public function actionEntry(){
        $model = new EntryForm;

        if($model->load(Yii::$app->request->post()) && $model->validate()){
                return $this->render('entry-confirm',['model'=>$model]);
            } else {
                return $this->render('entry',['model' => $model]);
        }
    
    }
}

该操作首先创建了一个 EntryForm 对象。然后尝试从 $_POST 搜集用户提交的数据, 由 Yii 的 yiiwebRequest::post() 方法负责搜集。

注意:在这个简单例子里我们只是呈现了有效数据的确认页面。 实践中你应该考虑使用 yiiwebController::refresh() 或 yiiwebController::redirect() 去避免表单重复提交问题。

3、创建视图

最后创建两个视图文件 entry-confirm 和 entry。 他们会被刚才创建的 entry 操作渲染。

entry-confirm 视图简单地显示提交的 name 和 email 数据。视图文件保存在 views/site/entry-confirm.php

<?php
use yiihelpersHtml;
?>
<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 视图显示一个 HTML 表单。视图文件保存在 views/site/entry.php

<?php
use yiihelpersHtml;
use yiiwidgetsActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'name') ?>

    <?= $form->field($model, 'email') ?>

    <div class="form-group">
        <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
    </div>

<?php ActiveForm::end(); ?>

4、试运行

http://localhost/basic/web/index.php?r=entry/entry

你会看到一个包含两个输入框的表单的页面。 如果什么都不填就点击提交按钮,或填入格式不正确的 email 地址,将会看到在对应的输入框下显示错误信息。

输入有效的 name 和 email 信息并提交后, 将会看到一个显示你所提交数据的确认页面。

demo3:使用数据库

# 官方教程
http://www.yiichina.com/doc/guide/2.0/start-databases

本demo将介绍如何如何创建一个从数据表, 并且从中读取数据并显示到页面。 为了实现这个目标,你将会配置一个数据库连接,创建一个活动记录类, 并且创建一个操作及一个视图

1、准备数据库

在目录位置/config/db.php中修改配置

首先创建一个名为 yii2basic 的数据库,执行下面的sql语句

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',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IN','India',1013662000);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);

此时便有了一个名为 yii2basic 的数据库,在这个数据库中有一个包含三个字段的数据表 country,表中有十行数据。

 

2、创建活动记录

创建一个继承自活动记录类的类 Country, 把它放在 models/Country.php 文件,去代表和读取 country 表的数据。

<?php

namespace appmodels;

use yiidbActiveRecord;

class Country extends ActiveRecord
{
}

这个 Country 类继承自 yiidbActiveRecord。你不用在里面写任何代码。 只需要像现在这样,Yii 就能根据类名去猜测对应的数据表名。

3、创建操作

新建一个控制器,位于目录/Controllers/CountryController.php。控制器名为 CountryController,并在其中创建一个 index 操作,如下:

<?php

namespace appcontrollers;

use yiiwebController;
use yiidataPagination;
use appmodelsCountry;

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,
        ]);
    }
}

index 操作调用了活动记录 Country::find() 方法,去生成查询语句并从 country 表中取回所有数据。 为了限定每个请求所返回的国家数量,查询在 yiidataPagination 对象的帮助下进行分页。 Pagination 对象的使命主要有两点:

  • 为 SQL 查询语句设置 offset 和 limit 从句, 确保每个请求只需返回一页数据(本例中每页是 5 行)。
  • 在视图中显示一个由页码列表组成的分页器

在代码末尾,index 操作渲染一个名为 index 的视图, 并传递国家数据和分页信息进去。

4、创建视图

在 views 目录下先创建一个名为 country 的子目录。这个目录存储所有由 country 控制器渲染的视图。 在 views/country 目录下创建一个名为 index.php 的视图文件, 内容如下:

<?php
use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
<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]) ?>

 

试运行

浏览器访问下面的 URL 看看能否工作:

http://localhost/basic/web/index.php?r=country/index

点击翻页:

 

DEMO4:代码生成工具gii

# 官方教程
http://www.yiichina.com/doc/guide/2.0/start-gii

开始 Gii

Gii 是 Yii 中的一个模块。可以通过配置应用的 yiiaseApplication::modules 属性开启它。 通常来讲在 config/web.php 文件中会有以下配置代码:

$config = [ ... ];

if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yiigiiModule',
    ];
}

这段配置表明,如果当前是开发环境, 应用会包含 gii 模块,模块类是 yiigiiModule。

如果你检查应用的入口脚本 web/index.php, 将看到这行代码将 YII_ENV_DEV 设为 true:

defined('YII_ENV') or define('YII_ENV', 'dev');

鉴于这行代码的定义,应用处于开发模式下,按照上面的配置会打开 Gii 模块。你可以直接通过 URL 访问 Gii:

http://hostname/index.php?r=gii

生成 CRUD 代码

CRUD 代表增,查,改,删操作,这是绝大多数 Web 站点常用的数据处理方式。选择 Gii 中的 “CRUD Generator” (点击 Gii 首页的链接)去创建 CRUD 功能。本例 “country” 中需要这样填写表单:

  • Model Class: appmodelsCountry
  • Search Model Class: appmodelsCountrySearch
  • Controller Class: appcontrollersCountryController
  • View Path:可以不填,或者填写如下格式:@app/views/country

项目中如果已存在上述的文件夹和文件,建议先删除然后再进行下一步

点击 “Preview” 按钮,再点击“Generate”按钮即可

试运行

用浏览器访问下面的 URL 查看生成代码的运行:

http://hostname/index.php?r=country/index

 

DEMO5: 入口文件

# 官方教程
http://www.yiichina.com/doc/guide/2.0/structure-entry-scripts

入口脚本是应用启动流程中的第一环, 一个应用只有一个入口脚本。 终端用户的请求通过入口脚本实例化应用并将将请求转发到应用。

Web 应用的入口脚本必须放在终端用户能够访问的目录下, 通常命名为 index.php, 也可以使用 Web 服务器能定位到的其他名称。

以下是基础应用模版入口脚本的代码:

<?php

// 是否开启调试模式
defined('YII_DEBUG') or define('YII_DEBUG', true);

// 配置当前的开发环境
defined('YII_ENV') or define('YII_ENV', 'dev');

// 注册 Composer 自动加载器
require(__DIR__ . '/../vendor/autoload.php');

// 包含 Yii 类文件
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

// 加载应用配置
$config = require(__DIR__ . '/../config/web.php');

// 创建、配置、运行一个应用
(new yiiwebApplication($config))->run();
原文地址:https://www.cnblogs.com/CyLee/p/6323510.html