PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(3.”Twilioコールフローフレームワーク”編)

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム
 1.アプリ紹介編
 2.環境設定
  1.ライブラリインストール編
  2.Apache mod_rewrite設定編
  3.CSSとJavaScript編

の続きです。

前回までで設置と設定が終わったはず。
今回は、Runa-CCAの「Webクライアント」機能と「コールフロー」機能のうちの、「コールフロー」機能の作りについて書きます。

Twilioのコールフロー機能を考えるにあたって、フレームワーク化したいなあと思いました。

お客様がコールセンターの電話番号に電話すると、Twilioの050の電話番号に登録されている「音声通話」のURLに対して、Twilioがリクエストを投げます。そのリクエストを受けて、コールフローが起動します。
Twilioの設定で、ある050番号の音声通話のURLに、例えば「http://Runa-CCAのドメイン名/runa-cca/twilio/callflow/newservice/main」を登録しておきます。そうすると、お客様がその050番号に電話してきたら、Twilioによって音声通話のURLがリクエストされるわけです。「Apache mod_rewrite設定編」で設定した通り、/runa-ccaに来たURLは、Apacheの機能で/runa-cca/index.phpにリライトされ、処理されることになります。

ここからが”Twilioコールフローフレームワーク”になります。
以下のような構成にしました。

  • 前提
    1. コールセンターには、コールフローがいくつもある。
    2. コールセンターにおいて、コールフローはビジネスロジックである。
    3.  コールセンターによってはコールフローはたくさんあります。数十とかあります。そしてコールフローは、コールセンター独自の仕組みであり、電話インタフェースと統計データベースとのやり取りを制御するものでもありますので、ビジネスロジックであろうと思います。ま、ビジネスロジックの定義は色々のようですが。

  • “Twilioコールフローフレームワーク”
    1. index.phpは、Slimのオブジェクトを作って、ルータ(\Runa_CCA\Route.php)に登録して、Slimを実行させる。(それだけしかしない)
    2. Route.phpは、URLに応じ、適切なController(コントローラ)にルーティングする。(それだけしかしない)前提1の通り、コールセンターにはコールフローがいくつもある。そのため、Controllerフォルダ配下にコールフロー毎にフォルダを作って、コールフロー毎のコントローラを一括管理する。言うまでもなくnamespaceも別にする。コールフローの場合、Route.phpは\Runa_CCA\Controller\CallFlow配下の適切なコールフローを呼び出す。
    3. コールフロー毎のコントローラが行うのは、Model配下のコールフロービジネスロジックの呼び出しと、Twilio用のTwiML作成Viewクラスの呼び出しだけ。(それだけしかしない)
    4. 前提2の通り、コールフローはビジネスロジック。そのため、コールフロー本体はModel(モデル)として整理。前提1の通り、コールフローはたくさんあるので、Model配下にコールフロー毎のフォルダを作って、そこに一括管理し、コールフローのIVR処理や統計データベースへのデータ保存といった処理を実行する。(ここでがっつりと処理を実施する)
    5. Modelのコールフローが処理を終えたら、Controllerに一度戻し、ControllerからViewが呼ばれて、TwiMLが作成され、TwilioにResponseとして返される。(それだけしかしない)

まあ大した話ではないのですが、そんな構造にしてみたわけです。
フォルダ構造は以下の通りになります。

/var/www/html/runa-cca/
 |-htdocs ... 公開用ディレクトリ
 |   |-index.php ... すべての入り口
 |
 |-lib ... 作成したクラスライブラリ
 |   |-Base ... 設定クラス置き場
 |   |-Runa_CCA ... Runa-CCAクラス置き場
 |       |-Route.php ... いわゆるルータ
 |       |
 |       |-Controller ... コントローラクラス置き場
 |       |   |-CallFlow ... コールフロー毎のコントローラクラス置き場
 |       |       |-NewService ... コールフロー「NewService」のコントローラクラス置き場
 |       |
 |       |-Model ... モデルクラス置き場
 |       |   |-CallFlow ... コールフロー毎のモデルクラス置き場
 |       |       |-NewService ... コールフロー「NewService」のモデルクラス置き場
 |       |
 |       |-Model ... ビュークラス置き場
 |
 |-templates ... テンプレートファイル

次回からはソースを追いかけながらコールフローの流れを書きます。

NetBeans 8.0のbackground scanning of projectsが終わらない問題

NetBeans 8.0を使っていますが、background scanning of projectsが終わらない問題が発生しました。
PCリソースを食う食う。バッテリーがどんどん無くなっていきました。

強制終了して、再起動しても、スキャンが再開してしまい、終わりませんでした。
NetBeansの削除、再インストールで、スキャンが終了しました。

