Mở đầu
Hôm nay mình sẽ hướng dẫn cho các bạn cách tạo một webhook mechanism cho riêng mình. từ lâu chúng ta đã biểt đến và dùng chức năng webhook của github, facebook … .Đại loại là họ sẽ cho mình nhập 1 Payload URL và chọn sự kiện để khi có sự kiện đó thì github cũng send http request đến Payload URL của người dùng.
Tương tự vậy, ở demo nay chúng ta sẽ cho phép người dùng nhập webhook url của họ. và khi có 1 sự kiện nào đó trên hệ thống chúng ta thì hệ thống cũng tiến hành send http request đến url của họ (request gồm body và header).
Webhook là gì?
Cài đặt Dependencies
Đầu tiên chúng ta cần cài đặt package để cho việc gửi HTTP request. Ở đây mình dùng thư viện khá phổ biến là Guzzle:
1 2 | composer require guzzlehttp/guzzle:~6.0 |
Migrate dữ liệu
Tiếp theo chúng ta tạo bảng user. ở ví dụ demo này thì mình sẽ lưu name
, email
, password
, api_token
và đặc biệt có thêm trường webhook_url
đây chính là enpoint của người dùng khi đăng ký Webhook End Point trên hệ thống của chúng ta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">use</span> <span class="token package">IlluminateSupportFacadesSchema</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateDatabaseSchemaBlueprint</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateDatabaseMigrationsMigration</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">CreateUsersTable</span> <span class="token keyword">extends</span> <span class="token class-name">Migration</span> <span class="token punctuation">{</span> <span class="token comment">/** * Run the migrations. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">up</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Schema<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'users'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>Blueprint <span class="token variable">$table</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">increments</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'id'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">string</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'name'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">string</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'email'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">unique</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">string</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'password'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">string</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'api_key'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">string</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'webhook_url'</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">nullable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">rememberToken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token variable">$table</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">timestamps</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Reverse the migrations. * * @return void */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">down</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Schema<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">dropIfExists</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'users'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
Tạo model
Tiếp theo là tạo model User
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <span class="token keyword">namespace</span> <span class="token package">App</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateNotificationsNotifiable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateFoundationAuthUser</span> <span class="token keyword">as</span> Authenticatable<span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token keyword">extends</span> <span class="token class-name">Authenticatable</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Notifiable</span><span class="token punctuation">;</span> <span class="token comment">/** * The attributes that are mass assignable. * * @var array */</span> <span class="token keyword">protected</span> <span class="token variable">$fillable</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'name'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'email'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'password'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'api_key'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'webhook_url'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">/** * The attributes that should be hidden for arrays. * * @var array */</span> <span class="token keyword">protected</span> <span class="token variable">$hidden</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'password'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'remember_token'</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'api_key'</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">/** * @return string */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getSigningKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">api_key</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * @return string */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">getWebhookUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">webhook_url</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Model này khá dễ hiểu rồi. mình có thêm 2 hàm getSigningKey
và getWebhookUrl
để lấy api_key
và webhook_url
Tạo notification channels
Tiếp theo chúng ta cần tạo 1 notification channel. Thì laravel có hỗ trợ chúng ta tạo cũng như custom notification channels ở Tại đây.
Tiến hành tạo WebhookChannel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">AppChannels</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">GuzzleHttpClient</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateLogLogger</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateNotificationsNotifiable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateNotificationsNotification</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">WebhookChannel</span> <span class="token punctuation">{</span> <span class="token comment">/** * @var Client */</span> <span class="token keyword">private</span> <span class="token variable">$client</span><span class="token punctuation">;</span> <span class="token comment">/** * @var Logger */</span> <span class="token keyword">private</span> <span class="token variable">$logger</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span>Client <span class="token variable">$client</span><span class="token punctuation">,</span> Logger <span class="token variable">$logger</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">client</span> <span class="token operator">=</span> <span class="token variable">$client</span><span class="token punctuation">;</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">logger</span> <span class="token operator">=</span> <span class="token variable">$logger</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * @param Notifiable $notifiable * @param Notification $notification * @throws WebHookFailedException */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">,</span> Notification <span class="token variable">$notification</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
Function send là nơi chúng ta viết code để thực hiện việc send http request đến endpoint (webhook_url) của người dùng.
Tiếp theo mình tiến hành viết hàm send
Đầu tiên ,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <span class="token comment">/** * @param Notifiable $notifiable * @param Notification $notification * @throws WebHookFailedException */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">,</span> Notification <span class="token variable">$notification</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">method_exists</span><span class="token punctuation">(</span><span class="token variable">$notification</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'toWebhook'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token variable">$body</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">array</span><span class="token punctuation">)</span> <span class="token variable">$notification</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">toWebhook</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token variable">$body</span> <span class="token operator">=</span> <span class="token variable">$notification</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$timestamp</span> <span class="token operator">=</span> <span class="token function">now</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">timestamp</span><span class="token punctuation">;</span> <span class="token variable">$token</span> <span class="token operator">=</span> <span class="token function">str_random</span><span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Tạo header cho request webhook . cái này để người dùng có thể xác minh request gửi lên là từ hệ thống của chúng ta mà không phải từ hệ thông khác</span> <span class="token variable">$headers</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'timestamp'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$timestamp</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'token'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$token</span><span class="token punctuation">,</span> <span class="token single-quoted-string string">'signature'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token function">hash_hmac</span><span class="token punctuation">(</span> <span class="token single-quoted-string string">'sha256'</span><span class="token punctuation">,</span> <span class="token variable">$token</span> <span class="token punctuation">.</span> <span class="token variable">$timestamp</span><span class="token punctuation">,</span> <span class="token variable">$notifiable</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getSigningKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// Tiếp theo chúng ta tạo 1 request sử dụng GuzzleHttp để gửi request</span> <span class="token variable">$request</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Request</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'POST'</span><span class="token punctuation">,</span> <span class="token variable">$notifiable</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getWebhookUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$headers</span><span class="token punctuation">,</span> <span class="token function">json_encode</span><span class="token punctuation">(</span><span class="token variable">$body</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">client</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">send</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// kiểm tra nếu không nhận được status code = 200 thì sẽ báo lỗi</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$response</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token number">200</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">WebHookFailedException</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Webhook received a non 200 response'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// Lưu lại log</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">logger</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">debug</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Webhook successfully posted to '</span><span class="token punctuation">.</span> <span class="token variable">$notifiable</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getWebhookUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClientException</span> <span class="token variable">$exception</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getResponse</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getStatusCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!==</span> <span class="token number">410</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">WebHookFailedException</span><span class="token punctuation">(</span><span class="token variable">$exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$exception</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">GuzzleException</span> <span class="token variable">$exception</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">WebHookFailedException</span><span class="token punctuation">(</span><span class="token variable">$exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getMessage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$exception</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getCode</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token variable">$exception</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">logger</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">error</span><span class="token punctuation">(</span><span class="token single-quoted-string string">'Webhook failed in posting to '</span><span class="token punctuation">.</span> <span class="token variable">$notifiable</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">getWebhookUrl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Vậy là xong 1 notification channels. Tiếp theo mình chỉ việc gọi Webhook notification và dùng thôi.
Thực hiện notification webhook
Tiếp theo chúng ta tạo notification bằng lệnh
1 2 | php artisan make:notification SomethingHappenedNotification |
Tiến hành viết code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <span class="token php language-php"><span class="token delimiter important"><?php</span> <span class="token keyword">namespace</span> <span class="token package">AppNotifications</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">AppChannelsWebhookChannel</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateBusQueueable</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateNotificationsNotification</span><span class="token punctuation">;</span> <span class="token keyword">use</span> <span class="token package">IlluminateContractsQueueShouldQueue</span><span class="token punctuation">;</span> <span class="token keyword">class</span> <span class="token class-name">SomethingHappenedNotification</span> <span class="token keyword">extends</span> <span class="token class-name">Notification</span> <span class="token keyword">implements</span> <span class="token class-name">ShouldQueue</span> <span class="token punctuation">{</span> <span class="token keyword">use</span> <span class="token package">Queueable</span><span class="token punctuation">;</span> <span class="token comment">/** * @var string */</span> <span class="token keyword">private</span> <span class="token variable">$message</span><span class="token punctuation">;</span> <span class="token comment">/** * Create a new notification instance. * * @param string $message */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">__construct</span><span class="token punctuation">(</span><span class="token variable">$message</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">//</span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">message</span> <span class="token operator">=</span> <span class="token variable">$message</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Get the notification's delivery channels. * * @param mixed $notifiable * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">via</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span>WebhookChannel<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token keyword">class</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toWebhook</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'message'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token variable">$this</span><span class="token operator">-</span><span class="token operator">></span><span class="token property">message</span><span class="token punctuation">,</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * Get the array representation of the notification. * * @param mixed $notifiable * @return array */</span> <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function">toArray</span><span class="token punctuation">(</span><span class="token variable">$notifiable</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </span> |
ok. vậy là đã xong . giờ chúng ta có thể tạo các sự kiện và send notification đến endpoint mà người dùng đã đăng ký.
1 2 3 4 | <span class="token keyword">use</span> <span class="token package">AppNotificationsSomethingHappenedNotification</span><span class="token punctuation">;</span> <span class="token variable">$user</span><span class="token operator">-</span><span class="token operator">></span><span class="token function">notify</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">SomethingHappenedNotification</span><span class="token punctuation">(</span><span class="token variable">$massage</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> |
Kết luận
Cảm ơn các bạn đã đọc đến đây.
Tham khảo : https://laravel.com/docs/5.6/notifications#custom-channels,
Source code: https://github.com/phamtuananh1996/laravel-webhook-demo