https://d226lax1qjow5r.cloudfront.net/blog/blogposts/send-greek-unicode-viber-messages-with-symfony/greek-unicode-viber-messages-symfony.png

Symfony でギリシャ語の Unicode Viber メッセージを送信する

最終更新日 January 15, 2024

所要時間:6 分

私は、Developer Advocacyの中で見つけることのできるランダムな性質が大好きだ。この特別な発見は、今年ベルリンで開催されたWe Are Developers Conferenceでの会話から生まれた。ギリシャ政府の公式メッセージは Viberを使用していることがわかった。 を使用していることがわかった。私はハッとしました:Vonageは メッセージ APIそこで、PHPを使ってViberデバイスにUnicodeメッセージを送信する例を示してはどうだろう?そして、読者の皆さん、これこそまさに私たちがゼロからやろうとしていることなのです。

私たちは symfony フレームワークを使いますが、symfonyドキュメントで説明されているインストールプロセスに従う代わりに、少し異なるアプローチをとりました。 Neal Brooksこのリポジトリを作ってくれました!

はじめに

さっそく本題に入り、まずはアプリを起動してみよう。ここでは Dockerを使います、 まずDockerをお使いのプラットフォームにインストールする必要があります。そして gitバージョン管理.もう1つ必要なステップ(これはLinuxやMac環境よりもWindowsユーザーに関連するだろう)は GNU Makeがインストールされていること.

コマンドラインから以下のリポジトリをクローンする:

git clone https://github.com/nealio82/symfony-starter-kit

では、アプリケーションを構築するために makeを使ってアプリケーションをビルドする:

make create-webapp

このコマンドは2つのことを行う:

  • にある symfony の最新バージョンのすべての依存関係をダウンロードしてインストールします。 appフォルダーにあります(これは現在のアプリケーションのソースコードです)

  • を使ってDocker環境を起動します。 docker compose upこれにより、PHP8.2、Postgres、Node、WebサーバーとしてNginxを実行するSymfony PHPコンテナが起動します。

なぜなら我々は ブラウザでアプリを開くのにもコマンドを使う:

make open-web

Splash screen of Symfony applicationWelcome to Symfony!

依存関係のインストールと設定

我々は立ち上がった!さあ、開発を始めよう。まず最初にすることは Vonage PHP SDKを追加することです。PHPコンテナ内でこれを行うにはmakefileを使います。

make composer require vonage/client-core

このアプリでやろうとしていることは、公開されたルート経由で着信Webhookをモックし、そのペイロード内のメッセージをViberを通じて番号に送信することだ。これを動作させるにはいくつかのステップが必要だ。 Vonageアカウント.

次に、メッセージ機能を持つVonageアプリケーションを作成する必要があります。これはVonage Dashboard .NETから行うことができます:

Screenshot of application creation in the Vonage DashboardCreating an Application in the Vonage Dashboard

この記事の目的では、ステータスコールバックやインバウンドメッセージを取得することに興味はありません。アプリを作成する際、ダミーのURLは必須フィールドなので、ウェブフック設定に入れることができます。

最も重要な部品は以下の通り:

  • アプリケーションID

  • private.keyボタンからダウンロードした Generate public and private keyボタンからダウンロードし、symfonyのルートフォルダ(すなわち app)

アプリケーションの生成'を押したら、symfony のコンフィグビルダーを使って設定を取得する機能が必要です。アプリケーションのグローバルな値を取得するもっともシンプルな方法なので、パラメータとして設定します。

新しいファイルを作成する、 vonage.yamlを作成し app/config/packages.このファイルの中にキーを置く:

parameters:  
  application_id: '99996908-65ec-XxXx-a640-f5f4a999a3b9'  
  private_key_path: '%kernel.project_dir%/private.key'

に指定したダミーの値を、ダッシュボード経由で生成したVonageアプリケーションの正しい値に置き換えてください。 application_idをダッシュボードから生成したVonageアプリケーションの正しい値に置き換えてください。これらのパラメータを定義すれば、symfonyのどこからでも ParameterBagを使うことで、symfony のどこからでもそれらの値にアクセスできるようになります(詳細は後述します)。

メッセージ・サンドボックスの使用

ダッシュボードを開いている間に、Viber Business Messages プラットフォームで使用するアカウントを設定します。独自の Viber Business Messages アカウントを設定する手順を踏む代わりに、ここでは メッセージサンドボックス.

サンドボックスをセットアップする前に Viber アプリをインストールする必要があります。アプリをダウンロードし、完全な手順に従ってください。

次のステップは、あなたのViberアカウントに関連付けられている番号をメッセージサンドボックスに許可リストすることです。これを行うには ダッシュボードのメッセージサンドボックス.Troubleshoot & Learn(トラブルシューティング&学習) > Developer Tools(開発者ツール) > Messages Sandbox(メッセージサンドボックス)のメニューから移動できます。Viberカードの'サンドボックスに追加'リンクをクリックし、そこに表示される指示に従って、サンドボックスのViberアカウントにあなたの番号を許可リストします。事前に用意されたSandboxアカウントを使用しているため、そのアカウントからのメッセージにはVonageブランドが表示されます。

ルーティング

Sandboxアカウントがセットアップされたので、次にメッセージをトリガーするルートをsymfonyで作成します。Dockerコンテナの中でこれを行います(これはすべてのソースコードが設置されている appディレクトリの1つ上の階層にいる必要があります):

./app/bin/console make:controller

ここで、コントローラに名前を付けるプロンプトが表示されます。ここでは MessengerController.コンソールが残りの部分を定型化してくれます:

namespace App\Controller;  
  
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;  
use Symfony\Component\HttpFoundation\Response;  
use Symfony\Component\Routing\Annotation\Route;  
  
class MessengerController extends AbstractController  
{  
    #[Route('/messenger', name: 'app_messenger')]  
    public function index(): Response  
    {  
        return $this->render('messenger/index.html.twig', [  
            'controller_name' => 'MessengerController',  
        ]);    
	}
}        

ブラウザから新しいルートにアクセスできるようになりました:

Screenshot of the default Symfony contoller template pageSymfony's default controller template

このルートは、Webアプリケーションのルートというよりも、REST APIのルートのような振る舞いをします。そのため POSTエンドポイントとして指定し、JSONを返すようにする必要があります。そのためにコードを更新しましょう:

#[Route('/messenger', name: 'app_messenger', methods: ['POST'], format: 'json')] 
public function index(): Response  
{ 
    return new JsonResponse(['message_success' => true]);  
}

ここで3つのことが変わった:

  • Routeアノテーションが変更され POSTリクエストのみを許可するようになりました。

  • Routeアノテーションはまた、このエンドポイントに送信できるのは application/jsonのみを指定するようになりました。

  • これで JsonResponseオブジェクトを返します。

のようなAPIテストツールでエンドポイントをヒットしてみることができます。 Postman.ここでは Insomnia:

Screenshot of Insomina sending a POST requestUsing Insomnia to test our Application

OK, リクエスト/レスポンスのライフサイクルができました。素晴らしい。残りのパズルを組み立てる時間だ。

JSONペイロードに messageをJSONペイロードに送信していることにお気づきだろうか!そこで、最初にこの文字列を取り出すコードを書きます。symfonyの依存性注入を使って、コントローラのメソッドに Requestオブジェクトをコントローラメソッドに追加します:

use Symfony\Component\HttpFoundation\Request;

#[Route('/messenger', name: 'app_messenger', methods: ['POST'], format: 'json')] 
public function index(Request $request): Response  
{ 
    return new JsonResponse(['message_success' => true]);  
}

ここで、リクエストのペイロードから、次の名前のキーを取り出すことができる。 message:

use Symfony\Component\HttpFoundation\Request;

#[Route('/messenger', name: 'app_messenger', methods: ['POST'], format: 'json')] 
public function index(Request $request): Response  
{ 
	$message = $request->getPayload()->get('message');
	
    return new JsonResponse(['message_success' => true]);  
}

Vonageの利用

これでメッセージとリクエスト/レスポンスが設定できました。いよいよVonage PHP SDKをコントローラに取り込みます。Vonage SDKのベースクライアントはsymfonyのconfigで設定したクレデンシャルで設定します。と呼ばれるオブジェクトを使います。 ParameterBagと呼ばれるオブジェクトを使います。このクラスにアクセスするには、コントローラのコンストラクタに注入します:

public function __construct(  
    protected ParameterBagInterface $parameterBag,  
) {}

を使用してアクセスできるようになりました。 $this->parameterBag.必要なものを取り出してみよう:

use Symfony\Component\HttpFoundation\Request;

#[Route('/messenger', name: 'app_messenger', methods: ['POST'], format: 'json')] 
public function index(Request $request): Response  
{ 
	$message = $request->getPayload()->get('message');

	$privateKey = file_get_contents($this->parameterBag->get('private_key_path'));
	$applicationId = $this->parameterBag->get('application_id');
	
    return new JsonResponse(['message_success' => true]);
}

Vonageクレデンシャルに必要な2つのパラメータが揃ったので、それらを引数として使って Vonage\Credentials\Keypairオブジェクトを作成するための引数として使用することができます。 Client:

use Symfony\Component\HttpFoundation\Request;

