thinktomorrow/magic-attributes

此包已被弃用且不再维护。未建议替代包。

获取嵌套属性的魔法辅助

0.2.0 2019-02-15 08:15 UTC

This package is auto-updated.

Last update: 2021-02-06 11:34:42 UTC


README

此仓库已存档,以支持我们新的 dynamic-attributes 仓库,该仓库提供相同的功能。请考虑使用此包,因为魔法属性将不再维护。

魔法属性

通过点符号语法获取嵌套属性值。

Latest Version on Packagist Build Status StyleCI Quality Score Total Downloads

处理多层数组或对象时,获取深层属性值有时会变得繁琐。你需要手动逐级访问。此包提供了一个简单的 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)。有关更多信息,请参阅 许可证文件