つかうと、検索結果を取得することができる。);exit();}というような関数を呼び出してあげれば、検索結果をJSONで返すWebAPI的なものを作ることができる。ところがこれがちょっと変で。JavaScriptからみた戻り値はこんなふうに見える。{console.log(models[i].id)}}のほうが自然ですよね。前置きが長くなったけれど、そういうわけで型名を付けないで検索結果を返すようにする実装。本当はjson_encodeするときに型名を落とすのが適切だと思うのだけれど、うまいやり方を思いつかなかったので、modelのカスタムfindとして定義してみた。連想配列のまま構造を変えるのではなくて、一旦フラットにしてテキストとしてモデル名を除去しています。allの代わりにnoModelNameを使えば、モデル名部分のないハッシュを得ることができます。もぎゃろぐで書いたとおり、FacebookSDKをつかうと簡単にfacebookログインを実装することができます。CSRF対策のstate変数を保存しています。このままだと動かないことが予想されます。CakePHPは、そういうときのためにセッションをデータベースに保存したりすることができるようになっていますので、FacebookSDKの変数も、CakePHPのセッションを使ってもらうようにしたいところです。facebookのエンジニアの人たちは優秀なので、こういう用途も想定してSDKを書かれたようです。facebookSDKのFacebookクラスは、ほとんどの実装がbase_facebook.phpのBaseFacebookクラスで実装されて、上記セッション変数の処理だけが、facebook.phpのFacebookクラスで実装されています。facebook.phpをコピーしたcakeFacebook.phpを作って、$_SESSIONの部分をcakePHPのCakeSessionに書き換えたCakeFacebookクラスを用意すれば、FacebookSDKもcakePHPの設定に従ってくれるようになります。いうことで出来上がったのがこちらになります。Configure::read(‘facebook.secret’),));という具合にして使います。あとは通常のFacebookクラスと同じ使い方でOKです。PHPコメントするcakePHPでFacebookログイン前の記事で予想がついている方もおられるかと思いますが、facebookログインするサイトを作っています。RubyじゃなくてPHPで。人生何が起こるかわからないものですね。生のPHPは書いてられないので、CakePHPを使っています。いうことで、今日の記事は、CakePHP+FacebookSDKです。ぐぐれば似たような記事はいくつか出てくるのですが、いずれも記述が古くて動かなかったので、僕バージョンをまとめました。これも半年位すると動かなくなるのかもしれないですが。PHPでFacebookのOAuth2.0ログインを実装するやり方については、公式サイトに記述があります。DevelopersただこれだとAPI呼び出しが面倒なので、Facebook公式のfacebook-php-sdkをつかいます。facebook-php-sdkの利用サンプルも、ぐぐればたくさん出てきますが、その大半は古い内容で現在のSDKでは動きません(getAccessToken()をわざわざ呼び出しているのは古いコードです。Developersを参考に書き直したのがこちら。要するに、$facebook->getUser()して取れたらログイン成功、取れなかったらログインURLにリダイレクトすればOKです。昔のSDKで必要だったgetAccessTokenの呼び出しは、SDKが内部で処理してくれるようになりました。コールバック引数を見てアレコレする部分もSDKが面倒を見てくれるので、login.phpとcallback.phpのように二つのファイルを作る必要すらありません。PHP用のSDKらしい実装ですね。これを踏まえて、CakePHPでFacebookContollerを書いたのがこちら。SDKは、/app/Vendor/facebook/の下に配置。appidとsecretは、bootstrap.phpにConfigure::write('facebook',array('appid'=>'***','secret'=>'***'));という具合に。一応loginとcallbackを分けておきましたが、getUser()部分をbeforeFilterに移動させれば、ひとつのメソッドにまとめてしまうことも可能だと思います。いえば、FacebookControllerというクラスを用意しなくても、ほかのControllerのbeforeFilterに書いてしまってもかまわないかも知れないですね。※今日のお話は、最初から最後まで、知っている人にとっては当たり前すぎて困るレベルのお話です。phpでは、error_logという関数でログを出すことが出来て、一般にこれはApacheのエラーログに出力されるので、これを使うとなんだか動かないスクリプトの動きを追うことが出来ます。ところが、一部のレンタルサーバで、PHPは使えるんだけどログを見せていただけない環境が存在します。全部見せてくれない環境はさすがに少ないですけど、例えばサブドメインを使っていると駄目とか、共用SSLを使っていると駄目とか。いう場合に、しょうがないので自前ログを用意する手順。1.絶対パスを確認ログを書き出す場所を決めるために、まずはディレクトリ構成を知る必要があります。log.phpとか適当な名前のファイルに、こういうスクリプトを書いて走らせてみればだいたい分かります。"cwd:".getcwd();?>「/home/mogya/public_html/」的なものが得られるはず。あたりにログを出力するようにすれば良さそうですね。);fclose($fp);}?>ログを出力したいファイルの頭あたりにこんなのを書いておいて、error_log()の代わりにdbg_log()を書けば、変数の中身なり何なりを出力して動きを追うことが出来る。書き込めないことがあり得るので、その場合はFTPで適当なファイルをあげておいて、アクセス権を777にしてしまえば書き込めるようになる。PHPでファイルに文字を書くだけなんだから当たり前の話なんだけど、毎回思い出すのが面倒なので書いてみた。セキュリティとか深刻に考えたスクリプトじゃないので、終わったら消すことが前提です。PHPコメントするPHPでメール送信(webteko第四回)ウェブテコ第4回で、PHPで作るメールフォームという話をさせていただきました。プレゼンとソースを公開します。webteko)ソース:sendmail.lzhあと、メールアドレスのミスを指摘してくれる入力フォームもよかったらご覧くださいませ。10:03:23ソースがダウンロードできなかったので、圧縮した物を上げ直しました。lzhで圧縮してあるので、解凍してご覧くださいませ。ウェブテコ第4回終了が公開されていますね。記事あげた方は、トラックバックするといいんじゃないかと思います。PHP8件のコメントphpでapacheのログにログを出す方法error_logでエラーログに出せばよい。