Laravel - Digging Deeper - Notifications (官方文件原子化翻譯筆記)

# 前言

學習一個框架, Ray 的想法是, 在深入理解底層實作的原理之前, 應該先知道這個框架的 使用方法; 先學習怎麼使用這個前人造的輪子, 再學習怎麼樣一個輪子。
所以本篇文章重點在於細讀官方文件, 並將內容理解後以 Q&A 的方式記錄下來, 加速學習以及查詢。



# Creating Notifications

Laravel Notifications 中, 如果我要使用 CLI 建立 notification, 可以怎麼做?
php artisan make:notification NotificationName


# Sending Notifications

# Using The Notifiable Trait

Laravel Notifications 中, 要發送一個 notification 有哪兩種方式?
  • Notifiable trait
  • Notification facade
Laravel Notifications 中, 哪個 model 預設就有使用 Notifiable trait?

User model

Laravel Notifications 中, Notifiable trait 可以使用在哪些 model 上?

每一個 model

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use App\Notifications\InvoicePaid;

    $user->notify(new InvoicePaid($invoice));
  • Answer:
    使用 notifiable trait 的 notify() 將該 notification 發送給該 user, 具體使用哪一種 notification type 視乎在 InvoicePaid 中的 via method 如何定義

# Using The Notification Facade

Laravel Notifications 中, 什麼情境下比較適合使用 Notification Facade?

當我要發送 notification 給多個對象時

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Notification::send($users, new InvoicePaid($invoice));
  • Answer:
    使用 Notification facade 一次發送 notification 給多個 user

# Specifying Delivery Channels

Laravel Notifications 中, 哪一個 method 決定 notification 要以什麼樣的形式被傳送, 例如 mail, 或 slack 等等…

via method

Laravel Notifications 中, 哪個網站可以看到 notification 支援 channel 總表?

這裏

解釋以下 Laravel Notification example
  • Example:
    <?php
    public function via($notifiable)
    {
    return $notifiable->prefers_sms ? ['nexmo'] : ['mail', 'database'];
    }
  • Answer:
    如果 $notifiable 的 attribute prefers_sms 為 true, 則經由 nexmo 發送, 否則則經由 mail 以及 database
Laravel Notifications 中, $notifiable 代表?

Notification 要發送到的 instance, 例如我要發送到指定 user, 那 $notifiable 就代表該 user model


# Queueing Notifications

以下的 Laravel example code 的意思是?
  • Example:
    <?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;

    // ...
    }
  • Answer:
    implement ShouldQueue interface, 該 notification 將會被 queue
    use Queueable trait, 該 notification 內可使用 Queueable trait 定義的 method
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $when = now()->addMinutes(10);

    $user->notify((new InvoicePaid($invoice))->delay($when));
  • Answer:
    不立即發送 notification, 會 delay $when 之後再執行

# On-Demand Notifications

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Notification::route('mail', 'ray@example.com')
    ->route('nexmo', '3333')
    ->notify(new InvoicePaid($invoice));
  • Answer:
    使用 Notification class 的 route method, 可指定 channel 以及接收方並傳送, 儘管接收方並不存在於 database


# Mail Notifications

# Formatting Mail Messages

Laravel Notifications 中, 如果 notification 會以 mail 的形式被傳送, 那我需要再 Notification class 中使用 哪一個 method 來定義 mail 內容?

toMail method

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
    ->greeting('Hello!')
    ->line('One of your invoices has been paid!')
    ->action('View Invoice', $url)
    ->line('Thank you for using our application!');
    }
  • Answer:
    在 notification 的 toMail() 中定義 mail 的格式以及內容

# Other Notification Formatting Options

Laravel Notifications 中, 除了使用 lines 語法在 toMail method 裡頭定義 mail 格式外, 如果我想要使用 template 來定義, 可以使用 MailMessage 的哪一個 method?

view method

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)->view(
    'emails.name', ['invoice' => $this->invoice]
    );
    }
  • Answer:
    在 notification 的 tiMail() 中, 使用 MailMessage class 的 view(), 以 template 來定義 mail 格式以及內容
Laravel Notifications 中, 在 toMail method 中, 可以使用哪幾種方式來定義 mail 內容或格式?
  • greeting 等等的 syntax
  • view
  • mailable class
  • markdown

# Error Messages

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->error()
    ->subject('Notification Subject')
    ->line('...');
    }
  • Answer:
    使用 error() 當該 mail 內容是與 error 有關