#[Route('/messenger', name: 'app_messenger', methods: ['POST'], format: 'json')] 
public function index(Request $request): Response  
{ 
	$message = $request->getPayload()->get('message');

	$privateKey = file_get_contents($this->parameterBag->get('private_key_path'));
	$applicationId = $this->parameterBag->get('application_id');
	
	$vonageCredentials = new Client\Credentials\Keypair($privateKey, $applicationId);  
  
	$client = new Client(  
		$vonageCredentials,  
		[
			'base_api_url' => 'https://messages-sandbox.nexmo.com'  
	    ]  
	);
	
    return new JsonResponse(['message_success' => true]);
}

ここで注目すべき重要なステップは Clientが追加オプションをとっていることだ、 base_api_url.これはSDKに組み込まれているBase URL設定を上書きし、Messages APIサンドボックスを使用できるようにするものです。

Viberメッセージを作成する時間です。Vonageダッシュボードに表示されている fromVonage Dashboardに表示されている番号を使用する必要があります。メッセージサンドボックスページを下にスクロールすると、この番号が表示されます:

Screenshot of the Messages Sandbox documentationYou can see the correct 'from' field here

オブジェクトを作成する際にこの番号を使用する。 ViberTextオブジェクトを作成するときにこの数値を使用します:

$messageText = 'Καλώς ήρθατε στο Vonage στα Ελληνικά!'
$vonageMessage = new ViberText('44999999999', '22353', $messageText);

最後にすることは、メッセージを送信することである。 message_successを正確かつ防御的にすることが望ましい。これが最終的な結果である:

namespace App\Controller;  
  
use Psr\Log\LoggerInterface;  
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;  
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;  
use Symfony\Component\HttpFoundation\JsonResponse;  
use Symfony\Component\HttpFoundation\Request;  
use Symfony\Component\HttpFoundation\Response;  
use Symfony\Component\Routing\Annotation\Route;  
use Vonage\Client;  
use Vonage\Messages\Channel\Viber\ViberText;  
  
class MessengerController extends AbstractController  
{  
    public function __construct(  
        protected ParameterBagInterface $parameterBag,  
        protected LoggerInterface $logger  
    ) {}  
  
    #[Route('/messenger', name: 'app_messenger', methods: ['POST'], format: 'json')]  
    public function index(Request $request): Response  
    {  
        $messageText = $request->getPayload()->get('message');  
        $responseData = ['message_success' => false];  
  
		$privateKey = file_get_contents($this->parameterBag->get('private_key_path'));
		$applicationId = $this->parameterBag->get('application_id');
	
		$vonageCredentials = new Client\Credentials\Keypair($privateKey, $applicationId);  
  
		$client = new Client(  
			$vonageCredentials,  
			[
				'base_api_url' => 'https://messages-sandbox.nexmo.com'  
		    ]  
		);
        
        $vonageMessage = new ViberText('44999999999', '22353', $messageText);  
  
        try {  
            $client->messages()->send($vonageMessage);  
            $responseData['message_success'] = true;  
        } catch (\Exception $exception) {  
            $this->logger->error($exception->getMessage());  
        }
        
        return new JsonResponse($responseData);  
    }
}

最終的なコードには、いくつか注意すべき点がある。まず、ディフェンシブ・コードの要件は、トライ・キャッチ・ブロックを導入したことを意味する。しかし、トライ・キャッチ・ブロックが失敗した場合、結果をクライアントに知らせるために falseを送信してクライアントに結果が失敗したことを知らせる以外に何をすればいいのでしょうか?エラー・レスポンスをログに記録すればいい。これは、Symfonyの依存性注入を使用して、コンストラクタを介してコントローラクラスに Loggerをコンストラクタ経由でコントローラクラスに追加します。この場合、symfony はよく知られた Monologを設定することができます。 LoggerInterfaceここで

インソミーナでもう一度リクエストを出すと...。

Screenshot of a Viber app on a mobile device showing the Greek messageGreek Viber Messages!

マジックViberにギリシャ語のメッセージがあります!

結論

Vonage PHP SDK を使用することで、開発時間を超スピーディーにするように設計されており、Symfony Framework によって提供される迅速な開発時間と組み合わせることで、強力なツールセットを手にすることができます。もしあなたが何かを作っていて、助けや指導が必要であれば、私たちに知らせてください。 コミュニティの Slack に登録する.

その他のリソース

フェイルオーバーでPHPからSMSを送信する:カップケーキベーカリー

正しい型安全性 - PHPの配列ハッキング

スクラブアップPHPStanでPHPアプリケーションをクリーニング

Vonage PHP SDK

シェア:

https://a.storyblok.com/f/270183/400x385/12b3020c69/james-seconde.png
James SecondeシニアPHPデベロッパー

スタンダップ・コメディーの学位論文を持つ俳優の訓練を受け、ミートアップ・シーンを経てPHP開発に携わるようになった。技術について話したり書いたり、レコード・コレクションから変わったレコードを再生したり買ったりしています。