> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Notifiche

> Come inviare notifiche su più canali (email, database, Slack) con il sistema di notifiche di Laravel.

## Cosa sono le notifiche

Il sistema di notifiche di Laravel invia notifiche con un'API unificata su canali multipli: email, SMS, Slack, database, ecc.

**Differenza tra Mail e Notification**

| Confronto      | Mail              | Notification                |
| -------------- | ----------------- | --------------------------- |
| Uso principale | Email HTML ricche | Notifiche brevi             |
| Canali         | Solo email        | Email, DB, Slack, SMS, ecc. |
| Template       | Completa libertà  | Formato messaggio semplice  |

Per notifiche uguali su più canali (es. conferma di pagamento), le Notification sono più adatte.

## Creazione di una Notification

```shell theme={null}
php artisan make:notification InvoicePaid
```

Le classi sono in `app/Notifications/`. Ogni classe ha un metodo `via()` e i metodi per generare il messaggio per ciascun canale.

## Invio

### Con il trait Notifiable

`App\Models\User` include già `Notifiable`. Usa `notify()`.

```php theme={null}
use App\Notifications\InvoicePaid;

$user->notify(new InvoicePaid($invoice));
```

<Info>
  Il trait `Notifiable` può essere aggiunto a qualsiasi modello, non solo a `User`.
</Info>

### Con la facade Notification

Per più utenti:

```php theme={null}
use Illuminate\Support\Facades\Notification;

Notification::send($users, new InvoicePaid($invoice));
```

Per inviare subito (saltando la coda) usa `sendNow()`.

```php theme={null}
Notification::sendNow($developers, new DeploymentCompleted($deployment));
```

## Selezione dei canali

Il metodo `via()` restituisce l'array dei canali.

```mermaid theme={null}
flowchart TD
    A["$user->notify(new InvoicePaid())"] --> B["via() decide<br>i canali"]
    B --> C{"Selezione canale"}
    C --> D["mail<br>toMail()"]
    C --> E["database<br>toArray()"]
    C --> F["broadcast<br>toBroadcast()"]
    C --> G["vonage<br>toVonage()"]
    C --> H["slack<br>toSlack()"]
```

```php theme={null}
public function via(object $notifiable): array
{
    return ['mail', 'database'];
}
```

Puoi differenziare per preferenza utente.

```php theme={null}
public function via(object $notifiable): array
{
    return $notifiable->prefers_sms ? ['vonage'] : ['mail', 'database'];
}
```

Canali principali:

| Canale    | Chiave      | Descrizione                    |
| --------- | ----------- | ------------------------------ |
| Email     | `mail`      | Notifica via email             |
| Database  | `database`  | Salva in DB per mostrare in UI |
| Broadcast | `broadcast` | Notifica realtime (WebSocket)  |
| SMS       | `vonage`    | SMS via Vonage (ex Nexmo)      |
| Slack     | `slack`     | Post su canale Slack           |

## Canale email

Restituisci un `MailMessage` in `toMail()`.

```php theme={null}
use Illuminate\Notifications\Messages\MailMessage;

public function toMail(object $notifiable): MailMessage
{
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
        ->greeting('Ciao!')
        ->line('Il pagamento della tua fattura è stato confermato.')
        ->action('Vedi fattura', $url)
        ->line('Grazie per averci scelto.');
}
```

Metodi principali:

| Metodo       | Descrizione     |
| ------------ | --------------- |
| `greeting()` | Saluto iniziale |
| `line()`     | Riga di testo   |
| `action()`   | Pulsante link   |
| `subject()`  | Oggetto         |
| `from()`     | Mittente        |
| `mailer()`   | Mailer da usare |

Per un messaggio d'errore (pulsante rosso) usa `error()`.

```php theme={null}
return (new MailMessage)
    ->error()
    ->subject('Pagamento fallito')
    ->line('Il pagamento della fattura è fallito.');
```

### Email Markdown

```shell theme={null}
php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
```

Usa `markdown` al posto di `view` in `toMail()`.

