属性

属性代表业务数据。它们可以像数组元素或对象的属性那样来访问。一个模型的每个属性都是公开访问的属性。要指定模型拥有什么属性,应该重写yii\base\Model::attributes() 方法。

我们看一下基本应用程序模板中的 ContactForm 模型。

namespace app\models;

use Yii;

use yii\base\Model;

/**

* ContactForm is the model behind the contact form.

*/

class ContactForm extends Model {

public $name;

public $email;

public $subject;

public $body;

public $verifyCode;

/**

* @return array the validation rules.

*/

public function rules() {

return [

// name, email, subject and body are required

[['name', 'email', 'subject', 'body'], 'required'],

// email has to be a valid email address

['email', 'email'],

// verifyCode needs to be entered correctly

['verifyCode', 'captcha'],

];

}

/**

* @return array customized attribute labels

*/

public function attributeLabels() {

return [

'verifyCode' => 'Verification Code',

];

}

/**

* Sends an email to the specified email address using the information

collected by this model.

* @param string $email the target email address

* @return boolean whether the model passes validation

*/

public function contact($email) {

if ($this->validate()) {

Yii::$app->mailer->compose()

->setTo($email)

->setFrom([$this->email => $this->name])

->setSubject($this->subject)

->setTextBody($this->body)

->send();

return true;

}

return false;

}

}

?>

第1步 - 在 SiteController中创建一个 actionShowContactModel 函数并使用下面的代码。

public function actionShowContactModel() {

$mContactForm = new \app\models\ContactForm();

$mContactForm->name = "contactForm";

$mContactForm->email = "user@gmail.com";

$mContactForm->subject = "标题";

$mContactForm->body = "内容主体";

var_dump($mContactForm);

}

在上面的代码中,我们定义 ContactForm 表单模型,设置属性,并在屏幕上显示模型。

如模型是从 yii\base\Model 扩展,那么它的所有成员变量应该为公共且是非静态的属性。在 ContactForm 模型五个属性 - name, email, subject, body, verifyCode,也可以再添加一些新的。

属性标签

在应用中我们经常需要使用属性相关联来显示标签。默认情况下,属性标签由 yii\base\Model::generateAttributeLabel() 方法自动生成。要手动声明属性标签,可以覆盖yii\base\Model::attributeLabels() 方法。

注意,标签的名称与属性的名称相同。

步骤2 - 现在,中以下列方式修改在 ContactForm 模型中的 attributeLabels() 函数。

public function attributeLabels() {

return [

'name' => '名字',

'email' => '邮箱地址',

'subject' => '标题',

'body' => '内容',

'verifyCode' => '验证码',

];

}

模型使用在不同的场景

可以使用模型在不同的场景。 例如,当一个访问用户要发送一份联系表单,我们需要所有的模型属性。 当用户已经登录,我们并不需要他的名字,因为我们可以很容易地从数据库把它读取出来。

要声明场景,应该覆盖 scenarios() 函数。它返回一个数组,其键是场景名称而其值是 Active 属性。Active属性是用来来验证的。它们也可以被大量分配。

第1步 - 以下方式修改 ContactForm 模型。

namespace app\models;

use Yii;

use yii\base\Model;

/**

* ContactForm is the model behind the contact form.

*/

class ContactForm extends Model {

public $name;

public $email;

public $subject;

public $body;

public $verifyCode;

const SCENARIO_EMAIL_FROM_GUEST = 'EMAIL_FROM_GUEST';

const SCENARIO_EMAIL_FROM_USER = 'EMAIL_FROM_USER';

public function scenarios() {

return [

self::SCENARIO_EMAIL_FROM_GUEST => ['name', 'email', 'subject',

'body', 'verifyCode'],

self::SCENARIO_EMAIL_FROM_USER => ['email' ,'subject', 'body',

'verifyCode'],

];

}

/**

* @return array the validation rules.

*/

public function rules() {

return [

// name, email, subject and body are required

[['name', 'email', 'subject', 'body'], 'required'],

// email has to be a valid email address

['email', 'email'],

// verifyCode needs to be entered correctly

['verifyCode', 'captcha'],

];

}

/**

* @return array customized attribute labels

*/

public function attributeLabels() {

return [

'name' => '名字',

'email' => '电子邮箱',

'subject' => '标题',

'body' => '内容',

'verifyCode' => '验证码',

];

}

/**

* Sends an email to the specified email address using the information

collected by this model.

* @param string $email the target email address

* @return boolean whether the model passes validation

*/

public function contact($email) {

if ($this -> validate()) {

Yii::$app->mailer->compose()

->setTo($email)

->setFrom([$this->email => $this->name])

->setSubject($this->subject)

->setTextBody($this->body)

->send();

return true;

}

return false;

}

}

?>

我们增加了两个场景。一个用于访问游客用户,另一个用于身份验证的用户。当用户通过验证后,再不需要他填入名字。

第2步- 现在,修改 SiteController 的 actionContact 功能。

public function actionContact() {

$model = new ContactForm();

$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_GUEST;

if ($model->load(Yii::$app->request->post()) && $model->

contact(Yii::$app->params ['adminEmail'])) {

Yii::$app->session->setFlash('contactFormSubmitted');

return $this->refresh();

}

return $this->render('contact', [

'model' => $model,

]);

}

第4步 - 如果你在模式的 actionContact 动作中更改了场景。如下面给出的代码,你会发现 name 属性不再是必需的。

$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;

大量的分配

大规模的分配是通过一个单一的代码行创建多个输入模型属性的一种便捷方式。

如下的代码行 -

$mContactForm = new \app\models\ContactForm;

$mContactForm->attributes = \Yii::$app->request->post('ContactForm');

上面给出的代码行相当于-

