Ngoài việc hỗ trợ gửi email, Laravel cũng hỗ trợ gửi thông báo trên nhiều channels khác, bao gồm mail, SMS và Slack. Thông báo cũng có thể được lưu trữ trong cơ sở dữ liệu để chúng có thể được hiển thị trong giao diện website của bạn.
Bài nay mình sẽ hướng dẩn bạn sử dụng database để lưu và hiển thi thông báo khi người dùng thực hiện 1 thao tác nào đó.
Tiếp theo bạn dùng cấu lệnh artisan để tạo môt file TestNotification
php artisan make:notification TestNotification
file vừa được tạo nằm ở thư mục \app\Notifications\TestNotification.php.
Tại function via các bạn hãy sử dụng return database để dữ liệu được lưu lại trong db.
public function via($notifiable)
{
return ['database'];
}
Sử dụng function toArray để event trả ra một data lưu vào bảng notifications.
public function toArray($notifiable)
{
return [
'invoice_id' => $this->invoice->id,
'amount' => $this->invoice->amount,
];
}
Chúng ta sẻ sửa lại file đó như sau.
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
class TestNotification extends Notification
{
use Queueable;
protected $data;
/**
* Create a new notification instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the notification's delivery channels.
*
* @param mixed $notifiable
* @return array
*/
public function via($notifiable)
{
return ['database'];
}
/**
* Get the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line('The introduction to the notification.')
->action('Notification Action', url('/'))
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @param mixed $notifiable
* @return array
*/
public function toArray($notifiable)
{
return $this->data;
}
}
Tiếp đến chúng ta sẻ tạo màn hình đăng nhập đăng kí để tạo user sẻ nhận được thông báo.
chạy lênh php artisan make:auth và vào địa chỉ http://127.0.0.1:8000/register để đăng kí 1 user.
Tạo giao diện fake thông báo
Vào folder view trong thư mục resources để tạo ra file notificaton.blade.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Notifications\TestNotification;
use App\User;
class SendNotification extends Controller
{
public function create()
{
return view('notification');
}
public function store(Request $request)
{
$user = User::find(1); // id của user mình đã đăng kí ở trên, user này sẻ nhận được thông báo
$data = $request->only([
'title',
'content',
]);
$user->notify(new TestNotification($data));
return view('notification');
}
}
Trong bảng notification có 1 trường read_at để hiển thị thời gian bạn đã đọc thông báo. Chúng ta có thể sử dụng hàm $notification->markAsRead(); để đánh dấu là đã đọc.
Sử dụng pusher để thông báo realtime
Pusher là một dịch vụ cung cấp cho người dùng một serve ảo làm trung gian xử lý các dữ liệu với thời gian thực. Để dùng được pusher, chúng ta sẽ sử dụng package pusher/pusher-php-server, chạy lệnh sau để cài đặt
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class NotificationEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
protected $data;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct($data)
{
$this->data = $data;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('send-message');
}
}
Tiếp theo vào file controller lúc trước và sửa lại như sau