【发布时间】:2020-11-19 18:13:25
【问题描述】:
当我们使用 artisan tinker 并引用 Eloquent 模型对象时,REPL 会自动打印模型的属性,就像它打印我们引用的任何标准对象的公共属性一样:
>>> (object) ['hello' => 'world']
=> {
+"hello": "world",
}
>>> App\User::first()
=> App\User {
id: 1,
name: "...",
}
对我来说不太明显的是如何这些虚拟属性可以出现在这里,就好像它们已经被定义为类的公共属性一样。我知道模型的大部分属性分配是由HasAttributes trait 在内部处理的,但是即使看那里,我仍然看不到 Laravel 的作者是如何实现这种行为的。
我尝试过构建这样的类:
class Bunch implements Arrayable, ArrayAccess, Jsonable, JsonSerializable { ... }
但即使使用有效的数组访问和toArray 方法,当我直接从artisan tinker 引用它时:
>>> $b = new Bunch()
=> Bunch {}
>>> $b->one = 1
=> 1
>>> $b['one']
=> 1
>>> $b
=> Bunch {}
我们如何改变 REPL 在打印这样的对象时使用的表示形式?
【问题讨论】:
标签: php laravel formatting laravel-artisan tinker