```php theme={null}
use Illuminate\Notifications\Messages\MailMessage;

public function toMail(object $notifiable): MailMessage
{
    return (new MailMessage)
        ->markdown('mail.invoice.paid', [
            'url' => url('/invoice/'.$this->invoice->id),
            'invoice' => $this->invoice,
        ]);
}
```

## Canale database

Salva le notifiche in DB per mostrarle in app.

### Preparazione della tabella

```shell theme={null}
php artisan make:notifications-table

php artisan migrate
```

### Metodo toArray

```php theme={null}
public function toArray(object $notifiable): array
{
    return [
        'invoice_id' => $this->invoice->id,
        'amount' => $this->invoice->amount,
        'message' => 'Il pagamento è stato confermato.',
    ];
}
```

Salvato in JSON nella colonna `data` di `notifications`.

### Recupero

```php theme={null}
$user = App\Models\User::find(1);

foreach ($user->notifications as $notification) {
    echo $notification->type;
    echo $notification->data['message'];
}
```

Solo non lette:

```php theme={null}
foreach ($user->unreadNotifications as $notification) {
    echo $notification->data['message'];
}
```

### Segnare come lette

```php theme={null}
foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
}

$user->unreadNotifications->markAsRead();

$user->unreadNotifications()->update(['read_at' => now()]);
```

## Notifiche in coda

Aggiungi `ShouldQueue` e `Queueable` per elaborarle in background.

```php theme={null}
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification implements ShouldQueue
{
    use Queueable;

    // ...
}
```

Con `ShouldQueue`, `notify()` mette automaticamente in coda.

```php theme={null}
$user->notify(new InvoicePaid($invoice));
```

Con delay:

```php theme={null}
$user->notify(
    (new InvoicePaid($invoice))->delay(now()->plus(minutes: 10))
);
```

## Invio simultaneo su più canali

Restituisci più chiavi da `via()` e definisci i relativi metodi.

```php theme={null}
<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class InvoicePaid extends Notification implements ShouldQueue
{
    use Queueable;

    public function __construct(
        private readonly Invoice $invoice,
    ) {}

    public function via(object $notifiable): array
    {
        return ['mail', 'database'];
    }

    public function toMail(object $notifiable): MailMessage
    {
        return (new MailMessage)
            ->subject('Pagamento fattura confermato')
            ->line('Il pagamento della fattura #'.$this->invoice->id.' è stato confermato.')
            ->action('Vedi fattura', url('/invoice/'.$this->invoice->id));
    }

    public function toArray(object $notifiable): array
    {
        return [
            'invoice_id' => $this->invoice->id,
            'amount' => $this->invoice->amount,
        ];
    }
}
```

## Notifiche on-demand

Per notificare utenti senza account, usa `Notification::route()`.

```php theme={null}
use Illuminate\Support\Facades\Notification;

Notification::route('mail', 'guest@example.com')
    ->route('vonage', '5555551212')
    ->notify(new InvoicePaid($invoice));
```

## Riepilogo

| Obiettivo           | Metodo                                             |
| ------------------- | -------------------------------------------------- |
| Crea una notifica   | `php artisan make:notification ClassName`          |
| Notifica un utente  | `$user->notify(new MyNotification())`              |
| Notifica più utenti | `Notification::send($users, new MyNotification())` |
| Invio email         | `via()` con `mail` + `toMail()`                    |
| Salva in DB         | `via()` con `database` + `toArray()`               |
| Coda                | implementa `ShouldQueue`                           |
| Più canali          | restituisci più chiavi da `via()`                  |


## Related topics

- [BlueskyManager e HasShortHand](/it/packages/laravel-bluesky/bluesky-manager.md)
- [Tutorial - Laravel Console Starter](/it/packages/laravel-console-starter/tutorial.md)
- [Canale di notifica - Laravel Bluesky](/it/packages/laravel-bluesky/notification.md)
- [Introduzione a Laravel Nightwatch](/it/blog/nightwatch-introduction.md)
- [Laravel Horizon](/it/horizon.md)
