Skip to content

Auto register event listeners, routes and command handlers using PHP attributes

License

Notifications You must be signed in to change notification settings

AidynMakhataev/laravel-attributes

Repository files navigation

Laravel Attributes

This package provides php attributes automatically register Laravel routes, event listeners and command bus handlers.

Requirements

  • PHP ^8.0
  • Laravel ^8.0

Installation

You can install the package via composer:

composer require aidynmakhataev/laravel-attributes

You can publish the config file with:

php artisan vendor:publish --provider="AidynMakhataev\LaravelAttributes\LaravelAttributesServiceProvider" --tag="config"

This is the contents of the published config file:

return [
    'events' => [
        /*
         * Automatic registration of listeners will only happen if this setting is `true`
         */
        'enabled'       => true,

        /*
         * Listeners in these directories that have attributes will automatically be registered.
         */
        'directories'   => [
            base_path('app/Listeners')
        ]
    ],

    'command_bus' => [
        /*
         * Automatic registration of command handlers will only happen if this setting is `true`
         */
        'enabled'       => true,

        /*
         * Handlers in these directories that have attributes will automatically be registered.
         */
        'directories'   => [
            base_path('app/CommandHandlers')
        ],
    ],

    'routing' => [
        /*
         * Automatic registration of routes will only happen if this setting is `true`
         */
        'enabled'       => true,

        /*
         * Controllers in these directories that have attributes will automatically be registered.
         */
        'directories'   => [
            base_path('app/Http/Controllers')
        ],
    ],
];

Usage

The package provides several annotations that should be put on your methods.

Event Listeners

namespace App\Listeners;

use AidynMakhataev\LaravelAttributes\Attributes\EventListener;
use App\Events\OrderShipped;

class SendShipmentNotification
{
    #[EventListener]
    public function handle(OrderShipped $event)
    {
        //
    }
}

This attribute will automatically register this listener by executing following command:

Event::listen(OrderShipped::class, 'SendShipmentNotification@handle');

Command Handlers

namespace App\CommandHandlers;

use AidynMakhataev\LaravelAttributes\Attributes\CommandHandler;
use App\Events\OrderShipped;

class CreateOrderCommandHandler
{
    #[CommandHandler]
    public function handle(CreateOrderCommand $command)
    {
        //
    }
}

This attribute will automatically register this handler by executing following command:

Bus::map([
    CreateOrderCommand::class => CreateOrderCommandHandler::class,
]);

Routing

namespace App\Http\Controllers;

use AidynMakhataev\LaravelAttributes\Attributes\Route;
use App\Events\OrderShipped;
use Illuminate\Http\Request;

class OrderController
{
    #[Route(path: '/orders', methods: ['POST'], name: 'orders.store', middlewares: ['auth'])]
    public function store(Request $request)
    {
        //
    }
}

This attribute will automatically register this route by executing following command:

Route::post('/orders', [OrderController::class, 'store'])->name('orders.store')->middlewares(['auth']);

Testing

composer test

License

The MIT License (MIT). Please see License File for more information.

About

Auto register event listeners, routes and command handlers using PHP attributes

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages