[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EH2GEADKKV85QSWXASXSD4":3,"skill-same:01M6EH2GEADKKV85QSWXASXSD4":49},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":24,"frontMatter":25,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":31,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M6EH2GEADKKV85QSWXASXSD4","laravel-verification",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faffaan-m\u002Feverything-claude-code\u002Flaravel-verification\u002FSKILL.md",[],[18,19,20],"verification","laravel verification","laravel","2026-11-10 10:12:30",false,"---\nname: laravel-verification\ndescription: Verification loop for Laravel projects: env checks, linting, static analysis, tests with coverage, security scans, and deployment readiness.\norigin: ECC\n---\n\n# Laravel 验证循环\n\n在发起 PR 前、进行重大更改后以及部署前运行。\n\n## 使用时机\n\n* 在为一个 Laravel 项目开启拉取请求之前\n* 在重大重构或依赖升级之后\n* 为预生产或生产环境进行部署前验证\n* 运行完整的 代码检查 -> 测试 -> 安全检查 -> 部署就绪 流水线\n\n## 工作原理\n\n* 按顺序运行从环境检查到部署就绪的各个阶段，每一层都建立在前一层的基础上。\n* 环境和 Composer 检查是所有其他步骤的关卡；如果它们失败，立即停止。\n* 代码检查\u002F静态分析应在运行完整测试和覆盖率检查前确保通过。\n* 安全性和迁移审查在测试之后进行，以便在涉及数据或发布步骤之前验证行为。\n* 构建\u002F部署就绪以及队列\u002F调度器检查是最后的关卡；任何失败都会阻止发布。\n\n## 第一阶段：环境检查\n\n```bash\nphp -v\ncomposer --version\nphp artisan --version\n```\n\n* 验证 `.env` 文件存在且包含必需的键\n* 确认生产环境已设置 `APP_DEBUG=false`\n* 确认 `APP_ENV` 与目标部署环境匹配（`production`、`staging`）\n\n如果在本地使用 Laravel Sail：\n\n```bash\n.\u002Fvendor\u002Fbin\u002Fsail php -v\n.\u002Fvendor\u002Fbin\u002Fsail artisan --version\n```\n\n## 第一阶段补充：Composer 和自动加载\n\n```bash\ncomposer validate\ncomposer dump-autoload -o\n```\n\n## 第二阶段：代码检查和静态分析\n\n```bash\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\n```\n\n如果你的项目使用 Psalm 而不是 PHPStan：\n\n```bash\nvendor\u002Fbin\u002Fpsalm\n```\n\n## 第三阶段：测试和覆盖率\n\n```bash\nphp artisan test\n```\n\n覆盖率（CI 环境）：\n\n```bash\nXDEBUG_MODE=coverage php artisan test --coverage\n```\n\nCI 示例（格式化 -> 静态分析 -> 测试）：\n\n```bash\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\nXDEBUG_MODE=coverage php artisan test --coverage\n```\n\n## 第四阶段：安全和依赖项检查\n\n```bash\ncomposer audit\n```\n\n## 第五阶段：数据库和迁移\n\n```bash\nphp artisan migrate --pretend\nphp artisan migrate:status\n```\n\n* 仔细审查破坏性迁移\n* 确保迁移文件名遵循 `Y_m_d_His_*` 格式（例如，`2025_03_14_154210_create_orders_table.php`）并清晰地描述变更\n* 确保可以执行回滚\n* 验证 `down()` 方法，避免在没有明确备份的情况下造成不可逆的数据丢失\n\n## 第六阶段：构建和部署就绪\n\n```bash\nphp artisan optimize:clear\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\n```\n\n* 确保在生产配置下缓存预热成功\n* 验证队列工作者和调度器已配置\n* 确认在目标环境中 `storage\u002F` 和 `bootstrap\u002Fcache\u002F` 目录可写\n\n## 第七阶段：队列和调度器检查\n\n```bash\nphp artisan schedule:list\nphp artisan queue:failed\n```\n\n如果使用了 Horizon：\n\n```bash\nphp artisan horizon:status\n```\n\n如果 `queue:monitor` 命令可用，可以用它来检查积压作业而无需处理它们：\n\n```bash\nphp artisan queue:monitor default --max=100\n```\n\n主动验证（仅限预生产环境）：向一个专用队列分发一个无操作作业，并运行一个单独的工作者来处理它（确保配置了一个非 `sync` 的队列连接）。\n\n```bash\nphp artisan tinker --execute=\"dispatch((new App\\\\Jobs\\\\QueueHealthcheck())->onQueue('healthcheck'))\"\nphp artisan queue:work --once --queue=healthcheck\n```\n\n验证该作业产生了预期的副作用（日志条目、健康检查表行或指标）。\n\n仅在处理测试作业是安全的非生产环境中运行此检查。\n\n## 示例\n\n最小流程：\n\n```bash\nphp -v\ncomposer --version\nphp artisan --version\ncomposer validate\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\nphp artisan test\ncomposer audit\nphp artisan migrate --pretend\nphp artisan config:cache\nphp artisan queue:failed\n```\n\nCI 风格流水线：\n\n```bash\ncomposer validate\ncomposer dump-autoload -o\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\nXDEBUG_MODE=coverage php artisan test --coverage\ncomposer audit\nphp artisan migrate --pretend\nphp artisan optimize:clear\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\nphp artisan schedule:list\n```\n\n","# Laravel 验证循环\n\n在发起 PR 前、进行重大更改后以及部署前运行。\n\n## 使用时机\n\n* 在为一个 Laravel 项目开启拉取请求之前\n* 在重大重构或依赖升级之后\n* 为预生产或生产环境进行部署前验证\n* 运行完整的 代码检查 -> 测试 -> 安全检查 -> 部署就绪 流水线\n\n## 工作原理\n\n* 按顺序运行从环境检查到部署就绪的各个阶段，每一层都建立在前一层的基础上。\n* 环境和 Composer 检查是所有其他步骤的关卡；如果它们失败，立即停止。\n* 代码检查\u002F静态分析应在运行完整测试和覆盖率检查前确保通过。\n* 安全性和迁移审查在测试之后进行，以便在涉及数据或发布步骤之前验证行为。\n* 构建\u002F部署就绪以及队列\u002F调度器检查是最后的关卡；任何失败都会阻止发布。\n\n## 第一阶段：环境检查\n\n```bash\nphp -v\ncomposer --version\nphp artisan --version\n```\n\n* 验证 `.env` 文件存在且包含必需的键\n* 确认生产环境已设置 `APP_DEBUG=false`\n* 确认 `APP_ENV` 与目标部署环境匹配（`production`、`staging`）\n\n如果在本地使用 Laravel Sail：\n\n```bash\n.\u002Fvendor\u002Fbin\u002Fsail php -v\n.\u002Fvendor\u002Fbin\u002Fsail artisan --version\n```\n\n## 第一阶段补充：Composer 和自动加载\n\n```bash\ncomposer validate\ncomposer dump-autoload -o\n```\n\n## 第二阶段：代码检查和静态分析\n\n```bash\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\n```\n\n如果你的项目使用 Psalm 而不是 PHPStan：\n\n```bash\nvendor\u002Fbin\u002Fpsalm\n```\n\n## 第三阶段：测试和覆盖率\n\n```bash\nphp artisan test\n```\n\n覆盖率（CI 环境）：\n\n```bash\nXDEBUG_MODE=coverage php artisan test --coverage\n```\n\nCI 示例（格式化 -> 静态分析 -> 测试）：\n\n```bash\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\nXDEBUG_MODE=coverage php artisan test --coverage\n```\n\n## 第四阶段：安全和依赖项检查\n\n```bash\ncomposer audit\n```\n\n## 第五阶段：数据库和迁移\n\n```bash\nphp artisan migrate --pretend\nphp artisan migrate:status\n```\n\n* 仔细审查破坏性迁移\n* 确保迁移文件名遵循 `Y_m_d_His_*` 格式（例如，`2025_03_14_154210_create_orders_table.php`）并清晰地描述变更\n* 确保可以执行回滚\n* 验证 `down()` 方法，避免在没有明确备份的情况下造成不可逆的数据丢失\n\n## 第六阶段：构建和部署就绪\n\n```bash\nphp artisan optimize:clear\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\n```\n\n* 确保在生产配置下缓存预热成功\n* 验证队列工作者和调度器已配置\n* 确认在目标环境中 `storage\u002F` 和 `bootstrap\u002Fcache\u002F` 目录可写\n\n## 第七阶段：队列和调度器检查\n\n```bash\nphp artisan schedule:list\nphp artisan queue:failed\n```\n\n如果使用了 Horizon：\n\n```bash\nphp artisan horizon:status\n```\n\n如果 `queue:monitor` 命令可用，可以用它来检查积压作业而无需处理它们：\n\n```bash\nphp artisan queue:monitor default --max=100\n```\n\n主动验证（仅限预生产环境）：向一个专用队列分发一个无操作作业，并运行一个单独的工作者来处理它（确保配置了一个非 `sync` 的队列连接）。\n\n```bash\nphp artisan tinker --execute=\"dispatch((new App\\\\Jobs\\\\QueueHealthcheck())->onQueue('healthcheck'))\"\nphp artisan queue:work --once --queue=healthcheck\n```\n\n验证该作业产生了预期的副作用（日志条目、健康检查表行或指标）。\n\n仅在处理测试作业是安全的非生产环境中运行此检查。\n\n## 示例\n\n最小流程：\n\n```bash\nphp -v\ncomposer --version\nphp artisan --version\ncomposer validate\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\nphp artisan test\ncomposer audit\nphp artisan migrate --pretend\nphp artisan config:cache\nphp artisan queue:failed\n```\n\nCI 风格流水线：\n\n```bash\ncomposer validate\ncomposer dump-autoload -o\nvendor\u002Fbin\u002Fpint --test\nvendor\u002Fbin\u002Fphpstan analyse\nXDEBUG_MODE=coverage php artisan test --coverage\ncomposer audit\nphp artisan migrate --pretend\nphp artisan optimize:clear\nphp artisan config:cache\nphp artisan route:cache\nphp artisan view:cache\nphp artisan schedule:list\n```\n\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faffaan-m\u002Feverything-claude-code\u002Flaravel-verification",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill laravel-verification",{"tool":41,"command":42},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill laravel-verification",{"tool":44,"command":45},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill laravel-verification","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faffaan-m\u002Feverything-claude-code\u002Flaravel-verification\u002FSKILL.md",true,[],[50,64,74,83,89,96],{"skillNo":51,"name":52,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":60,"publishedAt":21},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[55],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[61,62,63],"model","model hierarchy","model hierarchy skill",{"skillNo":65,"name":66,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":70,"publishedAt":21},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[69],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},[71,72,73],"MCP","zoom","zoom mcp",{"skillNo":75,"name":76,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":21},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[80,81,82,72],"sdk","zoom apps sdk","apps",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":21},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[85],{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":95,"publishedAt":21},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[94],{"categoryNo":56,"categoryName":57,"taxonomyType":58,"taxonomyTypeDesc":59},[91],{"skillNo":97,"name":98,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":21},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[98]]