thinktomorrow / magic-attributes
获取嵌套属性的魔法辅助
Requires
- php: ^7.1
Requires (Dev)
- illuminate/database: ^5.6
- illuminate/support: ^5.6
- mockery/mockery: ^1.1
- phpunit/phpunit: ^7.2
This package is auto-updated.
Last update: 2021-02-06 11:34:42 UTC
README
此仓库已存档,以支持我们新的 dynamic-attributes 仓库,该仓库提供相同的功能。请考虑使用此包,因为魔法属性将不再维护。
魔法属性
通过点符号语法获取嵌套属性值。
处理多层数组或对象时,获取深层属性值有时会变得繁琐。你需要手动逐级访问。此包提供了一个简单的 API 来获取这些嵌套值。而不是这样做
if(!isset($class->foo)) return null; if(!isset($class->foo->bar)) return null; return $class->foo->bar;
使用此包,你可以这样做
return $class->attr('foo.bar');
特质
为了添加此功能,你需要在你的类中添加一个特质。以下是一个示例
use \Thinktomorrow\MagicAttributes\HasMagicAttributes; class Customer{ use HasMagicAttributes; }
魔法属性
如果你想将你的值作为类的一级属性来获取,你可以设置一个 __get
和 __isset
方法来实现。它可以看起来像这样
class Customer{ /* allows for $customer->addressStreet instead of $customer->attr('address.street') */ public function __get($key) { return $this->magicAttribute($key); } /* with __isset you allow to check if the property exists on this class, e.g. isset($customer->addressStreet) */ public function __isset($key) { return false !== $this->magicAttribute($key, false); } }
严格检索
该包提供单个入口点,因此默认情况下,你通过调用 attr
方法来检索值,例如 $class->attr('foo.bar')
。这里的优点是这种方法在公共 API 使用中高度可识别。缺点是它并不能严格保护你的类 API 和属性。一种处理方法是对 attr
方法的公共使用进行限制,并提供自己的公共 API。
在 MagicAttributes 特质中,你将找到一个 disallow_magic_api
属性,默认值为 false。应该将其设置为 true 以防止公共使用 attr
方法。任何尝试使用此方法的行为现在将抛出 DisallowedMagicAttributeUsage
异常。
在你的类中,你可以使用与 attr
方法具有相同签名的 magicAttribute
方法,这是一个受保护的函数,只能由内部 API 使用。
安全
如果您发现任何安全相关的问题,请通过电子邮件 ben@thinktomorrow.be 而不是使用问题跟踪器。
鸣谢
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。