yii 学习笔记 基本操作

前置知识

php yii是一个php框架,要确保熟悉类与对象及命名空间

安装

通过归档文件安装

从 yiiframework.com 下载归档文件
将下载的文件解压缩到 Web 访问的文件夹中
将 basic/web 设置为文档根目录(document root)

运行

yii 学习笔记 基本操作

应用结构

yii 学习笔记 基本操作
yii 学习笔记 基本操作

每个应用都有一个入口脚本web/index.php,这是整个应用中唯一可以访问的php脚本,入口脚本接受一个web请求并创建应用实例去处理它
应用在它的组件辅助下解析请求,并分派请求至mvc元素
视图使用小部件去创建复杂和动态的用户界面

请求生命周期

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

说声hello

如何创建一个动作去响应请求
如何创建一个视图去构造响应内容
以及一个应用如何分派请求给动作

创建动作

操作必须声明在控制器中,为了简单起见,直接在SiteController控制器里声明say操作。这个控制器是由文件controllers/SiteController.php定义的

<?php
namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    //  ...现存的代码...
    // 为了hello,需要创建一个say操作,
    // 从请求中接收message参数并显示给最终用户
    // 如果请求没有message参数,操作将显示默认参数Hello
    // say操作被定义为actionSay方法
    // Yii使用action前缀区别普通方法和操作
    // action前缀后面的名称被映射为操作的id
    public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
}

给操作命名时,要先理解yii处理操作id。操作id总是被以小写处理。如果一个操作id由多个单词组成,单词之间将由连字符连接(如create-comment)。操作id映射为方法名时移除了连字符,将第一个单词首字母大写,并加上action前缀。如操作id create-comment相当于方法名actionCreateComment

在操作方法中,render()被用来渲染一个名为say的视图文件。message参数也被传入视图,这样就可以在里面使用。操作方法会返回渲染结果。结果会被应用接收并显示给最终用户的浏览器

当操作中调用了render()方法时,它将会按views/控制器ID/视图名.php路径加载php文件

创建视图

views/site/say.php
message参数被输出之前被html-encoded方法处理过
因为参数中可能隐含的恶意js代码会导致跨站脚本xss攻击

<?php
use yii\helpers\Html;
?>
<?= Html::encode($message) ?>

say视图脚本输出的内容将会响应结果返回给应用。应用将依次输出结果给最终用户

试运行

http://hostname/index.php?r=site/say&message=Hello+World

会输出hello world的页面

新页面和其它页面使用同样的头部和尾部是因为render()方法会自动把say视图执行的结果嵌入称为布局的文件中,本例中是views/layouts/main.php

上面url参数r代表路由,指向特定操作的独立id。路由格式是控制器id/操作id。应用接受请求的时候会检查参数,使用控制器id去确定哪个控制器被用来处理请求。然后相应控制器将使用操作id去确定哪个操作方法将被用来做具体工作。上述例子中,路由site/say将被解析至SiteController控制器和基本的say操作

使用表单

创建一个让用户提交数据的表单页
为了实现这个目标,需要创建一个操作和两个视图外,还需要创建一个模型

创建模型

models/EntryForm.php

namespace app\models;
use Yii;
use yii\base\Model;
class EntryForm extends Model
{
    public $name;
    public $email;
    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}

上面声明的验证规则表示
name和email值必填
email的值必须满足email规则验证

$model = new EntryForm();
$model->name = 'qiang';
$model->email = 'bad';
//使用validate方法触发数据验证
if ($model->validate()) {
    //成功
} else {
    //失败
    //如果有数据验证失败,将把hasErrors属性设true,想知道具体发生什么错误就调用getErrors
}

创建动作

con/SiteController

class SiteController extends Controller
{
    public function actionEntry()
    {
        //用户提交表单后,
        //操作将会渲染一个名为entry-confirm的视图去确认用户输入的数据,
        //如果没填表单就提交,或数据验证不通过,entry视图将会渲染输出
        $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]);
        }
    }
}

创建视图

site/entry-confirm.php
entry-confirm视图简单地显示提交的name和email数据

<?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视图显示一个HTML表单
site/entry.php
使用了小部件ActiveForm生成html表单
先用begin()和end()分别用来渲染表单的开始和关闭标签
在这两个方法之间使用了field()方法创建输入框
最后使用yii\helpers\Html::submitButton()方法生成提交按钮

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?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(); ?>

用浏览器访问看是否工作

yii 学习笔记 基本操作

效果说明

没输入正确的信息时不需要刷新页面就能给出错误提示
其实数据首先由客户端js脚本验证,然后才会提交给服务器通过php验证
警告:客户端验证是提高用户体验手段,无论是否启用,服务端验证都是必须的

输入框的文字标签是field()方法生成的,内容就是模型中该数据的属性名,例如模型中name属性生成的标签就是Name,当然这些都是可以自定义的

<?= $form->field($model, 'name') -> label('自定义 Name')?>
<?= $form->field($model, 'email') -> label('自定义 email')?>

使用数据库

创建一个从数据表country中读取数据并显示

准备数据库

创建一个名为yii2basic的数据库
然后在数据库中创建一个名为 country 的表并插入简单的数据。可以执行下面的语句:

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);

配置数据库连接

config/db.php

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

上面的数据库连接可以在应用中通过Yii::$app->db表达式访问

持续更新中……

上一篇:MySQL高级篇——索引


下一篇:static关键字和继承