Browse Tag: 框架

yii2 行为

behavior 是 yii\base\Behavior 或其子类的实例, behavior,可以无须改变类继承关系即可增强一个已有的 yii\base\Component 类功能。当行为附加到组件后,它将“注入”它的方法和属性到组件,然后可以像访问组件内定义的方法和属性一样访问它们。 此外,行为通过组件能响应被触发的事件, 从而自定义或调整组件正常执行的代码。

定义行为

~/yiint/components/MyBehavior.php

以上代码定义了行为类 @app\components\MyBehavior 并为要附加行为的组件提供了两个属性 prop1 、 prop2 和一个方法 foo()。

附加行为

静态附加行为

覆写行为要附加的组件类的 yii\base\Component::behaviors() 方法, 返回行为配置列表。

每个行为配置格式:

动态附加行为

在对应组件里调用 yii\base\Component::attachBehavior() 方法

可以通过 yii\base\Component::attachBehaviors() 方法一次附加多个行为:

使用行为

将behavior 附加到 yii\base\Component 类或其子类后就可以直接使用它。

行为对象

附加行为到组件时的命名行为, 可以使用这个名称来访问行为对象

移除行为

要移除行为,可以调用 yii\base\Component::detachBehavior() 方法用行为相关联的名字实现:

使用 TimestampBehavior

yii\behaviors\TimestampBehavior 行为支持在 yii\db\ActiveRecord 存储时自动更新它的时间戳属性。

首先,附加这个行为到计划使用该行为的 yii\db\ActiveRecord 类:

以上指定的行为数组:

当记录插入时, 行为将当前的 UNIX 时间戳赋值给 created_at 和 updated_at 属性;

当记录更新时,行为将当前的 UNIX 时间戳赋值给 updated_at 属性。

保存 User 对象, 将会发现它的 created_at 和 updated_at 属性自动填充了当前时间戳:

处理事件

如果要让行为响应对应组件的事件触发, 就应覆写 yii\base\Behavior::events() 方法,如:

yii\base\Behavior::events() 方法返回事件列表和相应的处理器。 上例声明了 yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE 事件和它的处理器 beforeValidate()

yii2 表单使用

准备代码文件

form/entry.php

在视图中生成一个 HTML 表单

声明规则去验证输入的数据

创建一个模型代表用户通过表单输入的数据

表单与输入框字段

视图使用小部件 yii\widgets\ActiveForm 去生成 HTML 表单。 其中的 begin() 和 end() 分别用来渲染表单的开始和关闭标签。

yii\widgets\ActiveForm::field() 方法用于创建输入框。

表单字段

代码探析

ActiveForm 类图与代码解析

是的,其实数据首先由客户端 JavaScript 脚本验证,然后才会提交给服务器通过 PHP 验证。 yii\widgets\ActiveForm 足够智能到把你在 EntryForm 模型中声明的验证规则转化成客户端 JavaScript 脚本去执行验证。 如果用户浏览器禁用了 JavaScript, 服务器端仍然会像 actionEntry() 方法里这样验证一遍数据。 这保证了任何情况下用户提交的数据都是有效的。

输入框的文字标签是 field() 方法生成的,内容就是模型中该数据的属性名。 例如模型中的 name 属性生成的标签就是 Name。

输入验证

FormController.php

yii2 从控制器到展示

新建 Controller

1> 手动添加

在yii项目 controllers 目录下添加 controller 文件。

app\controllers\NoteController.php

2> web gii 生成

http://yiint.local.com/index.php?r=gii

Controller Class 栏中填入控制器路径,如下:

点击 Preview,确认无误后点击 Generate,会显示生成结果。如果生成失败,应该是php-fpm 对 app\controllers 路径没有写权限,将 app\controllers 改为 777 权限后重试即可。最后进入新生成的控制器页面

app\controllers\WebgiiController.php

3> 终端 yii gii 生成

项目目录下,使用yii 命令生成控制器

新建 action

app\controllers\NoteController.php

Yii 使用 action 前缀区分普通方法和可被web 使用的操作。 action 前缀后面的名称为操作请求参数。

操作命名

Yii 中操作名总是以小写处理,如果一个操作 ID 由多个单词组成, 单词之间将由连字符连接,如:

新建 view

yiint/views/note/hello.php

视图内容应该保存在 views/控制器名/视图名.php 文件中。通过控制器的 render() 方法加载视图文件。

打开页面 http://yiint.local.com/index.php?r=note/hello&name=world

路径

http://yiint.local.com/index.php?r=note/hello&name=world

路由格式是 ?r=控制器名/操作名&参数名=参数值

应用接受请求的时候会检查参数, 使用控制其名确定哪个控制器应该被用来处理请求。 然后相应控制器将使用操作名去确定哪个操作方法将被用来做具体工作。

这个链接中,路由 note/hello 将被解析至 NoteController 控制器中的 actionHello()

参考

  • 1
  • 2