Laravel 调试:更好的 Debug 函数 dd => dda 0 个改进

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

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 11
leo

可以写得更通用一些:

function dda($model)
{
    if (method_exists($model, 'toArray')) {
        dd($model->toArray());
    } else {
        dd($model);
    }
}
5年前 评论
leo

可以写得更通用一些:

function dda($model)
{
    if (method_exists($model, 'toArray')) {
        dd($model->toArray());
    } else {
        dd($model);
    }
}
5年前 评论

dda
读作
滴答

5年前 评论
qbhy

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

5年前 评论
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方法不存在.

5年前 评论

可以换一个名字吗

5年前 评论

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

5年前 评论
qbhy

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

5年前 评论

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


function dda(...$args)
{
    foreach($args as &$x){
        if (method_exists($x, 'toArray')) {
            $x = $x->toArray();
        }
    }
    dd(...$args);
}
5年前 评论
JerryBool 4年前
panda-sir

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

5年前 评论

那么问题来了,如何直接修改重写全局的dd函数呢?

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!