Skip to content
Deployment
Skill

/laravel-actions

Build, refactor, and troubleshoot Laravel Actions using lorisleiva/laravel-actions. Use when implementing reusable action classes (object/controller/job/listener/command), converting service classes/controllers/jobs into actions, orchestrating workflows via faked actions, or

From plugin
coolify
66k10 skills1 MCP

Claude Code

$ npx -y skills add coollabsio/coolify --skill laravel-actions --agent claude-code

SKILL.md

laravel-actions.SKILL.md
name: laravel-actions
description: Build, refactor, and troubleshoot Laravel Actions using lorisleiva/laravel-actions. Use when implementing reusable action classes (object/controller/job/listener/command), converting service classes/controllers/jobs into actions, orchestrating workflows via faked actions, or debugging action entrypoints and wiring.

Laravel Actions or `lorisleiva/laravel-actions`

Overview

Use this skill to implement or update actions based on `lorisleiva/laravel-actions` with consistent structure and predictable testing patterns.

Quick Workflow

1. Confirm the package is installed with `composer show lorisleiva/laravel-actions`. 2. Create or edit an action class that uses `Lorisleiva\Actions\Concerns\AsAction`. 3. Implement `handle(...)` with the core business logic first. 4. Add adapter methods only when needed for the requested entrypoint:

  • `asController` (+ route/invokable controller usage)
  • `asJob` (+ dispatch)
  • `asListener` (+ event listener wiring)
  • `asCommand` (+ command signature/description)

5. Add or update tests for the chosen entrypoint. 6. When tests need isolation, use action fakes (`MyAction::fake()`) and assertions (`MyAction::assertDispatched()`).

Base Action Pattern

Use this minimal skeleton and expand only what is needed.

<?php

namespace App\Actions;

use Lorisleiva\Actions\Concerns\AsAction;

class PublishArticle
{
    use AsAction;

    public function handle(int $articleId): bool
    {
        return true;
    }
}

Project Conventions

  • Place action classes in `App\Actions` unless an existing domain sub-namespace is already used.
  • Use descriptive `VerbNoun` naming (e.g. `PublishArticle`, `SyncVehicleTaxStatus`).
  • Keep domain/business logic in `handle(...)`; keep transport and framework concerns in adapter methods (`asController`, `asJob`, `asListener`, `asCommand`).
  • Prefer explicit parameter and return types in all action methods.
  • Prefer PHPDoc for complex data contracts (e.g. array shapes), not inline comments.

When to Use an Action

  • Use an Action when the same use-case needs multiple entrypoints (HTTP, queue, event, CLI) or benefits from first-class orchestration/faking.
  • Keep a plain service class when logic is local, single-entrypoint, and unlikely to be reused as an Action.

Entrypoint Patterns

Run as Object

  • (prefer method) Use static helper from the trait: `PublishArticle::run($id)`.
  • Use make and call handle: `PublishArticle::make()->handle($id)`.
  • Call with dependency injection: `app(PublishArticle::class)->handle($id)`.

Run as Controller

  • Use route to class (invokable style), e.g. `Route::post('/articles/{id}/publish', PublishArticle::class)`.
  • Add `asController(...)` for HTTP-specific adaptation and return a response.
  • Add request validation (`rules()` or custom validator hooks) when input comes from HTTP.

Run as Job

  • Dispatch with `PublishArticle::dispatch($id)`.
  • Use `asJob(...)` only for queue-specific behavior; keep domain logic in `handle(...)`.
  • In this project, job Actions often define additional queue lifecycle methods and job properties for retries, uniqueness, and timing control.

Project Pattern: Job Action with Extra Methods

<?php

namespace App\Actions\Demo;

use App\Models\Demo;
use DateTime;
use Lorisleiva\Actions\Concerns\AsAction;
use Lorisleiva\Actions\Decorators\JobDecorator;

class GetDemoData
{
    use AsAction;

    public int $jobTries = 3;

    public int $jobMaxExceptions = 3;

    public function getJobRetryUntil(): DateTime
    {
        return now()->addMinutes(30);
    }

    public function getJobBackoff(): array
    {
        return [60, 120];
    }

    public function getJobUniqueId(Demo $demo): string
    {
        return $demo->id;
    }

    public function handle(Demo $demo): void
    {
        // Core business logic.
    }

    public function asJob(JobDecorator $job, Demo $demo): void
    {
        // Queue-specific orchestration and retry behavior.
        $this->handle($demo);
    }
}

Use these members only when needed:

  • `$jobTries`: max attempts for the queued execution.
  • `$jobMaxExceptions`: max unhandled exceptions before failing.
  • `getJobRetryUntil()`: absolute retry deadline.
  • `getJobBackoff()`: retry delay strategy per attempt.
  • `getJobUniqueId(...)`: deduplication key for unique jobs.
  • `asJob(JobDecorator $job, ...)`: access attempt metadata and queue-only branching.

Run as Listener

  • Register the action class as listener in `EventServiceProvider`.
  • Use `asListener(EventName $event)` and delegate to `handle(...)`.

Run as Command

  • Define `$commandSignature` and `$commandDescription` properties.
  • Implement `asCommand(Command $command)` and keep console IO in this method only.
  • Import `Command` with `use Illuminate\Console\Command;`.

Testing Guidance

Use a two-layer strategy:

1. `handle(...)` tests for business correctness. 2. entrypoint tests (`asController`, `asJob`, `asListener`, `asCommand`) for wiring/orchestration.

Deep Dive: `AsFake` methods (2.x)

Reference: https://www.laravelactions.com/2.x/as-fake.html

Use these methods intentionally based on what you want to prove.

`mock()`

  • Replaces the action with a full mock.
  • Best when you need strict expectations and argument assertions.
PublishArticle::mock()
    ->shouldReceive('handle')
    ->once()
    ->with(42)
    ->andReturnTrue();

`partialMock()`

  • Replaces the action with a partial mock.
  • Best when you want to keep most real behavior but stub one expensive/internal method.
PublishArticle::partialMock()
    ->shouldReceive('fetchRemoteData')
    ->once()
    ->andReturn(['ok' => true]);

`spy()`

  • Replaces the action with a spy.
  • Best for post-execution verification ("was called with X") without predefining all expectations.
$spy = PublishArticle::spy()->allows('handle')->andReturnTrue();

// execute code that triggers the actio
Read more
@coollabsio
Ships withcoolify

An open-source platform to deploy applications, databases, and services on your own servers. Open source & free forever, backed by our philosophy. ![Latest Release Version]( )

66k10 skills1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
65.5k
Star history of coollabsio/coolify on GitHub, a chart by star-history.com

Other skills on coolify.

configuring-horizon

configuring-horizon

Use this skill whenever the user mentions Horizon by name in a Laravel context. Covers the full Horizon lifecycle: installing…

@coollabsio@coollabsioInstall Skill
fortify-development

fortify-development

ACTIVATE when the user works on authentication in Laravel. This includes login, registration, password reset, email verification,…

@coollabsio@coollabsioInstall Skill
infer-conventions

infer-conventions

Use this skill to analyze how a Laravel application is actually written and record its conventions as shared rules. Trigger when…

@coollabsio@coollabsioInstall Skill
laravel-best-practices

laravel-best-practices

Apply this skill whenever writing, reviewing, or refactoring Laravel PHP code. This includes creating or modifying controllers,…

@coollabsio@coollabsioInstall Skill
livewire-development

livewire-development

Use for any task or question involving Livewire. Activate if user mentions Livewire, wire: directives, or Livewire-specific…

@coollabsio@coollabsioInstall Skill
mcp-development

mcp-development

Use this skill for Laravel MCP development. Trigger when creating or editing MCP tools, resources, prompts, servers, or UI apps…

@coollabsio@coollabsioInstall Skill

More skills from other plugins.

vercel-cli

vercel-cli

Guides deployment, configuration, and troubleshooting with the Vercel CLI. Use when operating Vercel projects or resources…

vercel11d16k
@vercel@vercelInstall Skill
skypilot

skypilot

Use when launching cloud VMs, Kubernetes pods, or Slurm jobs for GPU/TPU/CPU workloads, training or fine-tuning models on cloud…

@skypilot-org@skypilot-orgInstall Skill
pinme

pinme

Use this skill when the user mentions "pinme", or needs to upload files, store to IPFS, create/publish/deploy websites or…

pinme8w3.8k
@glitternetwork@glitternetworkInstall Skill
mlx-serve

mlx-serve

Hook an app, game or script up to the local mlx-serve server for LLM chat, embeddings, image, speech, music, sound effect, video…

mlx-serve11d2.2k
@ddalcu@ddalcuInstall Skill

Questions about laravel-actions.

Which coding agents can use laravel-actions?
laravel-actions installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.