Skip to content
Back to skills

Actions Pattern

ASecurity

Garante que novas Actions sigam o padrão de classes actions reutilizáveis do Easy Budget.

  • 666 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 2, 2026
ai-agentsphp

Security analysis

A100/100

Scanned September 2, 2026

npx -y skills add majiayu000/claude-skill-registry --skill actions-pattern --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Actions Pattern?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Actions Pattern
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/majiayu000-actions-pattern-claude-skill-registry/badge)](https://www.skillsdirectory.com/skills/majiayu000-actions-pattern-claude-skill-registry)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: actions-pattern
description: Garante que novas Actions sigam o padrão de classes actions reutilizáveis do Easy Budget.
---

# Padrão de Actions do Easy Budget

Esta skill define o padrão arquitetural para criação de Actions no sistema Easy Budget. Actions são classes focadas em uma única responsabilidade de negócio, reutilizáveis e composáveis.

## Estrutura Padrão

```php
<?php

declare(strict_types=1);

namespace App\Actions\ModuleName;

use App\Support\ServiceResult;
use Exception;

class ActionName
{
    public function __construct(
        private DependencyA $dependencyA,
        private DependencyB $dependencyB
    ) {}

    /**
     * Descrição do que a action executa.
     */
    public function execute(ParamType $param): ServiceResult
    {
        try {
            // 1. Validações de pré-condição
            if (!$this->isValid($param)) {
                return ServiceResult::error('Mensagem de erro específica.');
            }

            // 2. Operações de banco em transação (se necessário)
            return DB::transaction(function () use ($param) {
                // Lógica de negócio
                $result = $this->performAction($param);

                // Registro de histórico (se aplicável)
                $this->logAction($param, $result);

                return ServiceResult::success($result, 'Mensagem de sucesso.');
            });
        } catch (Exception $e) {
            return ServiceResult::error($e->getMessage());
        }
    }

    private function isValid(ParamType $param): bool
    {
        // Lógica de validação
        return true;
    }

    private function performAction(ParamType $param): mixed
    {
        // Implementação da ação
        return $result;
    }

    private function logAction(ParamType $param, mixed $result): void
    {
        // Registro de histórico se o modelo suportar
        if (method_exists($param, 'actionHistory')) {
            $param->actionHistory()->create([
                'tenant_id' => tenant('id'),
                'action' => 'action_name',
                'description' => 'Descrição da ação realizada.',
                'user_id' => auth()->id(),
            ]);
        }
    }
}
```

## Regras de Composição

1. **Dependências via Constructor Injection**: Sempre injete dependências no construtor
2. **Método `execute` único**: Cada Action deve ter um único ponto de entrada
3. **ServiceResult obrigatório**: Sempre retorne `ServiceResult` para operações que podem falhar
4. **Transação de banco**: Use `DB::transaction()` para operações que modificam dados
5. **Tratamento de exceções**: Use try-catch e retorne erros via `ServiceResult::error()`
6. **Registro de histórico**: Use `actionHistory()` quando disponível

## Exemplo de Composição de Actions

```php
class ComplexBusinessAction
{
    public function __construct(
        private ActionA $actionA,
        private ActionB $actionB,
        private ActionC $actionC
    ) {}

    public function execute(Context $context): ServiceResult
    {
        // Compõe múltiplas actions em um fluxo de negócio
        $resultA = $this->actionA->execute($context);
        if ($resultA->isError()) {
            return $resultA;
        }

        return $this->actionB->execute($context);
    }
}
```

## Quando Criar uma Nova Action

- Quando a lógica de negócio é reutilizável em múltiplos controllers
- Quando o fluxo envolve múltiplas operações transacionais
- Quando há necessidade de composição com outras actions
- Quando a lógica é complexa o suficiente para justificar separação

## Quando NÃO Criar uma Action

- Operações simples de CRUD que podem ir direto no Service
- Lógica que só é usada em um único lugar
- Operações que são apenas wrapper de repository

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.