# Customizing The Sender

Laravel Notifications 中, 預設的 mail sender 定義在哪個檔案中

config/mail.php

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->from('test@example.com', 'Example')
    ->line('...');
    }
  • Answer:
    定義 mail sender, 除了可在 config/mail.php 定義之外, 也可使用 from() 定義

# Customizing The Recipient

以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App;

    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;

    class User extends Authenticatable
    {
    use Notifiable;

    public function routeNotificationForMail($notification)
    {
    // Return email address only...
    return $this->email_address;
    }
    }
  • Answer:
    當寄送 mail 時, 預設會去尋找 notifiable 的 email property, 如果我不想使用 email, 可以使用 routeNotificationForMail(), 自定義成 email_address

# Customizing The Subject

Laravel Notifications 中, 當我使用 mail 發送 notification 時, 預設 subject 是什麼?

class name, 如果 class 是 InvoicePaid, subject 就是 Invoice Paid

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->subject('Notification Subject')
    ->line('...');
    }
  • Answer:
    當使用 mail notification 時, 預設 subject 會是 class name, 比如 InvoicePaid 會變成 Invoice Paid, 可使用 subject() 自定義

# Customizing The Mailer

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->mailer('postmark')
    ->line('...');
    }
  • Answer:
    若要定義 mailer driver, 除了可在 config/mail.php 定義之外, 也可使用 mailer() 定義

# Customizing The Templates

以下的 Laravel example code 的意思是?
  • Example:
    php artisan vendor:publish --tag=laravel-notifications
  • Answer:
    會將 vendor 中的 notification 模板匯出, 可完全自定義

# Previewing Mail Notifications

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Route::get('mail', function () {
    $invoice = App\Invoice::find(1);

    return (new App\Notifications\InvoicePaid($invoice))
    ->toMail($invoice->user);
    });
  • Answer:
    將 InvoicePaid 這個 notification 在 Mail 上是如何顯示的 return 到瀏覽器, 以供確認以及測試


# Markdown Mail Notifications

# Generating The Message

以下的 Laravel example command 的意思是?
  • Example:
    php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
  • Answer:
    建立一個名為 InvoicePaid 的 notification, 以及一個 markdown, 路徑為 mail/invoice/paid
以下的 Laravel example command 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    $url = url('/invoice/'.$this->invoice->id);

    return (new MailMessage)
    ->subject('Invoice Paid')
    ->markdown('mail.invoice.paid', ['url' => $url]);
    }
  • Answer:
    使用 markdown template 來定義 mail 的格式內容

# Writing The Message

# Button Component

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    @component('mail::button', ['url' => $url, 'color' => 'green'])
    View Invoice
    @endcomponent
  • Answer:
    當使用 markdown template 定義 mail 格式內容時, 使用 @component, 建立一個內建的 mail button, 並指定其 url 以及 color

# Panel Component

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    @component('mail::panel')
    This is the panel content.
    @endcomponent
  • Answer:
    當使用 markdown template 定義 mail 格式內容時, 使用 mail::panel, 該區塊內的背景顏色會不同, 以凸顯區塊內的文字

# Table Component

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    @component('mail::table')
    | Laravel | Table | Example |
    | ------------- |:-------------:| --------:|
    | Col 2 is | Centered | $10 |
    | Col 3 is | Right-Aligned | $20 |
    @endcomponent
  • Answer:
    當使用 markdown template 定義 mail 時, 使用 mail::table 定義一個 markdown 格式的 table

# Customizing The Components

以下的 Laravel example command 的意思是?
  • Example:
    php artisan vendor:publish --tag=laravel-mail
  • Answer:
    會將 vendor 中 mail 的模板全部匯出, 然後可根據需求自定義模板
Laravel Notifications 中, 當我使用以下的 CLI 來匯出 component 的 source 檔時, 會匯出到哪個資料夾?

resources/views/vendor/mail


# Customizing The CSS

Laravel Notifications 中, 如果我要自定義一個 mail markdown 的 theme, 可以在哪個資料夾中定義新的 css 檔案?

resources/views/vendor/mail/html/themes

Laravel Notifications 中, 如果我在 resources/views/vendor/mail/html/themes 資料夾中自己定義了一個 css 檔案, 接下來我必須要修改哪個檔案的設定來讓他生效?

