360 Secure SkillHub
360 安全技能中心

ia-php-laravel

为 Laravel 项目提供 PHP 编码风格、架构约束、迁移与队列注意事项、测试与调试指南,并附带 11 份主题参考文档;不覆盖 php-src 内部实现、独立 PHP 库或通用 PHP 语言讨论。

iliaal
iliaal
热度 91.36
最近更新 2026-10-12 22:23:55
分类:开发依赖:读写文件 / 代码执行应用场景:代码生成 / 代码审查 / 调试排错 / DevOps ...

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add compound-eng-php-laravel
Metadata
name
ia-php-laravel
class
language
description
Modern PHP 8.4 and Laravel patterns: architecture, Eloquent, migrations, queues, testing. Use when working with Laravel, Eloquent, Blade, artisan, or building/testing a framework-based PHP app. Not for php-src internals, standalone PHP libraries, or general PHP language discussion.
paths
**/*.php

PHP & Laravel Development

Scoped to framework-level PHP. Work on php-src internals or a native PHP extension is C, not PHP: the ia-c-systems skill covers it, including the Zend API conventions (gen_stub arginfo, the request-scoped allocator, custom object handlers, .phpt).

Working rules

  • Keep simple CRUD simple; extract cross-model orchestration only when it has a concrete use.
  • Validate and authorize at request boundaries; serialize through explicit resources and validate third-party responses.
  • Preserve deployed migration history, queued payload compatibility, and concurrent writes.
  • Verify cache compilation, queue execution, and HTTP behavior through their real entrypoints when those paths change.

Code Style

  • declare(strict_types=1) in every file
  • Happy path last: guards and errors first, success at the end. Early returns, no else.
  • Comments explain why, never what. Never comment tests. If code needs a "what" comment, rename or restructure.
  • No single-letter variables: $exception not $e, $request not $r
  • ?string not string|null. Always specify void. Import classnames, never inline FQN.
  • Widening one parameter to ?T obliges auditing every call site that forwards the same value: the sibling call still declares string, and null throws a TypeError there even with no declare(strict_types=1), because coercive mode never coerces null into a scalar. Strictness is decided by the file the CALL is written in, never by the callee's file. Full mechanism in common-pitfalls.md.
  • Validation uses array notation ['required', 'email'] for easier custom rule classes
  • PHPStan level 8+ (phpstan analyse --level=8); aim for 9 on new projects. @phpstan-type / @phpstan-param for generic collection types. The missing-iterable-value-type check lands at level 6 (and every level above it), so any project at 8+ inherits it: use the generic form on every iterable (@return Collection<int, User>, @param array<int, MyObject>) and array-shape notation array{first: SomeClass, second: SomeClass} for fixed-key returns; a bare Collection or array will not clear it.

Discipline

  • Simplicity first: every change as simple as possible, minimal code impact
  • Only touch what's necessary; no unrelated changes
  • No hacky workarounds: if a fix feels wrong, step back and implement the clean solution
  • New abstraction requires 3+ usage sites; otherwise inline it
  • No empty catch blocks: log or rethrow, never swallow
  • Verify before declaring done: ./vendor/bin/phpstan analyse --level=8 && ./vendor/bin/phpunit with zero warnings
  • Checkpoint per stage, not only at the end: migrate:status after a migration, route:list --path=<prefix> after routing changes, queue:work --once after adding a job, pint --test before the PR. Each catches its failure class while the change is small

References

Task-specific references

Read the relevant reference before implementing or reviewing the matching behavior:

  • For PHP features, controller/action design, routing, resources, or external APIs: framework-patterns.md.
  • For migrations, Eloquent writes, casts, queues, job payloads, or production startup: persistence-and-jobs.md.
  • For PHPUnit work or changes affecting events, serialization, validation, or lifecycle behavior: testing-and-pitfalls.md.

Existing specialized references, when the corresponding topic applies: