いよいよアプリの実装に移ります。まずは、ライブラリを設定します。リスト3が三つのライブラリの初期化処理です。これをpublic/index.phpとして保存します。

アプリのタブページを実装

 まず(1)でSilexおよびFacebook PHP SDKを読み込んでいます。(2)はPHP 5.3から採用された名前空間の読み込みです*6。後ほど、ApplicationやRequestという短いクラス名が登場しますが、それらの正式なクラス名は(2)に記述したものになります。(3)は、SilexのApplicationクラスの初期化です。(4)でデバッグモードを有効にしています。エラーを見つけやすくするためにデバッグモードを設定しました。

 (5)は、Silexの関連ライブラリの読み込みです。ここではセッションとtwigフォルダに格納したライブラリを読み込んでいます。(6)は、Facebook PHP SDKの初期化して、Applicationへ登録する処理です。(3)で作成したApplicationオブジェクトに配列形式で登録すると、様々な場所で呼び出せるようになります。

 (7)と(8)は、それぞれアプリの登録時に発行されたApp IDとApp Secretを指定します。どちらも引用符で囲い、文字列として指定してください。(9)はデータベースへの接続です。基本的にFacebookのAPI経由でデータを取得できますが、Web APIは不確実なのでデータベース上にもデータを格納するようにします。以上で、ライブラリの設定は終了です。ここで設定した部分は、後ほどページを実装していく際に活用しますので、内容がわからなくても問題はありません。

表1●photoテーブルのカラムと役割
表1●photoテーブルのカラムと役割

 次に、データベースを準備します。今回扱うデータは写真で、写真のデータはFacebookへアップロードするため、基本的にすべてAPIを経由して取得できます。しかし、APIにつながらない場合はアプリが全く動作しなくなってしまいます。そのようなエラーを回避するために、アップロードした画像のIDやURLなどの基本的な情報をデータベースへ格納します。リスト4は、写真の情報を格納するためのデータベース定義です。このSQLをMySQLへ発行してデータベースを作成してください。photoテーブルのカラムはそれぞれ表1のような役割を持っています。データベースの登録が終わったら、タブから呼び出されるページの作成に進みます。

タブから呼び出されるページを作成

 実際にアプリのタブをクリックされた際に呼び出されるページを作成していきます。まずは、Silexを使ってページを作成する練習も兼ねて、簡単な文字を表示してみましょう。

 リスト5をpublic/index.phpに追記してください。Silexでは、PHP 5.3から採用された無名関数を用いてページを定義します。通常であればページごとにPHPファイルを用意します。しかしSilexでは、http://nikkei-photo.localhostに続く部分と、matchメソッドの第1引数の値が一致している処理を呼び出すようになっています。そのため、ページの数だけPHPファイルを用意する必要はなく、index.phpに無名関数を追加するだけでページが追加できます。(1)では、第1引数に/page_tabを指定して、http://nikkei-photo.localhost/page_tabにアクセスがあった場合は、(2)によって無名関数の戻り値がそのまま出力されるようになっています。

図10●Hello, Facebookと表示される
図10●Hello, Facebookと表示される

 記述できたら、アプリを登録したFacebookページの写真展タブを開きます。正しく実装されていれば、図10のように「Hello, Facebook」と表示されると思います。

 これで、タブをクリックしてインラインフレームを使ってWebアプリケーションが動作しました。このプログラムをベースに機能を追加していきましょう。まずは、アップロードフォームを実装します。public/index.phpに追加したリスト5をリスト6のように置き換えます。

 文字列を返していた部分が違いますね。(1)で、リスト3で登録しておいたfacebookオブジェクトを受け取ります。(2)ではSignedRequestを取得しています。SignedRequestは、タブにアクセスした際、リクエストにFacebookから付与されるデータで、ページに関する情報などが配列形式で格納されています*7。(3)で、SignedRequestからFacebookページのIDを取得しています。

 (4)ではTwigライブラリを呼び出して、page_tab.htmlをレンダリングしています。第2引数の連想配列は、テンプレートに渡す変数を定義するもので、それぞれキーが変数名になります。