config/mail.php

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toMail($notifiable)
    {
    return (new MailMessage)
    ->theme('invoice')
    ->subject('Invoice Paid')
    ->markdown('mail.invoice.paid', ['url' => $url]);
    }
  • Answer:
    <?php
    // 使用 toMail method 來定義 to mail 格式
    public function toMail($notifiable)
    {
    return (new MailMessage)
    // 指定 theme, 位於 `resources/views/vendor/mail/html/themes` 資料夾, invoice.css 檔案, 若不指定會使用 default.css
    ->theme('invoice')
    // Mail 主題
    ->subject('Invoice Paid')
    // markdown 模板, 帶 url 參數過去
    ->markdown('mail.invoice.paid', ['url' => $url]);
    }


# Database Notifications

# Prerequisites

Laravel Notifications 中, 什麼是 database notification?

將 notification 儲存於 database table

Laravel Notifications 中, 如果我要使用 CLI 建立一個 notification table, 該怎麼做?
php artisan notifications:table
php artisan migrate

# Formatting Database Notifications

Laravel Notifications 中, 當我使用 database notification 時, 可使用哪個 method 來定義回傳資料?
  • toArray() method
  • toDatabase() method
Laravel Notifications 中, 如果我在我的 notification 當中同時使用了 database 以及 broadcast, 那針對 database notification 我該使用哪個 method 來定義其內容?

toDatabase method

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 的回傳格式必須是?

array

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 回傳值會被以什麼格式存在 data column?

JSON

Laravel Notifications 中, 當我使用 database notification 時, toDatabase method 回傳值會被以 JSON 格式存在哪一個 column?

data

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    public function toArray($notifiable)
    {
    return [
    'invoice_id' => $this->invoice->id,
    'amount' => $this->invoice->amount,
    ];
    }
  • Answer:
    在 notification 內, 當使用 database notification 時, 使用 toArray() 定義內容
    toArray() 可用於 broadcast 以及 database, 當兩者都有用到時, 請使用 toDatabase 以及 toBroadcast

# Accessing The Notifications

Laravel Notifications 中, 如果我要從 notifiable model 來存取 notification data, 我可以使用哪一個 trait?

Illuminate\Notifications\Notifiable trait

Laravel Notifications 中, notification 預設會以什麼排序?

created_at

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $user = App\User::find(1);

    foreach ($user->unreadNotifications as $notification) {
    echo $notification->type;
    }
  • Answer:
    當使用 Database notification 時, 可以使用 unreadNotifications relation 取得所有未讀的 notification

# Marking Notifications As Read

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    $user = App\User::find(1);

    foreach ($user->unreadNotifications as $notification) {
    $notification->markAsRead();
    }
  • Answer:
    當使用 database notification 時, 可使用 markAsRead() 標記特定 notification as read
Laravel Notifications 中, 當我使用 markAsRead() method 時, 可以使用在 collection 上嗎?

以下的 Laravel testing example code 的意思是?
  • Example:
    <?php
    $user->notifications()->delete();
  • Answer:
    刪除該 user 的 database notification


# Broadcast Notifications

# Formatting Broadcast Notifications

Laravel Notifications 中, 如果我使用 event broadcasting 來發送 notification, 該使用哪個 method?

toBroadcast method

Laravel Notifications 中, 如果我使用 event broadcasting 來發送 notification, 當 toBroadcast method 不存在於, Laravel 會使用哪個 method??

toArray method

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toBroadcast($notifiable)
    {
    return new BroadcastMessage([
    'invoice_id' => $this->invoice->id,
    'amount' => $this->invoice->amount,
    ]);
    }
  • Answer:
    在 toBroadcast method 內, 使用 new BroadcastMessage instance 來定義 broadcast message

# Broadcast Queue Configuration

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    return (new BroadcastMessage($data))
    ->onConnection('sqs')
    ->onQueue('broadcasts');
  • Answer:
    在 broadcast notification 中指定 queue 以及 connection

# Customizing The Notification Type

以下的 Laravel example command 的意思是?
  • Example:
    <?php
    use Illuminate\Notifications\Messages\BroadcastMessage;
    public function broadcastType()
    {
    return 'broadcast.message';
    }
  • Answer:
    預設 broadcast notification type 為 notification 的 full class name, 若要自定義, 可使用 broadcastType()

# Listening For Notifications

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Echo.private('App.User.' + userId)
    .notification((notification) => {
    console.log(notification.type);
    });
  • Answer:
    Laravel echo 可以 listen 事先定義好的 channel, 並接收 broadcast 後採取後續動作
    listen private channel ‘App.User.userId’, userId 為動態的, 之後再 console.log notification object 的 type property

# Customizing The Notification Channel

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    namespace App;

    use Illuminate\Broadcasting\PrivateChannel;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;

    class User extends Authenticatable
    {
    use Notifiable;

    public function receivesBroadcastNotificationsOn()
    {
    return 'users.'.$this->id;
    }
    }
  • Answer:
    當 notifiable 為 user 時, 在 user model 中定義 Broadcast notification 的對象 channel


# SMS Notifications

# Prerequisites

Laravel Notifications 中, 當我要使用 Nexmo 來發送 SMS notification 時, 要先安裝什麼?

Nexmo 套件

composer require laravel/nexmo-notification-channel
Laravel Notifications 中, 當我使用 Nexmo 來發送 SMS notification 時, 需在哪個檔案中定義發送端的號碼?

config/services.php

以下位於 config/services.php 的 Laravel example code 的意思是?
  • Example:
    <?php
    'nexmo' => [
    'sms_from' => '15556666666',
    ],
  • Answer:
    定義 Nexmo sender 的號碼

# Formatting SMS Notifications

Laravel Notifications 中, 如果使用 SMS notification 的話, notification class 中該使用哪一個 method 來定義內容?

toNexmo method

以下位於 Notification 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your SMS message content');
    }
  • Answer:
    定義 Nexmo message 的內容, 然後可以在 via method 內使用 Nexmo

# Formatting Shortcode Notifications

Laravel Notifications 中, 什麼是 shortcode notification?

Nexmo 帳號中事先定義好的模板

Laravel Notifications 中, 如果我要使用 shotcode notification, 該使用哪個 method?

toShartcode method

Laravel Notifications 中, shortcode notification 有哪幾種 type?
  • alert
  • 2fa
  • marketing
Laravel Notifications 中, 當使用 shortcode notification 時, 需要在 notifiable model 當中定義哪個 method 來定義接收方?

routeNotificationForShortcode method


# Unicode Content

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your unicode message')
    ->unicode();
    }
  • Answer:
    使用 Nexmo notification 時, 如果 content 含有 unicode, 需加上 unicode()

# Customizing The “From” Number

Laravel Notifications 中, 當使用 Nexmo notification 時, 預設的傳送人號碼被定義在哪?

config/services.php

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toNexmo($notifiable)
    {
    return (new NexmoMessage)
    ->content('Your SMS message content')
    ->from('15554443333');
    }
  • Answer:
    除了在 config/service.php 可定義發送人的號碼外, 也可使用 from() 指定

# Routing SMS Notifications

以下的 Laravel example code 的意思是?
  • Example:
    <?php

    namespace App;

    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;

    class User extends Authenticatable
    {
    use Notifiable;

    public function routeNotificationForNexmo($notification)
    {
    return $this->phone_number;
    }
    }
  • Answer:
    當使用 Nexmo notification 時, 可在 User model 的 routeNotificationForNexmo method 定義 user phone number 實際上的 column name


# Slack Notifications

# Prerequisites

Laravel Notifications 中, 若要使用 Slack notification, 需要另外安裝套件嗎?

要哦

composer require laravel/slack-notification-channel

# Formatting Slack Notifications

Laravel Notifications 中, 當我使用 Slack notification 時, 該在 notification class 當中使用哪一個 method 來定義格式跟內容?

toSlack method

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toSlack($notifiable)
    {
    return (new SlackMessage)
    ->from('Laravel', 'emoji')
    ->to('username or channel')
    ->image('https://laravel.com/img/favicon/favicon.ico')
    ->content('This will display the Laravel logo next to the message');
    }
  • Answer:
    <?php
    // 使用 toSlack method 來定義格式內容
    public function toSlack($notifiable)
    {
    return (new SlackMessage)
    // 寄件方的名字, emoji
    ->from('Laravel', 'emoji')
    // 收件方 username 或 channel
    ->to('username or channel')
    // 寄件方 logo
    ->image('https://laravel.com/img/favicon/favicon.ico')
    // 內文
    ->content('This will display the Laravel logo next to the message');
    }

# Slack Attachments

