如何在Laravel中创建通知
#php #laravel

本文最初由Funke Faith OlasupoHoneybadger Developer Blog上撰写。

构建应用程序时,通知是必不可少的,因为它们可以改善用户体验和互动。如果您在使用应用程序时经常提醒用户进行各种更改或活动,那将是有帮助的。它可能涉及在订单状态更改时出于安全目的发送有关其登录活动的短信或电子邮件通知。通常,这些通知仅提供对国家变化的简短解释。
Laravel支持several delivery channels发送通知,包括电子邮件,SMS和Slack。此外,通知可以保存在数据库中并显示在您的Web界面上。以下是您在本指南中学到的几件事:

  • 什么是通知?
  • Laravel支持的通知渠道。
  • 如何使用Laravel中的实时数据库通知。
  • 如何使用Laravel中的电子邮件通知。
  • 其他由Laravel支持的通知输送渠道。

Laravel通知

通知可以视为简短的,直接发送给用户的直接消息,以告知他们重要的信息和事件,或在应用程序中提示响应。理想情况下,它们可以使用户更新并增加用户参与度。 Laravel为通过各种渠道发送通知提供了支持。默认情况下,它包括mailSlackdatabase,广播和Vonage频道。
通过使用Laravel Artisan命令,您可以快速创建通知。您也可以自定义通知的详细信息。

Laravel的通知频道

Laravel允许您从各种通知渠道中进行选择以在应用程序中发送通知。您可以使用多个通道。

  • 邮件 - 这些通知是作为电子邮件发送给用户的。

  • SMS 用户在其手机上收到这些SMS通知。

  • 数据库这些通知存储在数据库中,您可以使用自定义UI显示给用户。

  • slack - 将这些通知发送到松弛通道。

社区驱动的通知

如果您想使用其他频道,例如Telegram。

您也可以决定到create drivers to deliver notifications via other channels

在本教程中,我们将构建一个Laravel应用程序,该应用程序通过emaildatabase频道发送通知。最终应用程序的源代码可在GitHub上找到。

如何发送数据库通知

通过数据库渠道发送时,通知将保存在数据库表中。该表中都包含了标识通知的通知和JSON数据的类型。

创建一个新的Laravel项目

您可以通过Composer命令或Laravel Installer创建一个新的Laravel项目:

laravel new project_name   
//Or
composer create-project laravel/laravel project_name

这将在名为 project_name的新目录中创建一个新的Laravel应用程序。

连接到数据库

Here是我写的一篇文章,该文章解释了connect a Laravel Application to a MySQL database的方法。如果您有不同的数据库,请确保适当地将其连接。

设置默认身份验证脚手架

Laravel Auth提供了预先建立的身份验证UI和与之交互的功能。使用此命令安装Laravel UI软件包:

composer require laravel/ui

然后创建一个bootstrap auth脚手架。 Bootstrap身份验证脚手架为Laravel提供了注册和登录的默认UI和基本身份验证。您可以使用Artisan命令安装它:

php artisan ui bootstrap --auth

接下来,安装npm软件包以生成cssjs文件并运行环境。

npm install

npm run dev

最后,运行迁移以使用此命令创建数据库表:

php artisan migrate

运行应用程序

运行此Artisan命令为项目服务:

php artisan serve

默认情况下,该应用程序将在8000端口上提供,如果您在浏览器上访问http://localhost:8000/,则应在右上角使用loginregister选项查看此着陆页。

Welcome

成功注册或登录后,您可以查看仪表板。所有这些基本的身份验证过程和UI均由前面安装的laravel/ui软件包处理。

Dashboard

创建通知表

您需要创建一个数据库表以包含所有通知。可以随时查询它向用户界面显示通知。要使用适当的通知表模式生成迁移,您可以使用此Artisan命令:

php artisan notifications:table

这将在数据库/迁移目录中创建A create_notification_table.php ,该目录定义了通知表的模式。现在,您可以通过运行以下内容迁移到数据库:

php artisan migrate

生成通知

laravel中的每个通知都由一个类别表示,通常存储在 app/notifications 目录中。当您运行make:notification Artisan命令时,它将生成:

php artisan make:notification DepositSuccessful

这将在 app/notifications/notifications 目录中使用新的通知类生成a rockitsuccessuccessful.php 文件。该类包括一个via()方法,该方法指定了渠道和身体消息构建方法,以协助格式化所选通道的通知数据。

通知类应具有定义的toDatabasetoArray函数。此方法在接收$notifiable实体后应返回一个简单的PHP数组。返回的数组将被编码为JSON后,将存储在您的通知表的data列中。

格式化数据库通知

您想在用户在应用程序中成功存入其存入金额时通知他们。
repostitsuccessful.php 文件中更新__construct()方法以匹配此示例:

protected $amount; 
public function __construct($amount)
{
    $this->amount=$amount;
}

现在,存款金额已注入construct()方法中,因此可以用于生成邮件。

现在,您需要通过更新via()方法来指定用于使用的通知频道:

public function via($notifiable)
{
    return ['database'];
}

接下来,使用通知的详细信息更新toArray()toDatabase()方法。
您必须定义toDatabase()toArray()方法,并且应该返回在通知表的data列中存储的简单PHP数组。

public function toArray($notifiable)
{
    return [
        'data' =>' Your deposit of '. $this->amount.' was successful'
    ];
}

数据库广播频道都使用了toArray()。如果要使用具有不同数组表示的应用中的两个频道,则应定义toDatabase()toArray()。但是,toArray()是默认的。

添加通知性状

Laravel通知提供了两种发送通知的方法。它包括Notifiable特质或Notification外墙。在本教程中,我们将重点关注通知的特征。
默认情况下,Laravel在app/Models/User模型中包含了可知的特征。它应该与此示例匹配:

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
.
.//Other model definitions
.
}

设置存款模型和迁移

首先,通过运行以下命令同时创建模型和数据库迁移:

php artisan make:model Deposit -m

这将在 app/models/models 目录中创建一个称为 posit.php Model文件和一个称为 create_deposits_table.php Migration文件。 em>数据库/迁移目录。

Update poade.php 通过将下面的代码添加到文件顶部,该代码启用型号mass assignment

protected $guarded = [];

然后,在 create_deposits_table.php 迁移文件中更新up()方法,其中包含存款详细信息,如下所示:

public function up()
{
    Schema::create('deposits', function (Blueprint $table) {
        $table->id();
        $table->string('amount');
        $table->foreignId('user_id')->references('id')->on('users')->constrained()->onDelete('cascade')->onUpdate('cascade');   
       $table->timestamps();
    });
}

然后,再次将迁移到数据库。

php artisan migrate

设置控制器

最好是定义逻辑来存款并在controller成功存入后发送通知。
要创建控制器,请运行此工匠命令:

php artisan make:controller DepositController

一个新文件 poadecontroller.php 是在 app/http/controllers 目录中创建的。

使用创建的文件,添加下面的import语句以导入控制器将使用的类:

use App\Models\Deposit;
use App\Models\User;
use App\Notifications\DepositSuccessful;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

添加_construct()方法来声明auth中间件,该方法只允许身份验证的用户存入存款。

public function __construct()
{
    $this->middleware('auth');
}

定义deposit()方法,包括用于存款和发送成功的存款通知的逻辑。

public function deposit(Request $request){
    $deposit = Deposit::create([
        'user_id' =>Auth::user()->id,
        'amount'  => $request->amount
    ]);
    User::find(Auth::user()->id)->notify(new DepositSuccessful($deposit->amount));

    return redirect()->back()->with('status','Your deposit was successful!');
}

使用Notifiable traitNotification facadenotify()方法发送通知。当将通知发送给多个实体(例如用户集合)时,立面非常有用。尽管我们在本指南中使用notify(),但这里是使用Notification立面的示例。

$users = User::all();

Notification::send($users, new DepositSuccessful($deposit->amount));

注意:已通知性状已经导入到用户模型中。您可以将其导入到您需要发送通知的任何模型中。

设置路线

您将在路由/web.php 中添加一个新的route

Route::post('/deposit', [App\Http\Controllers\DepositController::class,'deposit'])->name('deposit');

修改视图

向主页添加基本表单,以供用户存入 Resources \ views \ home.blade.blade.php 目录。

<form method="POST" action="{{ route('deposit') }}">
    @csrf
    <h5 class="text-center mb-3">Make A Deposit</h5>
    <div class="row mb-3">
        <label for="amount" class="col-md-4 col-form-label text-md-end">{{ __('Amount') }}</label>
        <div class="col-md-6">
            <input id="amount" type="number" class="form-control @error('amount') is-invalid
            @enderror" name="amount" value="{{ old('amount') }}" required autocomplete="amount" autofocus>
            @error('amount')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    <div class="row mb-0">
        <div class="col-md-8 offset-md-4">
            <button type="submit" class="btn btn-primary">
                {{ __('Deposit') }}
            </button>
        </div>
    </div>
</form>

真棒工作!让我们通过在Navbar上包含铃声通知来使事情变得更加有趣,显示未读通知的数量。您也可以显示读取和未读通知。
Laravel的Notifiable特质提供了另一个出色的功能,可以帮助您跟踪阅读和未阅读通知。您也可以mark a notification as read or delete a notification entirely

使用MarkasRead功能更新控制器,路由和视图

定义一种新方法,存款controller.php中的markAsRead() 标记所有未读通知为读取。

public function markAsRead(){
    Auth::user()->unreadNotifications->markAsRead();
    return redirect()->back();
}

