Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Actions Laravel Package

lorisleiva/laravel-actions

Unify your Laravel app logic into single-purpose “Action” classes that can run as controllers, jobs, listeners, or commands. Keep business logic in one place, reduce duplication, and generate actions via artisan with flexible asX entrypoints.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture Fit

  • Paradigm Shift: The package introduces a task-centric architecture (actions) instead of Laravel’s traditional controller/job/listener separation. This aligns well with Domain-Driven Design (DDD) and Clean Architecture, where business logic is encapsulated in reusable, single-purpose units.
  • Decoupling: Actions decouple execution context (HTTP, CLI, events, etc.) from business logic, reducing boilerplate (e.g., no need for separate controllers/jobs for similar logic).
  • Laravel Ecosystem Compatibility: Seamlessly integrates with Laravel’s core (routes, events, queues, commands) while preserving existing patterns (e.g., middleware, validation).
  • Testability: Actions are stateless by default (when designed as such) and can be tested in isolation via run() or mocked in unit tests.

Integration Feasibility

  • Low Friction: Requires minimal changes to existing Laravel apps—actions can coexist with controllers/jobs until fully migrated.
  • Backward Compatibility: Supports Laravel 11–13 (as of v2.10.0) with drop-in replacements for controllers/jobs/listeners.
  • IDE Support: Improved via PHPDoc annotations and type hints (e.g., asController, asJob), reducing refactoring risk.
  • Validation: Built-in support for Laravel’s FormRequest via validate() methods, maintaining existing validation workflows.

Technical Risk

  • Learning Curve: Teams accustomed to MVC may resist the shift from controllers to actions, requiring training/onboarding.
  • Migration Complexity:
    • Breaking Changes: Replacing controllers with actions requires updating route bindings (e.g., Route::post('...', Action::class)).
    • Event Listeners: Existing listeners must be updated to use asListener methods.
    • Middleware: Controller middleware must be redefined in asController (though decorators handle this).
  • Performance Overhead:
    • Reflection: Actions use runtime reflection to dispatch methods (e.g., asJob), which is negligible but could be a concern in high-frequency systems.
    • Job Decorators: Custom job decorators add slight overhead for queued actions.
  • Tooling Gaps:
    • Debugging: Stack traces may be less intuitive for actions invoked via run() (though backtrace limits are configurable).
    • Monitoring: Action execution metrics (e.g., duration, failures) require custom instrumentation.

Key Questions

  1. Adoption Strategy:
    • Should we pilot actions in new features first or migrate existing controllers incrementally?
    • How will we handle legacy controllers post-migration (deprecation, aliases)?
  2. Testing Impact:
    • How will we update existing tests (e.g., controller tests) to use actions?
    • Should we introduce action-specific test helpers (e.g., assertActionRunsWithoutErrors)?
  3. Performance:
    • Have we benchmarked action vs. controller performance for critical paths?
    • Will job decorators introduce noticeable latency in queued actions?
  4. Tooling:
    • Can we extend Laravel IDE Helpers to auto-generate action stubs with proper annotations?
    • Should we build a custom Tinker command to inspect action methods?
  5. Error Handling:
    • How will we centralize error logging for actions (e.g., failed jobs, validation errors)?
    • Should we implement a global action exception handler?

Integration Approach

Stack Fit

  • Laravel Core: Native support for routes, events, queues, and commands makes this a first-class citizen in Laravel apps.
  • PHP 8.2+: Leverages modern PHP features (e.g., named arguments, enums) for cleaner syntax.
  • Octane/Horizon: Compatible with Laravel’s async workers (e.g., asJob works with queues).
  • Inertia/Vue/React: Actions integrate seamlessly with frontend frameworks via asController (returns resources).
  • Testing: Works with Pest/PHPUnit; supports mocking actions in unit tests.

Migration Path

  1. Phase 1: Pilot Phase

    • New Features: Build 2–3 new features exclusively with actions to validate the approach.
    • Tooling: Create scripts to auto-generate action stubs from controllers (e.g., php artisan make:action-from-controller).
    • Training: Conduct workshops on action design principles (e.g., "What does my app do?").
  2. Phase 2: Hybrid Integration

    • Incremental Replacement:
      • Replace controllers with actions for API endpoints.
      • Replace jobs with actions for background tasks.
      • Replace listeners with actions for event handlers.
    • Route Migration:
      - Route::post('/articles', ArticleController::class);
      + Route::post('/articles', PublishArticle::class);
      
    • Event Migration:
      - Event::listen(NewProductEvent::class, ProductListener::class);
      + Event::listen(NewProductEvent::class, NotifyProductTeam::class);
      
  3. Phase 3: Full Adoption

    • Deprecate Controllers: Remove legacy controller classes (use aliases if needed).
    • Standardize Naming: Enforce conventions (e.g., Publish{Resource}, Create{Entity}).
    • Document Patterns: Publish internal guidelines for action design (e.g., "Avoid side effects in handle()").

Compatibility

  • Laravel Versions: Supports 11–13; drop Laravel 10 support in v2.10.0.
  • PHP Versions: Requires 8.2+ (PHP 8.4 fixes included in v2.8.6).
  • Third-Party Packages:
    • Validation: Works with Laravel’s FormRequest and Validator.
    • Testing: Compatible with Laravel’s testing helpers (e.g., actingAs, assertDatabaseHas).
    • Monitoring: Integrates with Laravel Scout, Horizon, and custom observability tools.
  • Customization:
    • Decorators: Extend JobDecorator, ControllerDecorator, etc., for custom behavior.
    • Design Patterns: Supports strategy pattern via asX methods (e.g., asWebhook, asCron).

Sequencing

  1. Start with Simple Actions:
    • Begin with stateless actions (e.g., data transformations, API responses).
    • Avoid complex actions with shared state or external dependencies early on.
  2. Prioritize High-Boilerplate Areas:
    • API Controllers: Replace CRUD controllers first (highest ROI).
    • Event Listeners: Migrate listeners with reusable logic.
    • Commands: Convert CLI commands to actions for consistency.
  3. Address Dependencies Last:
    • Database Transactions: Ensure actions support asJob with transactions.
    • Middleware: Migrate middleware logic to action decorators or asController methods.
  4. Test in Stages:
    • Unit Tests: Verify handle() logic in isolation.
    • Integration Tests: Test asController, asJob, etc., end-to-end.
    • E2E Tests: Validate frontend interactions (e.g., Inertia, API clients).

Operational Impact

Maintenance

  • Reduced Boilerplate:
    • Pros: Fewer classes to maintain (e.g., no separate controller + job for similar logic).
    • Cons: Actions may concentrate logic in fewer files, increasing cognitive load.
  • Dependency Management:
    • Actions encapsulate dependencies (e.g., repositories, services) in their constructors, improving testability.
    • Risk: Overly complex actions may become hard to refactor (violate Single Responsibility Principle).
  • Versioning:
    • Backward Compatibility: Actions are designed to be source-compatible with future Laravel versions.
    • Breaking Changes: Mostly limited to method signatures in asX methods.

Support

  • Debugging:
    • Pros: Actions provide clearer separation of concerns (e.g., handle() vs. asController).
    • Cons: Debugging run()-invoked actions may require custom stack trace handling.
  • Error Handling:
    • Centralized Logging: Implement a global action exception handler to log failures (e.g., failed jobs, validation errors).
    • Retry Logic: Leverage Laravel’s job retries for asJob actions.
  • Documentation:
    • Internal Docs: Maintain a runbook for common action patterns (e.g., "How to handle validation errors in actions").
    • External Docs: Link to laravelactions.com for team onboarding.

Scaling

  • Performance:
    • Stateless Actions: Scale horizontally (e.g., asJob actions in queues).
    • Stateful Actions: Avoid **shared memory
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope
anil/file-picker
broqit/fields-ai