更好的 Debug 函数 dd => dda

35

dd 函数用来看变量类型很有帮助,但是有时候我们要查看 Eloquent 数据时,输出是这样的:

Book {#399 ▼
  #fillable: array:10 [▶]
  #connection: null
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  #perPage: 15
  +incrementing: true
  +timestamps: true
  #attributes: array:13 [▶]
  #original: array:13 [▶]
  #relations: []
  #hidden: []
  #visible: []
  #appends: []
  #guarded: array:1 [▶]
  #dates: []
  #dateFormat: null
  #casts: []
  #touches: []
  #observables: []
  #with: []
  +exists: true
  +wasRecentlyCreated: false
}

使用以下函数 dda

function dda($model)
{
    if (method_exists($model, 'toArray')) {
        dd($model->toArray());
    } else {
        dd($model);
    }
}

就能得到我们想要的:

array:13 [▼
  "id" => 1
  "name" => "name"
  "user_id" => 1
  "created_at" => "2017-04-18 06:48:42"
  "updated_at" => "2017-04-18 06:48:42"
]

dda 等于: dd to array

讨论数量: 10
leo

可以写得更通用一些:

function dda($model)
{
    if (method_exists($model, 'toArray')) {
        dd($model->toArray());
    } else {
        dd($model);
    }
}
2个月前

dda
读作
滴答

2个月前
96qbhy

是不是改成 instanceof laravel 的arrayable 更好,因为搞不好这个 toArray 需要参数。

2个月前
jltxwesley

Arrayable接口:

interface Arrayable
{
    /**
     * Get the instance as an array.
     *
     * @return array
     */
    public function toArray();
}

从接口可以看出:toArray是不需要参数的

Eloquent Model 是实现这个接口的:abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable,所以toArray方法在 Model 里是存在的而且不需要参数的:

    /**
     * Convert the model instance to an array.
     *
     * @return array
     */
    public function toArray()
    {
        return array_merge($this->attributesToArray(), $this->relationsToArray());
    }

LEO 的写法就像他说的更通用,以防toArray方法不存在.

2个月前

阔以啊

2个月前

可以换一个名字吗

2个月前

@jltxwesley 我觉得 @96qbhy 说的有道理,toArray 也有可能是自定义的的方法

1个月前
96qbhy

@yanthink 对,我的意思就是防止一些用户是自定义toArray方法的,没有继承 Arrayable 接口就不自动执行 toArray ,这才符合接口的定义。

1个月前

这样是不是更加强大一些:


function dda(...$args)
{
    foreach($args as &$x){
        if (method_exists($x, 'toArray')) {
            $x = $x->toArray();
        }
    }
    dd(...$args);
}
1个月前
panda-sir

哈哈 看了下评论 函数名字成槽点 :smirk:

3周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!