 简洁读取 API 扩展包)
使用 Attribute Reader假设有一个携带Route属性的控制器目标是获取该属性的实例。使用原生 PHP 反射的写法如下$reflection new ReflectionClass(MyController::class); $attributes $reflection-getAttributes(Route::class, ReflectionAttribute::IS_INSTANCEOF); $route null; if (count($attributes) 0) { $route $attributes[0]-newInstance(); }这段代码长达五行且仍需处理属性不存在的情况。使用php-attribute-reader后简化为use Spatie\Attributes\Attributes; $route Attributes::get(MyController::class, Route::class);单行完成。属性不存在时返回null无需额外的异常处理。读取方法属性从方法读取属性时原生反射的繁琐程度进一步加剧。以下示例试图获取控制器index方法的Route属性$reflection new ReflectionMethod(MyController::class, index); $attributes $reflection-getAttributes(Route::class, ReflectionAttribute::IS_INSTANCEOF); $route null; if (count($attributes) 0) { $route $attributes[0]-newInstance(); }样板代码重复出现仅反射类有所不同。该包通过专用方法统一处理各类目标Attributes::onMethod(MyController::class, index, Route::class); Attributes::onProperty(User::class, email, Column::class); Attributes::onConstant(Status::class, ACTIVE, Label::class); Attributes::onParameter(MyController::class, show, id, FromRoute::class);全类扫描原生反射在整类范围内查找属性时最为繁琐。假设某表单类的多个属性均携带Validate属性原生 PHP 的实现大致如下$results []; $class new ReflectionClass(MyForm::class); foreach ($class-getProperties() as $property) { foreach ($property-getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) { $results[] [attribute $attr-newInstance(), target $property]; } } foreach ($class-getMethods() as $method) { foreach ($method-getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) { $results[] [attribute $attr-newInstance(), target $method]; } foreach ($method-getParameters() as $parameter) { foreach ($parameter-getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) { $results[] [attribute $attr-newInstance(), target $parameter]; } } } foreach ($class-getReflectionConstants() as $constant) { foreach ($constant-getAttributes(Validate::class, ReflectionAttribute::IS_INSTANCEOF) as $attr) { $results[] [attribute $attr-newInstance(), target $constant]; } }对于常见的属性扫描需求上述代码量显得过于庞大。使用该包后简化为$results Attributes::find(MyForm::class, Validate::class); foreach ($results as $result) { $result-attribute; // 已实例化的属性对象 $result-target; // 反射对象 $result-name; // 例如 email, handle.request