Skip to main content

Mattermost Webhooks and PHP

This blog post might be outdated!
This blog post was published more than one year ago and might be outdated!
· 2 min read
Stephan Hochdörfer

In a recent attempt to automate a few things even more, I was looking for a way to post messages to our Mattermost instance via the Incoming Webhook feature of Mattermost. I did a quick search on Packagist for Mattermost client libraries and as it turns out there a quite a few. I picked the thibaud-dauce/mattermost-php package simply because it was the first match ;)

Installing the library via Composer is a no-brainer:

composer.phar require thibaud-dauce/mattermost-php

The library uses Guzzle under the hood to communicate with the Mattermost Incoming Webhooks. Luckily, a current version of Guzzle is used which is PSR-7 compliant. This allowed me to use Guzzle to consume a JSON file from an HTTP server like this:

$client = new \GuzzleHttp\Client;
$response = $client->request('GET', 'http://somehost.loc/data.json');
$data = json_decode($response->getBody()->getContents());

To instantiate the Mattermost object which handles the communication part against the Mattermost API, all I needed to do was to create a new Mattermost instance and pass the Guzzle client as a constructor dependency:

$mattermost = new \ThibaudDauce\Mattermost\Mattermost($client);

The Mattermost client just offers one public method called send() to send the given message to the Mattermost server. That means we need to create a Message object first:

$message = new \ThibaudDauce\Mattermost\Message();
$message->text('Hello world!');

The library also supports message attachments which need to be configured via a callable:

$message = new Message();
$message->text('Hello world!');
$message->attachment(
function(\ThibaudDauce\Mattermost\Attachment $attachment) {
$attachment->fallback('This is some fallback text')
->pretext('This message will appear above the attachment')
->imageUrl('http://somehost.loc/image.png');
}
);

Last, not least pass the $message as well as the url of the incoming webhook to the Mattermost::send() method:

$mattermost->send(
$message,
'http://mattermost.loc/hooks/gya1uqt2eept7jawzxx1ml8yey'
);

This will send the message to the channel which the incoming webhook is registered for.