
# PHP Attributen

Queuety ondersteunt 8 attributen van PHP voor handlerregistratie zonder configuratie. Voorzie je handlerklassen van het attribuut `#[QueuetyHandler]` en registreer ze allemaal tegelijk met automatische ontdekking.

## Het attribuut `#[QueuetyHandler]`

```php
use Queuety\Handler;
use Queuety\Attributes\QueuetyHandler;

#[QueuetyHandler( name: 'send_email', queue: 'emails', max_attempts: 5 )]
class SendEmailHandler implements Handler {
    public function handle( array $payload ): void {
        wp_mail( $payload['to'], $payload['subject'], $payload['body'] );
    }

    public function config(): array {
        return [];
    }
}
```

De attribuutparameters:

| Parameter | Type | Standaardwaarde | Beschrijving |
|---|---|---|---|
| `name` | `string` | (verplicht) | Handlernaam voor dispatch |
| `queue` | `string` | `'default'` | Standaardwachtrij voor deze handler |
| `max_attempts` | `int` | `3` | Maximumaantal runs voordat de taak in de wachtrij voor mislukte taken belandt |
| `needs_wordpress` | `bool` | `false` | Opgeslagen in het attribuut; Queuety leest dit momenteel niet uit |

## Automatische ontdekking

Scan een map op handlerklassen met annotaties en registreer ze allemaal:

```php
use Queuety\Queuety;

$count = Queuety::discover_handlers(
    __DIR__ . '/handlers',  // directory to scan
    'MyPlugin\\Handlers'    // PSR-4 namespace prefix
);
// $count = number of handlers registered
```

Dit scant elk `.php`-bestand in de map en de submappen, leidt de naam van elke klasse af uit het naamruimtevoorvoegsel en het bestandspad, laadt de klasse via je autoloader en registreert klassen met het attribuut `#[QueuetyHandler]` die `Handler`, `Step` of `Contracts\Job` implementeren.

## Automatische ontdekking via CLI

```bash
# Preview discovered handlers
wp queuety discover /path/to/handlers MyPlugin\\Handlers

# Discover and register
wp queuety discover /path/to/handlers MyPlugin\\Handlers --register
```

Voorbeelduitvoer:

```
+-----------------------------------+----------+------------+
| class                             | type     | name       |
+-----------------------------------+----------+------------+
| MyPlugin\Handlers\SendEmailHandler | handler  | send_email |
| MyPlugin\Handlers\SyncDataHandler  | handler  | sync_data  |
| MyPlugin\Handlers\BuildPromptStep  | step     | (none)     |
+-----------------------------------+----------+------------+
```

## Aanbevolen werkwijze

Registreer handlers tijdens de initialisatie van je plugin:

```php
add_action( 'plugins_loaded', function () {
    Queuety::discover_handlers(
        __DIR__ . '/src/Handlers',
        'MyPlugin\\Handlers'
    );
} );
```

Hierdoor zijn handmatige aanroepen van `Queuety::register()` voor elke handler niet meer nodig. Nieuwe handlers worden automatisch gevonden wanneer je een klasse met het attribuut aan de map toevoegt.

## Combineren met handmatige registratie

Automatisch ontdekte en handmatig geregistreerde handlers kunnen naast elkaar in hetzelfde register staan. Je kunt beide werkwijzen in hetzelfde project gebruiken:

```php
// Auto-discover the bulk of handlers
Queuety::discover_handlers( __DIR__ . '/handlers', 'MyPlugin\\Handlers' );

// Manually register a handler without the attribute
Queuety::register( 'legacy_handler', LegacyHandler::class );
```
