Yii学习笔记(一)

Yii的安装

启动服务

检查yii项目的所有依赖:

对于每个应用而言,都有一个入口脚本 web/index.php,这是整个应用中唯一可以访问的 PHP 脚本。

Yii应用的执行过程

Yii应用执行过程

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

Hello World

创建操作

为了 “Hello”,需要创建一个 say 操作,从请求中接收 message 参数并显示给最终用户。
如果请求没有提供 message 参数, 操作将显示默认参数 “Hello”。

注意:操作是最终用户可以直接访问并执行的对象。 操作被组织在控制器中。 一个操作的执行结果就是最终用户收到的响应内容。

操作必须声明在控制器中。

controllers/SiteController.php中,say操作被定义为 actionSay方法。
yii中 action前缀用于区分普通方法和操作,前缀后面的名称被映射为操作的ID。
操作ID与方法名的映射关系,看一个例子就明白了。操作IDcreate-comment,映射到相应的方法名为:actionCreateComment
yii\web\Controller::render() 被用于视图文件的渲染。

创建视图

say 视图应该存为 views/site/say.php 文件。
当一个操作中调用了 yii\web\Controller::render() 方法时, 它将会按 views/控制器 ID/视图名.php 路径加载 PHP 文件,
并且该方法会 自动把 say 视图执行的结果嵌入称为布局的文件中, 本例中是 views/layouts/main.php

yii\helpers\Html::encode() 方法可以避免 跨站脚本(XSS)攻击。

此时,访问/index.php?r=site/say&message=wenlie 就能看到 wenlie

URL 中的参数 r 代表路由,是整个应用级的,指向特定操作的独立 ID。
路由格式是 控制器 ID/操作 ID。
应用接受请求的时候会检查参数, 使用控制器 ID 去确定哪个控制器应该被用来处理请求。
然后相应控制器将使用操作 ID 去确定哪个操作方法将被用来做具体工作。
上述例子中,路由 site/say 将被解析至 SiteController 控制器和其中的 say 操作。 因此 SiteController::actionSay() 方法将被调用处理请求。

控制器ID操作ID 使用同样的命名规则。如: 控制器 ID post-comment 相当于控制器类名 PostCommentController

创建模型

模型类 EntryForm 代表从用户那请求的数据, 该类存储在 models/EntryForm.php 文件中。

yii\base\Model 被用于普通模型类的父类并与数据表无关。
yii\db\ActiveRecord 通常是普通模型类的父类但与数据表有关联,它其实也是继承自 yii\base\Model,增加了数据库处理。
rules() 的方法, 用来返回数据验证规则的集合。

调用yii\base\Model::validate() 方法会触发数据验证。

Yii 的 yii\web\Request::post() 方法负责从 $_POST 搜集用户提交的数据。
Yii::$app 代表应用实例, 它是一个全局可访问的单例。同时它也是一个服务定位器, 能提供 requestresponsedb 等等特定功能的组件。

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

视图使用了 yii\widgets\ActiveForm 去生成 HTML 表单。
其中的 begin() 和 end() 分别用来渲染表单的开始和关闭标签。
在这两个方法之间使用了 yii\widgets\ActiveForm::field() 方法去创建输入框。
第一个输入框用于 “name”,第二个输入框用于 “email”。
之后使用 yii\helpers\Html::submitButton() 方法生成提交按钮。