うーん。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(2.環境設定:3.CSSとJavascript編)

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム
 1.アプリ紹介編
 2.環境設定
  1.ライブラリインストール編
  2.Apache mod_rewrite設定編

の続きです。

WebアプリケーションにはCSSフレームワークのBootstrapを使っています。bootstrapサイトからダウンロードし、

/var/www/html/runa-cca/
 |-htdocs ... 公開用ディレクトリ
 |   |-vendor
 |       |-bootstrap ... ここ!

に展開します。Bootstrap単体ではなく、テーマであるBootswatchを使っています。Bootswatchサイトからbootstrap.min.cssと、bootstrap.cssとをダウンロードし、/htdocs/vendor/bootstrap配下のファイルを置き換えます。

ほかに、

・JQuery
・Twilio.js(Twilioクライアントライブラリ)

を使っていますが、ソース指定で利用するため、インストールは不要です。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(2.環境設定:2.Apache mod_rewrite設定編)

WebサーバにApacheを使っている場合の設定は、SlimのGitHubに極めてシンプルにまとめられています。

https://github.com/codeguy/Slim

以下のように.htaccessに書いてね、とのことです。さっぱりとした説明ですな。

[shell]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]
[/shell]

Slimのパッケージにもサンプルが付いてきます。
RewriteEngine Onとありますので、mod_rewriteを使うということがわかります。
むろん、.htaccessを使うので、ApacheにAllowOverrideの設定が必要になります。

まず、Apacheのconfファイルの設定は、エイリアスを切る場合だと、

[shell]
Alias /runa-cca/ "/var/www/html/runa-cca/"
<Directory "/var/www/html/runa-cca/">
AllowOverride All
</Location>
[/shell]

のようになります。

.htaccessをどう書くかなのですが、以下のようにしました。

[shell]
RewriteEngine On
RewriteBase /runa-cca
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
[/shell]

「RewriteEngine On」は、Apacheでmod_rewriteを使うために必要です。
「RewriteBase /runa-cca」は、エイリアスを切っているので必要になります。URL書き換えのベースとなります。

実験してみたのですが、RewriteBaseが無いと、

[shell]
Request exceeded the limit of 10 internal redirects due to probable configuration error.
[/shell]

というエラーがapache_error.logに出力されます。

[shell]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/runa-cca index.php [QSA,L]
[/shell]

と書くと、エラーは止まります。しかし、Runa-CCAのインデックスページ(/runa-cca/)からログインしたとき(/runa-cca/login)にファイルが見つからないと怒られます。
ということで、RewiteBaseは設定が必要。

「RewriteCond」と「RewriteRule」ですが、入り口としては「Apache mod_rewrite Introduction」のページが参考になります。わかりやすく説明されていました。私が使ったのはApache 2.2系列ですが、ドキュメントは新しい方がいいかなあと思って、2.4系列のURLをご紹介しております。

「RewriteCond」は「Apache Module mod_rewrite」を参照。細かく書いてあります。

「RewriteCond %{REQUEST_FILENAME} !-f」は、指定されたファイルが存在しない場合
「RewriteCond %{REQUEST_FILENAME} !-d」は、指定されたフォルダが存在しない場合

です。
Slimのサンプルに「!-d」が無い理由はわかりませんでした。私は付けておくことにしました。

「RewriteRule」は「RewriteRule Flags」を参照。これまた細かく書いてあります。
「RewriteRule ^ index.php [QSA,L]」は、すべてをindex.phpにまわせ、クエリーストリング(/pages/123?one=twoのone=two)は付けたままにしろ(QSA|qsappend)、書き換えルールはここでストーップ(L|last)という意味です。「^」の解釈に悩みましたが、「.*」にしても同じ動作でした。すべて、ということでしょう。

調べるの大変でした・・・。

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(2.環境設定:1.ライブラリインストール編)

こちらのページでも紹介していますが、Twilioを使ったアプリケーション(Webクライアント+コールフロー)を作成しました。

以下の本を読みまして、PHPマイクロフレームワークSlim、テンプレートエンジンTwig、ORマッパーilluminate/Eloquentを使って開発しています。入力値検証用にRespect/Validationも試用しています。

[amazonjs asin=”4774163678″ locale=”JP” title=”Webアプリエンジニア養成読本しくみ、開発、環境構築・運用…全体像を最新知識で最初から! (Software Design plus)”]

あとはフロントエンドにJQueryとBootstrap/Bootswatchを使っています。もちろん、Twilio-phpも使っています。

フォルダ構造は以下の通りとしました。詳細は別途。ルートは/var/www/html/runa-cca/というフォルダとします。

