PHPからSlackにメッセージを投稿するクラスを作ってみた

# はじめに
[YYPHP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yyphp) 7日目担当の@nobuhiro-kobayashiです!!
ここ1年くらいでやたらとSlackを使う機会が増えたのですが、プログラムから利用したことがなかったので、メッセージを投稿するPHPクラスを作ってみます。
いろんな人が実装してますが、練習も兼ねてやってみます。


# Slackの設定
## ワークスペースにログイン
ワークスペースに[ログイン](https://slack.com/signin?redir=/apps)する。
※作成から行いたい方は[こちら](https://slack.com/create#email)からどうぞ。
![スクリーンショット 2018-12-03 20.35.21.png](https://qiita-image-store.s3.amazonaws.com/0/203751/0d466812-5b2b-f414-4ee9-dcb168344e93.png)

ログインしたら[Slack Appディレクトリ](https://slack.com/apps)にアクセスします。
右上にワークスペース名が出ていることを確認してください。
<img width="1266" alt="スクリーンショット 2018-12-03 23.26.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/5523c76e-1ffd-543a-6a65-0f730a10210e.png">

## Incoming WebHookを追加する
これで外部のサービスからslackにメッセージを送れるようになります。
検索窓に「Incoming WebHook」と入力して検索して、サジェストされたらクリックして下さい。
<img width="1264" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/a81d363b-1e65-be17-40d1-a2b73437eea8.png">

## 投稿先のチャンネルを指定する
<img width="1269" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/207fdc86-e492-0edc-09f9-4dbbea35920b.png">

セレクトボックスに先ほど設定したワークスペースに登録済のチャンネルが表示されますので、お好きなものを選んで下さい。
選択後、すぐ下の「Incoming Webhook インテグレーションの追加」をクリックします。
<img width="1256" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/a467e7ef-7938-0ad9-6f46-9406c7ef542a.png">

## Webhook URLを取得
下の方にスクロールしていくと「インテグレーションの設定」という見出しがあります。
Slackに投稿する際に必要なWebhook URLが記載されていますので保存しておいてください。

<img width="1261" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/ac51d779-3e74-4e84-5c80-d2d7eb0c134b.png">

設定ができたら指定チャンネルにメッセージが表示されます。
<img width="844" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/95a66687-7b34-5597-ebd5-00b3b05b1465.png">


以上でslack側の設定は完了です!!

# PHP

今回はユーザー名、アイコン、メッセージの3つを投稿してみます。
いろいろ設定ができるようなのでまた今度追加してみよう。

[Incoming WebHooks リファレンス](https://api.slack.com/incoming-webhooks)

```php
<?php
// メッセージ送信用
class SlackSender
{
    /**
     * @var string
     */
    private $webHookUrl;
    /**
     * @var []
     */
    private $data;

    public function __construct(string $webHookUrl)
    {
        $this->webHookUrl = $webHookUrl;
    }
    public function userName(string $userName)
    {
        $this->data['username'] = $userName;

        return $this;
    }
    public function text(string $text)
    {
        $this->data['text'] = $text;

        return $this;
    }
    public function iconEmoji(string $emoji)
    {
        $this->data['icon_emoji'] = $emoji;

        return $this;
    }
    public function post()
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->webHookUrl);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, 'payload=' . urlencode(json_encode($this->data)));
        curl_exec($ch);
        curl_close($ch);
    }
}

// 呼び出し
$url = "https://hooks.slack.com/services/XXXX/"; // 各自設定してください
$slackClient = new SlackSender($url);
$slackClient->userName('ビードル')
            ->iconEmoji(':bug:')
            ->text('PHPから投稿したよ')
            ->post();
```
## 実行結果
<img width="858" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/203751/b41478cf-d168-300c-1af6-9ee2117f06a2.png">

# まとめ
今回は人生初のアドベントカレンダーに参加してみました。
簡単な内容でも意外と記事にするとなると大変でした。。
日々記事を執筆されている皆様本当にありがとうございます。

明日8日目の [YYPHP Advent Calendar 2018](https://qiita.com/advent-calendar/2018/yyphp) は@clown0082さんの投稿です!!