[TOC]
# 模型行为
行为是多个模型可以采用的共享结构,以便重用代码。ORM提供了一个API来实现模型中的行为。此外,您可以使用前面提到的事件和回调作为更自由地实现行为的替代方法。
必须在模型初始值设定项中添加行为,模型可以包含零个或多个行为:
```php
<?php
use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Behavior\Timestampable;
class Users extends Model
{
public $id;
public $name;
public $created_at;
public function initialize()
{
$this->addBehavior(
new Timestampable(
[
'beforeCreate' => [
'field' => 'created_at',
'format' => 'Y-m-d',
]
]
)
);
}
}
```
框架提供以下内置行为:
| 名称 |描述 |
| ------------- | ---------------------------------------------------------------------------------------------------------- |
| Timestampable |允许在创建或更新记录时自动更新模型的属性,以保存日期时间 |
| SoftDelete | 它不是永久删除记录,而是将记录标记为已删除,从而更改标志列的值 |
## 时间戳
此行为接收一组选项,第一级键必须是一个事件名称,指示何时必须分配列:
```php
<?php
use Phalcon\Mvc\Model\Behavior\Timestampable;
public function initialize()
{
$this->addBehavior(
new Timestampable(
[
'beforeCreate' => [
'field' => 'created_at',
'format' => 'Y-m-d',
]
]
)
);
}
```
每个事件都有自己的选项,`field`是必须更新的列的名称,如果`format`是一个字符串,它将被用作PHP [date](http://php.net/manual/en/function.date.php) 函数的格式,`format`也可以是一个匿名函数,为您提供免费生成任何时间戳:
```php
<?php
use DateTime;
use DateTimeZone;
use Phalcon\Mvc\Model\Behavior\Timestampable;
public function initialize()
{
$this->addBehavior(
new Timestampable(
[
'beforeCreate' => [
'field' => 'created_at',
'format' => function () {
$datetime = new Datetime(
new DateTimeZone('Europe/Stockholm')
);
return $datetime->format('Y-m-d H:i:sP');
}
]
]
)
);
}
```
如果省略选项`format` ,将使用PHP [time](http://php.net/manual/en/function.time.php) 函数的时间戳。
## 软删除
此行为可以使用如下:
```php
<?php
use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Behavior\SoftDelete;
class Users extends Model
{
const DELETED = 'D';
const NOT_DELETED = 'N';
public $id;
public $name;
public $status;
public function initialize()
{
$this->addBehavior(
new SoftDelete(
[
'field' => 'status',
'value' => Users::DELETED,
]
)
);
}
}
```
此行为接受两个选项:`field`和`value`,`field`确定必须更新的字段并为要删除的`value`赋值。让我们假装`users`表有以下数据:
```sql
mysql> select * from users;
+----+---------+--------+
| id | name | status |
+----+---------+--------+
| 1 | Lana | N |
| 2 | Brandon | N |
+----+---------+--------+
2 rows in set (0.00 sec)
```
如果我们删除两条记录中的任何一条,状态将被更新而不是删除记录:
```php
<?php
Users::findFirst(2)->delete();
```
该操作将导致表中的以下数据:
```sql
mysql> select * from users;
+----+---------+--------+
| id | name | status |
+----+---------+--------+
| 1 | Lana | N |
| 2 | Brandon | D |
+----+---------+--------+
2 rows in set (0.01 sec)
```
请注意,您需要在查询中指定已删除的条件,以便将它们有效地忽略为已删除的记录,此行为不支持此操作。
## 创建自己的行为
ORM提供了一个API来创建自己的行为。行为必须是实现`Phalcon\Mvc\Model\BehaviorInterface`的类。此外, `Phalcon\Mvc\Model\Behavior`提供了简化行为实现所需的大多数方法。
以下行为是一个示例,它实现了Blameable行为,该行为有助于识别对模型执行操作的用户:
```php
<?php
use Phalcon\Mvc\Model\Behavior;
use Phalcon\Mvc\Model\BehaviorInterface;
class Blameable extends Behavior implements BehaviorInterface
{
public function notify($eventType, $model)
{
switch ($eventType) {
case 'afterCreate':
case 'afterDelete':
case 'afterUpdate':
$userName = // ... get the current user from session
// Store in a log the username, event type and primary key
file_put_contents(
'logs/blamable-log.txt',
$userName . ' ' . $eventType . ' ' . $model->id
);
break;
default:
/* ignore the rest of events */
}
}
}
```
前者是一个非常简单的行为,但它说明了如何创建行为,现在让我们将此行为添加到模型中:
```php
<?php
use Phalcon\Mvc\Model;
class Profiles extends Model
{
public function initialize()
{
$this->addBehavior(
new Blameable()
);
}
}
```
行为还能够拦截模型上缺少的方法:
```php
<?php
use Phalcon\Tag;
use Phalcon\Mvc\Model\Behavior;
use Phalcon\Mvc\Model\BehaviorInterface;
class Sluggable extends Behavior implements BehaviorInterface
{
public function missingMethod($model, $method, $arguments = [])
{
// If the method is 'getSlug' convert the title
if ($method === 'getSlug') {
return Tag::friendlyTitle($model->title);
}
}
}
```
在实现Sluggable的模型上调用该方法返回一个SEO友好标题:
```php
<?php
$title = $post->getSlug();
```
## 使用Traits作为行为
您可以使用[Traits](http://php.net/manual/en/language.oop5.traits.php)重用类中的代码,这是实现自定义行为的另一种方法。以下特征实现了Timestampable行为的简单版本:
```php
<?php
trait MyTimestampable
{
public function beforeCreate()
{
$this->created_at = date('r');
}
public function beforeUpdate()
{
$this->updated_at = date('r');
}
}
```
然后您可以在模型中使用它,如下所示:
```php
<?php
use Phalcon\Mvc\Model;
class Products extends Model
{
use MyTimestampable;
}
```
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持