/var/www/html/runa-cca/
 |-composer.json ... Composer定義ファイル
 |-composer.lock ... Composerバージョンロックファイル
 |-create_table_for_Runa-CCA.sql ...テーブル定義・初期データ投入SQLファイル
 |
 |-htdocs ... 公開用ディレクトリ
 |   |-vendor ... 外部のライブラリ
 |       |-bootstrap ... bootstrap
 |
 |-lib ... 作成したクラスライブラリ
 |   |-Base ... 設定クラス置き場
 |   | 
 |   |-Controller ... コントローラクラス置き場
 |   |   |-CallFlow ... コールフロー毎のコントローラクラス置き場
 |   |
 |   |-Model ... モデルクラス置き場
 |   |   |-CallFlow ... コールフロー毎のモデルクラス置き場
 |   |
 |   |-Model ... ビュークラス置き場
 |
 |-templates ... 作成したテンプレートファイル
 |
 |-vendor ... ライブラリ(Composerでインストール)

まずは環境設定です。

そもそもの環境ですが、Macbook Pro Retina ME865J/AでMAMPを動かしています。バージョンは3.0.3を使いました。なので、Apacheは2.2.26、PHPは5.5.10、MySQLは5.5.34になります。

その上で、PHPのパッケージマネージャであるComposerを使って、必要なライブラリをインストールします。
Composerの定義ファイルcomposer.jsonは以下の通り。

[java]
{
"require": {

"slim/slim" : "2.*",
"slim/views" : "0.1.*",
"slim/extras" : "2.0.*",
"twig/twig" : "1.*",
"illuminate/database" : "4.0.*",
"Respect/Validation" : "0.5.*",
"twilio/sdk": "dev-master"

},
"autoload": {
"psr-0": {"": "lib/"}
}
}
[/java]

参照書籍の記載の通り、以下のようにしてComposerをダウンロードします。

[shell]
$ cd /var/www/html/runa-cca/
$ php -r "eval(‘?>’.file_get_contents(‘https://getcomposer.org/installer’));"
#!/usr/bin/env php
All settings correct for using Composer
Downloading…

Composer successfully installed to: /var/www/html/runa-cca/composer.phar
Use it: php composer.phar
[/shell]

composer.jsonをアップロードしておきます。Runa-CCAをディレクトリごとアップしておけばよいかと。
で、以下のコマンドを実行します。
composer.lockがある場合は、引数をinstallにすると、lockの内容を再現するようにインストールされます。

[shell]
$ php composer.phar update
Loading composer repositories with package information
Updating dependencies (including require-dev)
– Installing respect/validation (0.5.0)
Downloading: 100%

– Installing slim/slim (2.4.3)
Downloading: 100%

– Installing slim/views (0.1.2)
Downloading: 100%

– Installing slim/extras (2.0.3)
Downloading: 100%

– Installing twig/twig (v1.15.1)
Downloading: 100%

– Installing nesbot/carbon (1.8.0)
Downloading: 100%

– Installing illuminate/support (v4.0.10)
Downloading: 100%

– Installing illuminate/container (v4.0.10)
Downloading: 100%

– Installing illuminate/events (v4.0.10)
Downloading: 100%

– Installing illuminate/database (v4.0.10)
Downloading: 100%

slim/slim suggests installing ext-mcrypt (Required for HTTP cookie encryption)
slim/views suggests installing smarty/smarty (Smarty templating system)
Writing lock file
Generating autoload files

#twilio/sdkは省略
[/shell]

これで、ライブラリがvendor配下にダウンロードされます。
続きはまた別途。

https://github.com/rutoru/Runa-CCA

PHPマイクロフレームワークSlimで作るTwilioコールセンターシステム(1.アプリ紹介編)

PHPマイクロフレームワークSlimを使って、Twilioコールセンターシステムを作成しました。
まだいろいろとわからないところ、足りないところも多く、作成中の段階です。

技術的な内容は別途として、まずはアプリの説明からなのですが、こちらのページに書いてみました。よろしければご覧ください。

https://github.com/rutoru/Runa-CCA

PHPテンプレートエンジンTwigでセッション情報を取得する(PHPフレームワークSlimを使って)

Webアプリを作っていまして、フレームワークはSlimを使い、テンプレートエンジンはTwigを使っていました。

はじめのうちは、セッションに入れた情報をそのまま使わずに、PHPから変数でTwigに渡していました。しかし、いちいち変数を渡すのはめんどくさい。ViewたるTwigから、セッション情報を直接参照しても、何も問題はないでしょう。Twigでセッションを参照できる方法ないかなあと調べていたところ、ありました。

Using Twig functions inside of Slim

上記サイトに紹介されているとおりに書けば良さそうなのですが、少しハマりました。
セッションに情報を埋め込んだ後に書く必要があります。
つまり、

[php]
$app = \Slim\Slim::getInstance();

$twig = $app->view()->getEnvironment();
$twig->addGlobal("session", $_SESSION);

$_SESSION[‘hoge’] = "hohoho";

