Aplica padrões de código Spatie + Laravel Pint para consistência. Use quando precisar verificar ou configurar code style, padrões de nomenclatura, ou formatação de código PHP.
From laravel-toolkitnpx claudepluginhub aronpc/ai --plugin laravel-toolkitThis skill is limited to using the following tools:
Designs and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
Mantém padrões de código Laravel baseados nas diretrizes da Spatie com Laravel Pint.
| Skill | Quando usar junto |
|---|---|
coder | Para seguir padrões durante implementação |
pr-review | Para verificar aderência em reviews |
qa | Para validação de estilo |
workflow | Para pre-commit hooks |
architecture | Para padrões arquiteturais |
Use esta skill sempre que:
composer fixSiga as convenções do Laravel primeiro. Se o Laravel tem uma forma documentada de fazer algo, use-a. Só desvie quando tiver justificativa clara.
?string não string|nullvoid quando métodos não retornam nadaUse propriedades tipadas, não docblocks:
final class UserService
{
public function __construct(
private readonly UserRepository $repository,
private readonly Cache $cache,
) {}
}
Use quando todas as propriedades podem ser promovidas:
// ✅ TODAS as propriedades podem ser promovidas
final class UserService
{
public function __construct(
private readonly UserRepository $repository,
private readonly Cache $cache,
) {}
}
// ❌ Algumas propriedades não podem ser promovidas
final class UserService
{
private UserRepository $repository;
private array $config;
public function __construct(
UserRepository $repository,
array $config,
) {
$this->repository = $repository;
$this->config = $config;
}
}
Um trait por linha:
final class Business extends Model
{
use HasFactory;
use SoftDeletes;
use Notifiable;
}
void?Type não Type|null/** @return Collection<int, User> */
public function getUsers(): Collection
{
return User::all();
}
use Spatie\Url\Url;
/** @return Url */
public function getUrl(): Url
{
return Url::fromString($this->url);
}
/** @var string *//** @var Collection|SomeWeirdVendor\Collection */
/**
* @param array<int, MyObject> $myArray
* @param int $typedArgument
*/
function someFunction(array $myArray, int $typedArgument) {}
/** @return array{
* first: SomeClass,
* second: SomeClass
* } */
Trate condições de erro primeiro, caso de sucesso último:
// ✅ GOOD - Happy path last
if (!$user) {
return null;
}
if (!$user->isActive()) {
return null;
}
// Process active user...
return $this->processUser($user);
Use early returns em vez de condições aninhadas:
// ❌ BAD - Aninhado
if ($user) {
if ($user->isActive()) {
if ($user->hasPermission()) {
return $this->processUser($user);
}
}
}
// ✅ GOOD - Early returns
if (!$user) {
return null;
}
if (!$user->isActive()) {
return null;
}
if (!$user->hasPermission()) {
return null;
}
return $this->processUser($user);
Preira múltiplas instruções if sobre condições compostas:
// ❌ BAD - Condição composta
if ($user && $user->isActive() && $user->hasPermission()) {
return $this->processUser($user);
}
// ✅ GOOD - Condições separadas
if (!$user) {
return null;
}
if (!$user->isActive()) {
return null;
}
if (!$user->hasPermission()) {
return null;
}
return $this->processUser($user);
// Ternário curto
$name = $isFoo ? 'foo' : 'bar';
// Ternário multi-linha
$result = $object instanceof Model
? $object->name
: 'A default value';
// Ternário em vez de else
$condition
? $this->doSomething()
: $this->doSomethingElse();
/open-source)->name('openSource')){userId})[Controller::class, 'method']PostsController)index, create, store, show, edit, update, destroy)pdf-generator.php)chrome_path)config/services.php, não crie novos arquivosconfig(), evite env() fora de arquivos de configdelete-old-records)$this->comment('All ok!'))$items->each(function (Item $item) {
$this->info("Processing item id `{$item->id}`...");
$this->processItem($item);
});
$this->comment("Processed {$items->count()} items.");
Use interpolação de strings sobre concatenação:
// ❌ BAD - Concatenação
$name = 'Hello, ' . $user->name . '!';
// ✅ GOOD - Interpolação
$name = "Hello, {$user->name}!";
Use PascalCase para valores de enum:
enum BusinessTypeEnum: string
{
case RESTAURANT = 'restaurant';
case CAFE = 'cafe';
case BAR = 'bar';
}
Escreva código expressivo em vez de comentários:
// ❌ BAD - Comentário explicando o quê
// Check if user is active
if ($user->isActive()) {
return $user;
}
// ✅ GOOD - Código auto-explicativo
if ($user->isActive()) {
return $user;
}
Use formatação adequada quando necessário:
// Single line with space after //
/*
* Multi-line blocks start with single *
*/
{}Use notação de array para múltiplas regras (mais fácil para classes de regra customizadas):
public function rules(): array
{
return [
'email' => ['required', 'email'],
'password' => ['required', 'min:8', 'confirmed'],
];
}
Regras de validação customizadas usam snake_case:
Validator::extend('organisation_type', function ($attribute, $value) {
return OrganisationType::isValid($value);
});
@if($condition)
Something
@endif
Gate::define('editPost', ...)view em vez de showUse função __() sobre @lang:
{{ __('messages.welcome') }}
/errors/error-occurrences// ✅ GOOD
/error-occurrences/1
/errors/1/occurrences
// ❌ BAD - Muito aninhado
/tenants/1/businesses/1/locations/1/menu-items/1
| Tipo | Convenção | Exemplo |
|---|---|---|
| Classes | PascalCase | UserController, OrderStatus |
| Methods/Variables | camelCase | getUserName, $firstName |
| Routes | kebab-case | /open-source, /user-profile |
| Config files | kebab-case | pdf-generator.php |
| Config keys | snake_case | chrome_path |
| Artisan commands | kebab-case | php artisan delete-old-records |
| Tipo | Convenção | Exemplo |
|---|---|---|
| Controllers | plural resource name + Controller | PostsController |
| Views | camelCase | openSource.blade.php |
| Jobs | action-based | CreateUser, SendEmailNotification |
| Events | tense-based | UserRegistering, UserRegistered |
| Listeners | action + Listener suffix | SendInvitationMailListener |
| Commands | action + Command suffix | PublishScheduledPostsCommand |
| Mailables | purpose + Mail suffix | AccountActivatedMail |
| Resources/Transformers | plural + Resource/Transformer | UsersResource |
| Enums | descriptive name, no prefix | OrderStatus, BookingType |
Não escreva métodos down em migrations, apenas métodos up:
public function up(): void
{
Schema::create('table', function (Blueprint $table) {
// ...
});
}
else