如何从 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,可用于自动检测您的控制器。
我正在开发小型 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,可用于自动检测您的控制器。