如何从 PHP 8 属性中获取方法名(反射)

How to get method name from PHP 8 attribute (reflection)

我正在开发小型 PHP 框架(用于学习)。它有一个带有 LoginController class 的文件,其中包含一个带有 Route 属性的方法(代码如下)。有什么方法可以使用反射获取 Route 属性中方法的名称 class?

Class 使用属性的方法:

class LoginController {
    #[Route('GET', '/login')]
    public function index() {
        // some code
    }
}

“路线”属性class:

use Attribute;
use ReflectionMethod;

#[Attribute]
class Route {
    public function __construct($method, $routeUri) {
        // Can I get the method name ("index") from attribute instead of writing it?
        // And the class name?
        $reflection = new ReflectionMethod(\App\Controllers\LoginController::class, 'index');
        $closure = $reflection->getClosure();

        // Register a route...
        Router::add($method, $routeUri, $closure);
    }
}

反射是一个选项,但请注意,您将循环遍历 class 中所有方法的所有属性(至少直到找到匹配的方法)。当然,如果所有的路由都需要注册,那也不错。

$classRef = new ReflectionClass(LoginController::class);
foreach ($classRef->getMethods() as $method) {
    $methodRef = new ReflectionMethod($method->class, $method->name);
    foreach ($methodRef->getAttributes() as $attribute) {
        if (
            $attribute->getName() === 'Route' 
            && $attribute->getArguments() === [$method, $routeUri]
        ) {
            // you can register your route here
        }
    }
}

就 class 而言,最简单的方法就是创建一个包含所有控制器 class 名称的数组。有一些软件包可以检测给定命名空间中的所有 classes,可用于自动检测您的控制器。