2025年3月15日16:02:45
在 Laravel 中使用 PHP8 原生注解需结合反射和服务提供者实现,以下是具体步骤及示例:
一、定义注解类
通过 #[Attribute] 声明注解类并指定作用范围:
// app/Attributes/Route.php
namespace App\Attributes;
use Attribute;
#[Attribute(Attribute::TARGET_METHOD)]
class Route {
public function __construct(
public string $path,
public string $method = 'GET'
) {}
}
二、应用注解到控制器方法
在控制器方法上附加注解并传入参数:
// app/Http/Controllers/UserController.php
use App\Attributes\Route;
class UserController {
#[Route(path: '/user', method: 'POST')]
public function create() {
// 创建用户逻辑
}
}
三、解析注解并注册路由
通过服务提供者扫描控制器类,反射解析注解并动态注册路由:
// app/Providers/AnnotationServiceProvider.php
use Illuminate\Support\ServiceProvider;
use ReflectionClass;
use ReflectionMethod;
use App\Attributes\Route;
class AnnotationServiceProvider extends ServiceProvider {
public function boot() {
$action = request()->route()->getAction();
//获取controller
$controller = $action['controller'];
//截断控制名称和方法
[$controllerClass, $controllerMethod] = explode('@', $controller);
//反射
$reflectionClass = new \ReflectionClass($controllerClass);
//获取方法
$reflectionMethod = $reflectionClass->getMethod($controllerMethod);
//司机端
$attrs = $reflectionMethod->getAttributes(DriverAuth::class);
//如果有注解,就权限验证,没有就不验证
if (!empty($attrs)) {
}
}
}
}
四、注册服务提供者
在 config/app.php 中注册服务提供者以激活注解解析:
'providers' => [
// 其他服务提供者...
App\Providers\AnnotationServiceProvider::class,
],