gpt4 book ai didi

php - Laravel 如何在使用 tinker CLI 时查找和显示 Eloquent 模型上的动态属性?

转载 作者:行者123 更新时间:2023-12-05 06:13:44 26 4
gpt4 key购买 nike

当我们使用 artisan tinker ,并引用一个 Eloquent 模型对象,REPL 会自动打印模型的属性,就像它打印我们引用的任何标准对象的公共(public)属性一样:

>>> (object) ['hello' => 'world']
=> {
+"hello": "world",
}

>>> App\User::first()
=> App\User {
id: 1,
name: "...",
}

对我来说不太明显的是如何可以使这些虚拟属性出现在这里,就好像它们已经被定义为类的公共(public)属性一样。我知道模型的大部分属性分配都是由 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 在打印这样的对象时使用的表示形式?

最佳答案

决定如何在 Tinker 中显示模型属性的代码在 Tinker 代码中,而不是在模型中:

脚轮是 Symfony VarDumper component 的一部分由 PsySH 使用显示类。 Tinker 建立在 PsySH 之上。

Tinker 将脚轮映射到其控制台命令类中的类:

这会将类的映射返回到它们的施法者:

/**
* Get an array of Laravel tailored casters.
*
* @return array
*/
protected function getCasters()
{
$casters = [
'Illuminate\Support\Collection' => 'Laravel\Tinker\TinkerCaster::castCollection',
'Illuminate\Support\HtmlString' => 'Laravel\Tinker\TinkerCaster::castHtmlString',
'Illuminate\Support\Stringable' => 'Laravel\Tinker\TinkerCaster::castStringable',
];

if (class_exists('Illuminate\Database\Eloquent\Model')) {
$casters['Illuminate\Database\Eloquent\Model'] = 'Laravel\Tinker\TinkerCaster::castModel';
}

if (class_exists('Illuminate\Foundation\Application')) {
$casters['Illuminate\Foundation\Application'] = 'Laravel\Tinker\TinkerCaster::castApplication';
}

return $casters;
}

这会在 VarDumper 上设置脚轮:

        $config->getPresenter()->addCasters(
$this->getCasters()
);

如果您想添加模型的其他属性以在 Tinker 中显示,您可以使用 $ appends模型属性:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['is_admin'];
}

关于php - Laravel 如何在使用 tinker CLI 时查找和显示 Eloquent 模型上的动态属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63165725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com