惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
月光博客
月光博客
博客园 - 司徒正美
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
量子位
Recent Announcements
Recent Announcements
V
V2EX
P
Proofpoint News Feed
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
B
Blog
博客园_首页
GbyAI
GbyAI
博客园 - Franky

博客园 - zh7314

Go 1.23 → 1.26 升级检查文档 Pimcore 版本功能对比表(Community / Professional / Enterprise) typephp的编译核心phpx原理解析 typephp的编译原理 golang多版本控制工具支持Linux/macOS/Windows dbx低性能消耗的支持window/mac/docker的数据库客户端 关于headless和低代码平台的一些思考 docker日志监控dozzle,高性能,性能消耗小 pimcore 12版本的命令 阿里云 nas服务挂了导致docker挂载目录不存,docker无法重启和停止容器 symfony+swoole性能测试 关于小米手机使用 microsoft authenticator 无法扫码成功的解决方案 fastapi的构建cms,推荐fastapi集成框架 s3rius/FastAPI-template python 现代化包管理工具uv安装和使用 博文阅读密码验证 - 博客园 laravel在cli模式下输出格式漂亮一些 laravel计划任务和异步队列任务,拆分成不同队列,减少计划任务系统压力 debug redis里面的lua脚本 laravel chunkById导出数据乱序问题 PHP 真正异步编程即将到来 首个 alpha 版本已经发布 (转) 关于his esb企业服务总线系统设计 多渠道订单,对应渠道公司的提现主体,如何设计系统 laravel 主表和从表一对一,从表是要多个选取最新的一条,性能优化 sourcetree无法获取远程所有的tag 支付宝沙盒模式商家转账经常出现 响应异常: 解包错误 laravel 使用异步队列,context带的上下文造成反序列化出问题 hyperf 的默认创建项目部署k8s docker缺失文件 hyperf 查看所有路由的命令 线上就医全流程医药机构接入文档接口代码-医保就医接口php-demo版本 windows lm studio 0.3.8无法下载模型,更换镜像
在laravel使用注解自动注册
zh7314 · 2025-05-06 · via 博客园 - zh7314

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,
],