如何解决如何读取 php 8 中的类方法属性?
假设我有以下属性声明
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
class Route
{
public function __construct(
public string $path,public ?string $method = null,public ?string $alias = null
)
{}
}
我在一些控制器方法中使用它,如下所示:
class Controller
{
#[Route('/index/')]
#[Route('/home/',alias: 'home')]
public function index()
{
...
}
#[Route('/create/','POST')]
public function create(Request $request)
{
//...
}
}
如何获取这些属性实例并读取其属性?
解决方法
您可以使用原生 php reflection api 来实现。
首先,您必须检索所需的方法反射。 在下面的示例中,我将检索所有公共方法:
$reflectionClass = new ReflectionClass(Controller::class);
$methods = $reflectionClass->getMethods(ReflectionMethod::IS_PUBLIC);
这将返回一个包含所有公共方法反射的数组。
然后,要读取它并检索那些 Route
实例,只需循环遍历它并使用“newInstance()”属性反射方法。像这样:
foreach ($methods as $method) {
$reflectionMethod = new ReflectionMethod(Controller::class,$method->getName());
$attributes = $reflectionMethod->getAttributes(Route::class);
echo "reflecting method '",$method->getName(),"'\r\n";
foreach ($attributes as $attribute) {
var_dump($attribute->newInstance());
}
}
这将输出:
reflecting method 'index'
object(Route)#8 (3) {
["path"]=>
string(7) "/index/"
["method"]=>
NULL
["alias"]=>
NULL
}
object(Route)#8 (3) {
["path"]=>
string(6) "/home/"
["method"]=>
NULL
["alias"]=>
string(4) "home"
}
reflecting method 'create'
object(Route)#7 (3) {
["path"]=>
string(8) "/create/"
["method"]=>
string(4) "POST"
["alias"]=>
NULL
}
以下是完整工作示例的要点: https://gist.github.com/carloscarucce/fce40cb3299dd69957db001c21422b04
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。