现在,将相应的路由添加到 routes/web.php。

Route::get('/mark-as-read', [App\Http\Controllers\DepositController::class,'markAsRead'])->name('mark-as-read');

您将更新此功能的一些更改。
首先,在刀片文件中包含此cdn链接到Font Awesome,以使您可以使用钟声图标。

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css" integrity="sha512-xh6O/CkQoPOWDdYTDqeRdPCVd1SpvCA9XXcUnZS2FmJNp1coAFzvtCN9BmamE+4aHK8yyUHUSCcJHgXloTyT2A==" crossorigin="anonymous" referrerpolicy="no-referrer" />

现在,在else语句之后立即在全名和注销下拉列表之前添加此示例。

<li class="nav-item dropdown">
    <a id="navbarDropdown" class="nav-link " href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
        <i class="fa fa-bell"></i>
        <span class="badge badge-light bg-success badge-xs">{{auth()->user()->unreadNotifications->count()}}</span>
    </a>
    <ul class="dropdown-menu">
                @if (auth()->user()->unreadNotifications)
                <li class="d-flex justify-content-end mx-1 my-2">
                    <a href="{{route('mark-as-read')}}" class="btn btn-success btn-sm">Mark All as Read</a>
                </li>
                @endif

                @foreach (auth()->user()->unreadNotifications as $notification)
                <a href="#" class="text-success"><li class="p-1 text-success"> {{$notification->data['data']}}</li></a>
                @endforeach
                @foreach (auth()->user()->readNotifications as $notification)
                <a href="#" class="text-secondary"><li class="p-1 text-secondary"> {{$notification->data['data']}}</li></a>
                @endforeach
    </ul>
</li>

这将导致一个钟声图标,并在全名和仪表板上的列表下拉列表之前具有未读通知的徽章计数。它也有所有通知的下拉列表,未读取的通知。下拉列表还具有将所有通知标记为读取的选项,以使徽章计数返回0(这意味着没有未读的通知)。

Notification_badge

惊人的工作ð©!此时,您可以通过存款来进行测试,以查看成功后的通知如何在仪表板上显示。

如何发送电子邮件通知

但是,让我们走得更远,包括电子邮件通知。付款后,我们想在仪表板中显示通知并向用户发送电子邮件。

更新.env邮件配置

您需要使用您的应用程序需要将电子邮件发送给用户的有效邮件凭据更新这些环境变量。

MAIL_MAILER=
MAIL_HOST=
MAIL_PORT=
MAIL_USERNAME=
MAIL_PASSWORD=
MAIL_ENCRYPTION=
MAIL_FROM_ADDRESS=
MAIL_FROM_NAME="${APP_NAME}"

格式化邮件通知

在您之前创建的DepositSuccessful通知类中,更新via()方法以包含电子邮件。

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

之后,使用邮件邮件定义toMail()方法。此方法在接收$notifiable实体后应返回Illuminate/Notifications/Messages/MailMessage实例。

现在,您可以借助MailMessage类提供的一些简单方法来构建电子邮件。在邮件邮件中可以使用“行动呼叫”和文本行。

public function toMail($notifiable)
{
    $url = url('/home');
    return (new MailMessage)
                ->greeting('Hello,')
                ->line('Your deposit of '. $this->amount. ' was successful.')
                ->action('View dashboard', url('/home'))
                ->line('Thank you for using our application!');
}

使用MailMessage对象提供的这些方法可以快速,轻松地快速,轻松地格式化小型交易电子邮件。邮件频道将从消息组件中生成一个精美,响应迅速的HTML电子邮件模板,并具有普通文本对应物。在此示例中,我们提供了一个电话(按钮),一行文本和问候。

hurrayð!我们已经完成了ð。现在,让我们进行一些测试,看看它是否有效。

测试

如果您成功存款,您将在仪表板上收到一份看起来像这样的通知:

Success

请注意,徽章号仅计算未读通知。但是,下拉列表列出了所有通知,从未读的通知开始。如果您决定使用mark all as read,它会刷新,并且您的通知徽章计数返回0,因为您已经阅读了所有当前的通知。

您还将收到一个看起来像这样的邮件通知:

Mail

请注意,问候,文字和呼吁行动(按钮)已格式化为响应式电子邮件模板。

结论

在本文中,您对Laravel通知有了深入的了解。这是一个广泛的概念,但这可能是一个很好的实践指南。查看official Laravel documentation,以了解有关Laravel Notifications的更多信息。它提供了各种灵活的选项,您可以自定义这些渠道来定制应用程序需求或create your drivers to deliver notifications via other channels。该项目的代码为开源,可用on GitHub

我对更好地实施通知的方法,贡献和对话持开放态度,因此请评论存储库或DM me @twitter

感谢您的阅读。