以下位於 notification 的 Laravel example code 的意思是?
  • Example:

    <?php
    public function toSlack($notifiable)
    {
    $url = url('/exceptions/'.$this->exception->id);

    return (new SlackMessage)
    ->error()
    ->content('Whoops! Something went wrong.')
    ->attachment(function ($attachment) use ($url) {
    $attachment->title('Exception: File Not Found', $url)
    ->content('File [background.jpg] was not found.');
    });
    }
  • Answer:
    使用 attachment() 定義更豐富的格式選項, 如下 picture

  • Picture:

以下位於 notification 的 Laravel example code 的意思是?
  • Example:

    <?php
    public function toSlack($notifiable)
    {
    $url = url('/invoices/'.$this->invoice->id);

    return (new SlackMessage)
    ->success()
    ->content('One of your invoices has been paid!')
    ->attachment(function ($attachment) use ($url) {
    $attachment->title('Invoice 1322', $url)
    ->fields([
    'Title' => 'Server Expenses',
    'Amount' => '$1,234',
    'Via' => 'American Express',
    'Was Overdue' => ':-1:',
    ]);
    });
    }
  • Answer:
    使用 fields(), 定義 table 的效果

  • Picture:


# Markdown Attachment Content

以下位於 notification 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function toSlack($notifiable)
    {
    $url = url('/exceptions/'.$this->exception->id);

    return (new SlackMessage)
    ->error()
    ->content('Whoops! Something went wrong.')
    ->attachment(function ($attachment) use ($url) {
    $attachment->title('Exception: File Not Found', $url)
    ->content('File [background.jpg] was *not found*.')
    ->markdown(['text']);
    });
    }
  • Answer:
    使用 markdown() 定義 markdown 語法
Laravel Slack Notifications 中, 有關 markdown format 的詳細資訊, 可以參考?

Slack API Document


# Routing Slack Notifications

Laravel Slack Notifications 中, notifiable entity 中的 routeNotificationForSlack 應該要 return 什麼?

webhook URL

Laravel Slack Notifications 中, 該在 notifiable entity 當中使用哪個 method 來定義接收方?

routeNotificationForSlack method



# Localizing Notifications

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    $user->notify((new InvoicePaid($invoice))->locale('es'));
  • Answer:
    使用 notifiable trait send notification 並使用 locale() 定義 notification locale
以下的 Laravel example code 的意思是?
  • Example:
    <?php
    Notification::locale('es')->send($users, new InvoicePaid($invoice));
  • Answer:
    使用 notification facade send notification 給多個 users 並使用 locale() 定義 notification locale

# User Preferred Locales

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    use Illuminate\Contracts\Translation\HasLocalePreference;

    class User extends Model implements HasLocalePreference
    {
    public function preferredLocale()
    {
    return $this->locale;
    }
    }
  • Answer:
    implement HasLocalePreference, 並使用 preferredLocale() 定義每個 user 的 locale, example 中假定在每個 user row 中都有定義 locale


# Notification Events

Laravel Notifications 中, 每當 notification 被傳送了, 都會觸發一個什麼事件?

Illuminate\Notifications\Events\NotificationSent

Laravel Notifications 中, 如果我想要註冊一個事件, 每當 notification 被傳送就會觸發這個事件, 那麼我可以在哪個檔案中註冊這個事件的 listener?

EventServiceProvider

以下的 Laravel example code 的意思是?
  • Example:
    <?php
    class EventServiceProvider extends ServiceProvider
    {
    protected $listen = [
    'Illuminate\Notifications\Events\NotificationSent' => [
    'App\Listeners\LogNotification',
    ],
    ];
    }
  • Answer:
    在 EventServiceProvider 的 $listen property 中, 定義了每當 notification 傳送, 就觸發 LogNotification listener
以下位於 custom listener 的 Laravel example code 的意思是?
  • Example:
    <?php
    public function handle(NotificationSent $event)
    {
    $event->channel
    $event->notifiable
    $event->notification
    $event->response
    }
  • Answer:
    <?php
    // 註冊一個 Listener, 監聽 NotificationSent event, 每當 notification sent, 就觸發此 Listener
    public function handle(NotificationSent $event)
    {
    // 取得該 notification 的 channel
    $event->channel
    // 取得該 notification 的 notifiable instance
    $event->notifiable
    // 取得該 notification 的 notification instance
    $event->notification
    // 取得該 notification 的 response instance
    $event->response
    }


# Custom Channels

Laravel Notifications 中, 如果我想要自定義我自己的 channel, 可以參考哪裡?

官方文件

Operating System Concept PHP - Data Structure and Algorithm

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×