$mContactForm = new \app\models\ContactForm;

$postData = \Yii::$app->request->post('ContactForm', []);

$mContactForm->name = isset($postData['name']) ? $postData['name'] : null;

$mContactForm->email = isset($postData['email']) ? $postData['email'] : null;

$mContactForm->subject = isset($postData['subject']) ? $postData['subject'] : null;

$mContactForm->body = isset($postData['body']) ? $postData['body'] : null;

前者干净多了。注意,大量分配仅适用于安全属性。它们只是在 scenario() 函数中列出当前场景属性。

数据导出

模型往往需要以不同的格式导出。要转模型转换为数组,则修改 SiteController 的 actionShowContactModel() 函数-

public function actionShowContactModel() {

$mContactForm = new \app\models\ContactForm();

$mContactForm->name = "用户名称";

$mContactForm->email = "user@gmail.com";

$mContactForm->subject = "标题";

$mContactForm->body = "内容";

var_dump($mContactForm->attributes);

}

要将模型转换成JSON格式,修改actionShowContactModel()函数如以下方式-

public function actionShowContactModel() {

$mContactForm = new \app\models\ContactForm();

$mContactForm->name = "username";

$mContactForm->email = "user@gmail.com";

$mContactForm->subject = "subject";

$mContactForm->body = "body-content";

return \yii\helpers\Json::encode($mContactForm);

}

浏览器输出 -

要点

模型通常是一个精心设计比控制器快得多的应用。模型应该-

包含业务逻辑

包含验证规则

包含属性

不嵌入HTML

不能直接访问请求

不要有太多的场景

php yii model,Yii模型相关推荐

  1. yii model层操作总结

    yii model层操作属性和方法总结. tableName – 设置Model所对应的表名,例如: public function tableName(){return 'gshop_order_e ...

  2. [Yii Framework] Yii如何实现前后台的session分离

    Yii Framework实现前后台frontend,backend分离的方法有几种,总结如下: 1. 分开入口文件 目录结构 index.php admin.php assets/ ...其它目录 ...

  3. php的yii简介,yii

    Yii Framework是一个基于组件.用于开发大型Web应用的高性能 PHP 框架.Yii提供了今日Web 2.0应用开发所需要的几乎一切功能.Yii是最有效率的PHP框架之一.Yii是创始人薛强 ...

  4. php 的 yii 框架,yii 框架的详情

    一.什么是yii框架 Yii读做易,可以看做是Yes it is的缩写.Yii有两种中文含义,1.极致简单.2.不断演变.Yii是一个基于组件.用于开发大型Web应用的高性能PHP框架.Yii提供了今 ...

  5. halcon 3D Object Model 三维物体模型算子,持续更新

    目录 3D Object Model 三维物体模型 Creation创建 1.clear_object_model_3d 2.copy_object_model_3d 3. deserialize_o ...

  6. php7 viewmodel,【初念科技】| php框架实例: Laravel之Model Observer模型

    原标题:[初念科技]| php框架实例: Laravel之Model Observer模型 本文主要学习下Laravel的Model Observer模型观察者,小编把自己的一点点经验分享出来希望对别 ...

  7. Multinomial Logit Model (MNL) 模型R语言nnet包multinom函数实现实例

    最近做项目涉及到要使用multinomial logit model (MNL) 模型.看了一堆文献讲mnl, 但是没有给什么具体能上手的实例,就算有也是一笔带过,打算找一些使用R 语言来实现mnl模 ...

  8. model.fit()模型编译时报错:ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type

    model.fit()模型编译时报错:ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type ...

  9. php+yii框架,yii框架源码分析(一)

    yii框架源码分析(一) 本文将对yii中的mvc,路由器,filter,组件机制等最主要的部分进行自己的一点浅析,力求说明自己做一个php mvc不是那么的遥不可及,其实是很简单的. 源码基于yii ...

最新文章

  1. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第2课2.6节隐藏和锁定对象...
  2. C语言关键字、标识符和注释
  3. 直击面试现场:程序员阿里应聘,2轮4小时成功搞定16Koffer!
  4. Building and running Node.js for Android
  5. AndroidAsync
  6. ListBox的使用
  7. CSS知识点个人总结(不断更新)
  8. Firewall配置
  9. php cors和jsonp,jsonp和CORS跨域实现
  10. 用java语言编写的操作系统属于_为什么操作系统不是用java编写的?
  11. 计算机科学技术编程基础教程
  12. python与数据挖掘 上机实验_python数据挖掘实验报告1
  13. 产品认证之IP防护等级
  14. Java开发快递物流项目(5)
  15. 名企工资一览表--最新更新
  16. centos系统下安装daemontools详细指南
  17. 题解 P4147 【玉蟾宫】
  18. Linux 服务器部署 vue(SPA) 与 nuxt(SSR)项目
  19. 云计算课程设计基于hadoop的词频统计设计
  20. 技术科普丨平台效果调试篇3-AWB Gain Adjust

热门文章

  1. IBASE archive pre-processing report RIBARCHV
  2. Workflow Administration
  3. 在SAP CRM webclient ui右上角显示系统时间
  4. 多除了1次100的FM BAPI_CURRENCY_CONV_TO_INTERN_9
  5. 部署在SAP ABAP服务器上的SAP UI5应用的JavaScript文件,是如何被SAP UI5 repository handler处理的
  6. 新浪微博WeiboManageAction的java实现
  7. OpenFOAM流固耦合问题-FsiFoam(foam-extend-4.0)运行tutorials的bug修复
  8. Cookie中不能有空格_PHP 使用cookie
  9. 基于html5游戏毕业设计数据流图,基于HTML5的网络拓扑图设计
  10. java猴子吃香蕉_Java 猴子分香蕉