Code前端首页关于Code前端联系我们

修复无效的 laravel getXXXAttribute 修饰符

terry 2年前 (2023-09-25) 阅读数 65 #后端开发

前端问我为什么所有 PHP 参数都带有下划线。感觉很不规则。您可以看到(Java)其他用户命名骆驼屋。

我说我不在乎,php是世界上最好的语言,我强调了这一点。

其实这个问题好像是从入行开始就一直用下划线的,但是我也解释不了为什么。今天我发现这个名字有更好的解释。如果有更清楚的朋友欢迎留言。 1 把它放在相应的模型中:

publicfunctiongetProductDetailAttribute($extra){returnjson_decode($extra,true);}

但是无论我怎么尝试,它就是不起作用。于是我仔细看了源码中的修饰符。

laravel getXXXAttribute 修改器无效的解决方法

是修饰语的核心。通过定期过滤,当前模型中有多少符合修改器的条件。

protectedstaticfunctiongetMutatorMethods($class){preg_match_all('/(?<=^|;)get([^;]+?)Attribute(;|$)/',implode(';',get_class_methods($class)),$matches);return$matches[1];}

ProductDetai字段匹配,满足修改条件。

接下来我们看到一个非常重要的操作

publicstaticfunctioncacheMutatedAttributes($class){static::$mutatorCache[$class]=collect(static::getMutatorMethods($class))->map(function($match){returnlcfirst(static::$snake```php
    publicstaticfunctioncacheMutatedAttributes($class){static::$mutatorCache[$class]=collect(static::getMutatorMethods($class))->map(function($match){returnlcfirst(static::$snakeAttributes? Str::snake($match):$match);})->all();}

```? Str::snake($match):$match);})->all();}

那就是将ProductDetai转换为product_detail

,然后从属性中匹配对应的字段。结果没有找到,所以我们不会使用上面定义的方法。

我屈服了,然后将数据库字段更改为product_detail来解决问题。

这是原因之一:为什么 PHP 在名称中使用下划线?

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门