pub trait Appendable: BaseModel + Accessor {
// Required methods
fn append_state(&self) -> &AppendState;
fn append_state_mut(&mut self) -> &mut AppendState;
// Provided methods
fn append_dyn(&mut self, fields: Vec<String>) -> &mut Self { ... }
fn append_merge(&mut self, fields: Vec<String>) -> &mut Self { ... }
fn effective_append(&self) -> Vec<String> { ... }
fn to_json_with_append_cached(&mut self) -> Value { ... }
}Expand description
Appendable trait — 对齐 PHP append() + getAttr() 统一派发
业务模型实现此 trait 获得:
- 动态 append 能力(覆盖/合并,对齐 PHP
Conversion.php第 88-97 行) - append 字段走
get_attr缓存(对齐 PHPConversion.php第 292 行 +Attribute.php第 475-486 行)
§与 BaseModel 的关系
BaseModel::to_json_with_append():无缓存版本,走get_appended_value(独立路径)Self::to_json_with_append_cached():带缓存版本,走get_attr(统一路径,完全对齐 PHP)
业务模型按需实现 Appendable 获得完整 PHP 对齐能力。
§PHP 对齐
| PHP 方法 | Rust 等价 | 说明 |
|---|---|---|
$this->append | AppendState | 动态 append 状态 |
append($fields) | Self::append_dyn() | 覆盖模式(默认) |
append($fields, true) | Self::append_merge() | 合并模式 |
toArray() 中 append 循环 | Self::to_json_with_append_cached() | 走 getAttr 缓存 |
Required Methods§
Sourcefn append_state(&self) -> &AppendState
fn append_state(&self) -> &AppendState
取动态 append 状态
Sourcefn append_state_mut(&mut self) -> &mut AppendState
fn append_state_mut(&mut self) -> &mut AppendState
取可变动态 append 状态
Provided Methods§
Sourcefn append_dyn(&mut self, fields: Vec<String>) -> &mut Self
fn append_dyn(&mut self, fields: Vec<String>) -> &mut Self
动态 append(覆盖模式,对齐 PHP $model->append($fields))
默认覆盖静态 BaseModel::append(),返回 &mut Self 支持链式调用
(对齐 PHP Conversion.php 第 96 行 return $this)。
Sourcefn append_merge(&mut self, fields: Vec<String>) -> &mut Self
fn append_merge(&mut self, fields: Vec<String>) -> &mut Self
动态 append(合并模式,对齐 PHP $model->append($fields, true))
PHP 语义(Conversion.php 第 91-93 行):array_merge($this->append, $fields)。
首次合并时 $this->append 为静态默认值,需保留;后续合并累加到当前动态字段。
Sourcefn effective_append(&self) -> Vec<String>
fn effective_append(&self) -> Vec<String>
获取生效的 append 字段列表
优先级:动态 append > 静态 BaseModel::append()
对齐 PHP $this->append(动态覆盖后静态失效)
Sourcefn to_json_with_append_cached(&mut self) -> Value
fn to_json_with_append_cached(&mut self) -> Value
序列化为 JSON(包含 append 字段,走访问器缓存)
对齐 PHP toArray() 第 234-236 行 + Attribute.php getAttr:
- 先取基础
to_json(已应用 hidden 过滤) - 对每个生效 append 字段调用
get_attr(带缓存) - append 字段始终输出(无访问器返回
null,对齐 PHP 第 292 行) - append 字段绕过 hidden 过滤(PHP bug 复刻,对齐第 291-296 行)
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".