Bird
Raised Fist0
Laravelframework~5 mins

Notification channels (mail, database, SMS) in Laravel

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Notification channels let your app send messages in different ways like email, SMS, or saving them in the database. This helps you reach users where they prefer.

Send an email alert when a user signs up.
Save notifications in the database for users to see later.
Send SMS messages for urgent alerts or two-factor authentication.
Notify users via multiple channels at once for important updates.
Syntax
Laravel
public function via(object $notifiable): array
{
    return ['mail', 'database', 'nexmo'];
}

public function toMail(object $notifiable): MailMessage
{
    return (new MailMessage)
                ->line('Your notification message here.')
                ->action('View', url('/'))
                ->line('Thank you for using our app!');
}

public function toDatabase(object $notifiable): array
{
    return [
        'message' => 'Your notification message here.',
        'url' => url('/'),
    ];
}

public function toNexmo(object $notifiable): NexmoMessage
{
    return (new NexmoMessage)
                ->content('Your SMS notification message here.');
}

The via method defines which channels to use for sending notifications.

Each channel has its own method like toMail, toDatabase, and toNexmo for SMS.

Examples
This example sends the notification only by email.
Laravel
public function via(object $notifiable): array
{
    return ['mail'];
}
This example saves the notification in the database only.
Laravel
public function via(object $notifiable): array
{
    return ['database'];
}
This example sends the notification by email, saves it in the database, and sends an SMS.
Laravel
public function via(object $notifiable): array
{
    return ['mail', 'database', 'nexmo'];
}
Sample Program

This notification sends a welcome message by email, saves it in the database, and sends an SMS to the user.

Laravel
<?php

namespace App\Notifications;

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\NexmoMessage;

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

    public function toMail(object $notifiable): MailMessage
    {
        return (new MailMessage)
                    ->line('Welcome to our app!')
                    ->action('Get Started', url('/dashboard'))
                    ->line('Thank you for joining us!');
    }

    public function toDatabase(object $notifiable): array
    {
        return [
            'message' => 'Welcome to our app! Start exploring your dashboard.',
            'url' => url('/dashboard'),
        ];
    }

    public function toNexmo(object $notifiable): NexmoMessage
    {
        return (new NexmoMessage)
                    ->content('Welcome to our app! Visit your dashboard to get started.');
    }
}

// Usage example in a controller or event:
// $user->notify(new WelcomeUser());
OutputSuccess
Important Notes

Make sure to configure your mail, database, and SMS services in Laravel before using these channels.

SMS channel uses services like Nexmo (now Vonage) or others; you need API keys set up.

Database notifications let users see alerts inside your app even if they miss emails or SMS.

Summary

Notification channels let you send messages in different ways easily.

Use via to pick channels, and define methods like toMail, toDatabase, and toNexmo.

Configure services properly to make notifications work smoothly.

Practice

(1/5)
1. In Laravel notifications, which method defines the channels a notification will be sent through?
easy
A. via
B. send
C. channels
D. notify

Solution

  1. Step 1: Understand the notification class structure

    Laravel notifications use a method to specify which channels to send the notification through.
  2. Step 2: Identify the method name

    The method that returns an array of channels is named via.
  3. Final Answer:

    via -> Option A
  4. Quick Check:

    Channel selection method = via [OK]
Hint: Remember: 'via' means 'through' which fits channel selection [OK]
Common Mistakes:
  • Confusing 'send' with 'via' method
  • Using 'channels' instead of 'via'
  • Assuming 'notify' defines channels
2. Which of the following is the correct syntax to specify the mail channel in the via method of a Laravel notification?
easy
A. return mail();
B. return 'mail';
C. return ['mail'];
D. return ['MailChannel'];

Solution

  1. Step 1: Check the return type of the via method

    The via method must return an array of channel names as strings.
  2. Step 2: Identify the correct array syntax

    Returning ['mail'] is correct; returning a string or function call is incorrect.
  3. Final Answer:

    return ['mail']; -> Option C
  4. Quick Check:

    Channel list must be an array of strings [OK]
Hint: Always return an array of channel names in via [OK]
Common Mistakes:
  • Returning a string instead of an array
  • Calling a function instead of returning array
  • Using incorrect channel class names
3. Given this Laravel notification code snippet, what will be stored in the database when the notification is sent?
public function toDatabase($notifiable) {
    return [
        'invoice_id' => 1234,
        'amount' => 250
    ];
}
medium
A. Only the 'invoice_id' value 1234
B. An array with keys 'invoice_id' and 'amount' and their values
C. A JSON string of the notification class name
D. An error because toDatabase must return a string

Solution

  1. Step 1: Understand the toDatabase method role

    The toDatabase method returns an array of data saved in the notifications table.
  2. Step 2: Analyze the returned array

    The array contains keys 'invoice_id' and 'amount' with values 1234 and 250 respectively.
  3. Final Answer:

    An array with keys 'invoice_id' and 'amount' and their values -> Option B
  4. Quick Check:

    toDatabase returns array data saved in DB [OK]
Hint: toDatabase returns array data stored in notifications table [OK]
Common Mistakes:
  • Expecting a string instead of array
  • Thinking only one key is saved
  • Confusing toMail with toDatabase
4. Identify the error in this Laravel notification class snippet for sending SMS via Nexmo:
public function via($notifiable) {
    return ['nexmo'];
}

public function toNexmo($notifiable) {
    return (new NexmoMessage)->content('Hello!');
}
medium
A. Method name should be toSms, not toNexmo
B. The content method is not valid for NexmoMessage
C. The via method should return 'sms' instead of 'nexmo'
D. NexmoMessage class is not imported or aliased

Solution

  1. Step 1: Check method names and channel names

    Using 'nexmo' in via and method toNexmo is correct for SMS via Nexmo.
  2. Step 2: Verify class usage

    The NexmoMessage class must be imported with use statement or aliased; missing import causes error.
  3. Final Answer:

    NexmoMessage class is not imported or aliased -> Option D
  4. Quick Check:

    Missing import causes class not found error [OK]
Hint: Always import notification channel classes before use [OK]
Common Mistakes:
  • Renaming toNexmo incorrectly
  • Returning wrong channel name in via
  • Misusing content method on NexmoMessage
5. You want to send a Laravel notification via mail, database, and SMS (Nexmo). Which of the following via method implementations correctly sets all three channels?
hard
A. return ['mail', 'database', 'nexmo'];
B. return ['mail', 'database', 'sms'];
C. return ['MailChannel', 'DatabaseChannel', 'NexmoChannel'];
D. return ['mail', 'db', 'nexmo'];

Solution

  1. Step 1: Recall correct channel names for Laravel notifications

    Laravel uses lowercase strings 'mail', 'database', and 'nexmo' to specify channels.
  2. Step 2: Compare options for correct channel names

    return ['mail', 'database', 'nexmo']; uses correct channel names; others use incorrect or non-existent names.
  3. Final Answer:

    return ['mail', 'database', 'nexmo']; -> Option A
  4. Quick Check:

    Use exact channel strings in via array [OK]
Hint: Use exact lowercase channel names: mail, database, nexmo [OK]
Common Mistakes:
  • Using 'sms' instead of 'nexmo'
  • Using class names instead of strings
  • Using shorthand like 'db' instead of 'database'