💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[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; } ```