[/php]

ではなく、

[php]
$app = \Slim\Slim::getInstance();

$_SESSION[‘hoge’] = "hohoho";

$twig = $app->view()->getEnvironment();
$twig->addGlobal("session", $_SESSION);
[/php]

と書かなければなりません。

これで、Twigでは、

[php]
{{session.hogehoge}}
[/php]

という形で参照できます。

MySQL #1452 – Cannot add or update a child row: a foreign key constraint fails

MySQLで外部キーを設定しようとして、

[sql]
ALTER TABLE `child` add FOREIGN key(`id`) REFERENCES parent(`id`);
[/sql]

とした場合、「#1452 – Cannot add or update a child row: a foreign key constraint fails」エラーが返ってくることがあります。

childテーブルのidに、parentテーブルのidに存在しない値が入っているとこのエラーになります。childテーブルのidの値を修正すればOKです。

こちらのサイトを参照しました。

PHPマイクロフレームワークSlim利用時の設定とフォームのaction指定

『Webアプリエンジニア養成読本』を読みながら、PHPマイクロフレームワークであるSlimを使ってプログラミングしています。

[amazonjs asin=”4774163678″ locale=”JP” title=”Webアプリエンジニア養成読本しくみ、開発、環境構築・運用…全体像を最新知識で最初から! (Software Design plus)”]

Slimはルーティング中心のシンプルなフレームワークです。RubyのSinatraを参考に作られたらしい。Sinatraもそうですが、読んだり調べたりするだけだと、何が何やらさっぱりわからない・・・。書いてみて、あーそういうことかーとわかります。テンプレートエンジンTwig、データベース操作illuminate/Eloquentとの組み合わせで、MVCを実現できます。

SlimをApacheで利用する場合、mod_rewriteの設定が必要です。『Webアプリエンジニア養成読本』にはこの部分がすっぽりと抜けているので、わかりにくいです。

例えば、Apache本体で、

[shell]
Alias /hoge/ "/var/www/http/hoge/htdocs/"
<Directory "/var/www/http/hoge/htdocs/">
AllowOverride All
Options All
Order allow,deny
Allow from all
</Directory>
[/shell]

となっている場合、.htaccessは、

[shell]
RewriteEngine On
RewriteBase /hoge
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
[/shell]

とし、/var/www/http/hoge/htdocs/配下(index.phpと同じ場所)に置きます。
.htaccessのテンプレートは、Slimパッケージの中にあります。

index.phpは、

[php]
<?php
$app = new \Slim\Slim();
$app->get(‘/’, function () use ($app) {
$app->render(“welcome.php”);
});

$app->post(‘/post/login’, function () use ($app) {
$app->render(“login.php”);
});
$app->run();
[/php]

として、welcome.phpに、

[html]
<form action="post/login/" method="post">
[/html]

とフォームを書いておけば、login.phpが呼び出されるかと思ったのですが、呼び出せませんでした。「404 Page Not Found」のエラーになってしまいました。

しばらくハマったのですが、そりゃそうです。formのaction指定に誤りがありました。

[html]
<form action="post/login" method="post">
[/html]

というように、loginの後のスラッシュを消しておかなければなりません。そうしないとどこにもマッチせず、Not Foundになります。むろん、index.php側を「$app->post(‘/post/login/’, function ($app) {」と修正しても構いません。HTMLのフォームの記述と、Slimの記述と、両者を一致させる必要があります。

mod_rewriteは間違いも多いところなので、httpd.confとかに、

[shell]
RewriteLog "/tmp/rewrite.log"
RewriteLogLevel 9
[/shell]

としておいて、設定・試験中はログを見ながら作業するといいと思います。ログが膨大に出ちゃいますが、試験環境ならいいかと。

MAMPでXdebugを有効化

Macbook Proに、MAMPを利用して、PHPの開発環境を作っています。

NetBeansでデバッグのためにステップ実行をしようと考えました。その場合Xdebugを有効化する必要があります。
php.iniに以下を記載し、Apacheを再起動。phpinfoを開きましたが、xdebugセクションが表示されません(有効になっていない)。

[shell]
zend_extension="/Applications/MAMP/bin/php/php5.5.10/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so"
xdebug.remote_enable = 1
[/shell]

xdebug.soは存在するし。設定の構文も間違っていません。
うーん。

改めてphpinfoを見直してみて、やっとわかりました。修正するべきphp.iniファイルを誤っていたのです。MAMPにおいて、php.iniはなぜか2カ所にあります。

/Applications/MAMP/bin/php/php5.5.10/conf/php.ini
/Applications/MAMP/conf/php5.5.10/php.ini

修正するべきは、

/Applications/MAMP/bin/php/php5.5.10/conf/php.ini

の方でした。

うーん、ハマったなあ。