PHPFog + Symfony2 でステージング環境を作る方法:Symfony Advent Calender 2011 JP – 13日目 –
- 2011 12/13
こんにちは!「Symfony Advent Calendar JP 2011」 13日目です。
昨日の @77webさんからバトンタッチで、今日は「PHPFog + Symfony2 でステージング環境を作る方法」をご紹介します。
こんにちは!「Symfony Advent Calendar JP 2011」 13日目です。
昨日の @77webさんからバトンタッチで、今日は「PHPFog + Symfony2 でステージング環境を作る方法」をご紹介します。
PEAR の Services_Amazon クラスを利用するとエラーが発生しました。
■ エラー内容
Amazonの情報取得に失敗しました(HTTP_Request::sendRequest failed: Malformed response)
原因は、認証プロキシを利用しているせいでした。
よって、Services_Amazon クラスの setProxy で proxy 情報をセットしてあげる必要があります。
$amazon = new Services_Amazon($access_key_id, $secret_access_key); $amazon->setProxy($host, $port, $user, $pass); |
以下、Services_Amazon のマニュアルから引用。
setProxy
void setProxy( string $host, [int $port = 8080], [string $user = null], [string $pass = null])
Sets a proxy
Access: publicParameters:
string $host — Proxy host
int $port — Proxy port
string $user — Proxy username
string $pass — Proxy password
以上です。
Zend Frameworkを使い始めたので、参考になりそうな記事や本をまとめてみました。
・公式(英語):Zend Framework
・DLサイト:Zend Framework: Downloads: Downloads
・ドキュメント(日本語):Zend Framework: Documentation: Zend Framework Manual
■ コードサンプルなどが検索できるサイト
・Zend Framework by examples (ZfEx)
■ 連載記事など
・「Zend Framework」で加速するPHP開発:第1回 PHP開発でZend Frameworkを知らないだなんて嘘ですよね? (1/2) – ITmedia エンタープライズ
・「Zend Framework」で加速するPHP開発:第2回 Zend Frameworkの各コンポーネントを一気に制する (1/3) – ITmedia エンタープライズ
・「Zend Framework」で加速するPHP開発:第3回 ブログツールで学ぶ実践的Zend Frameworkの使い方 (1/5) – ITmedia エンタープライズ
・「Zend Framework」で加速するPHP開発:最終回:「ソースは明かせない……」――ソースコードをバイナリ/難読/暗号化する (1/2) – ITmedia エンタープライズ
・連載:ZendFrameworkで作る『イマドキ』のWebアプリケーション|gihyo.jp … 技術評論社
・Zend Framework入門:CodeZine(コードジン)
Symfonyと比べて、Zendはたくさん書籍が出版されていていいですね。
僕は、会社にあった「オープンソース徹底活用 Zend FrameworkによるWebアプリケーション開発」を読みました。
PHPのPEARを使い始めたら、早速エラーが大量に出てきました。
エラーの出力設定を変更できるようなので
Deprecated: Assigning the return value of new by reference is deprecated in ~ |
とか
Strict Standards |
というエラーが出ます。
・PHP: error_reporting – Manual
デフォルトの設定では以下のようになっています。
error_reporting = E_ALL | E_STRICT |
これを以下のように、E_STRICT と E_DEPRECATED のエラーが出ないように設定すればOKです。
error_reporting = E_ALL & ~E_DEPRECATED |
設定後に、Apacheを再起動して設定を反映します。
# /usr/local/apache2/bin/httpd -k graceful |
error_reporting の設定が反映されているかの確認は # php -i | less コマンドで
Configuration File (php.ini) Path => /usr/local/lib Loaded Configuration File => (none) |
Loaded Configuration File が none となっているため、php.ini を読み込めていないようです。
何故か、僕は/usr/local/lib/php/php.ini に置いていたため読み込めていませんでした。
ちゃんと/usr/local/lib/ディレクトリ直下にphp.ini を移動させると、設定が反映されているようです。
Configuration File (php.ini) Path => /usr/local/lib Loaded Configuration File => /usr/local/lib/php.ini |
# php -i | grep error_reporting error_reporting => 22527 => 22527 |
以上です。
【参考】
・php5.3でDeprecatedエラーに遭遇 « kawama.jp
・PHP5でPEAR::DBを教本通り使ったらStrict Standardsエラーが発生した件 – TMD45LOG!!!
・PEARの呼び出しなどで出るStrict errorやWarningを一時的に消す方法 – Layer8 Reference
・php5.3 Assigning the return value of new by reference is deprecated – 為せば成る・・・かもしれない
Symfony1.4にて、Doctrineでサブクエリ(副問合せ)を使う方法を調べたのでメモ。
・The symfony Cookbook | データをDoctrineで読み取る | symfony | Web PHP Framework
なるほど、createSubquery()を使えばいいんですね。
MySQLのサブクエリについてはこちら。
・MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.8 サブクエリ構文
以上です。
Symfony1.4にて、ログイン認証していないユーザは特定のアクションを実行できないような処理をするのに、preExecute に認証チェックをしていました。
認証チェックが必要なモジュールのアクションファイルに全てに下記のような preExecute メソッドを記述していたのですが、認証・承認の処理はsecurity.ymlで設定を変更すれば一括でできるみたいです…。
/** * アクション実行前にログイン認証が通っているか確認 * 認証が通っていない場合、ログインページにリダイレクト **/ public function preExecute() { if (!$this->getUser()->isAuthenticated()) { $this->redirect('@user_login'); } } |
認証・承認の処理の設定ですが以下のように、security.yml を変更します。
■ /project/apps/frontend/config/security.yml
# You can find more information about this file on the symfony website: # http://www.symfony-project.org/reference/1_4/en/08-Security #default: # is_secure: false all: is_secure: true credentials: login |
security.yml を修正後、忘れずに symfony cc します。
これでウェブサイトにアクセスすると認証していない場合、ログイン処理のページにリダイレクトされます。
ログイン処理に対応するモジュールとアクションを settings.yml に書いていない場合、デフォルトが ‘action’ => ‘login’, ‘module’ => ‘default’ となっているみたいで500エラーが返ってきました。
500 | Internal Server Error | sfConfigurationException
Unable to find a matching route to generate url for params “array ( ‘action’ => ‘login’, ‘module’ => ‘default’,)”.
ログイン処理に対応するモジュール、アクションの設定は以下のように書きます。
(この場合、UserLoginモジュールのLoginアクションにログイン処理をさせています。)
■ /project/apps/frontend/config/settings.yml (一部のみ抜粋)
all: .actions: login_module: UserLogin login_action: Login |
これで認証前にログインページ以外のページにアクセスしても、ログイン処理の画面が表示されるようになりました。
ログイン処理はこれで大丈夫なのですが、これでは新規ユーザ登録のページにアクセスした場合にもログイン処理のページが表示されてしまいます。
これは使えないので、新規ユーザ登録の処理をしているモジュールの認証チェックを外してやります。
モジュール以下のディレクトリに新たに /config/security.yml を作成します。
■ /project/apps/frontend/modules/UserRegister/config/security.yml
all: is_secure: false |
また、モジュール内の特定のアクションに対して認証チェックをする、しないという切り分けを設定することもできます。
例えば、NewアクションとCompleteアクションは認証チェックをしないで、Confirmアクションには認証チェックをするという場合は以下のように書きます。
new: is_secure: false confirm: is_secure: true complete: is_secure: false |
security.yml 、settings.yml を編集後は、symfony cc をするのをお忘れなく。
以上です。
【参考】
・The symfony Reference Book | security.yml 設定ファイル | symfony | Web PHP Framework
・security.yml 設定ファイル | 日本Symfonyユーザー会
Symfony1.4にて、PostValidatorで個別のフィールドにバリデーションエラーを設定する方法を調べたのでメモ。
・参考:postValidatorから個別のフィールドにエラーを設定 – ゆっくり*ゆっくり
最初は、単純に sfValidatorError を使って、バリデーションエラーメッセージを表示させていたのですが、この書き方だとGlobalErrorになります。
// ログインIDの重複チェックをするバリデータ class ValidatorSameLoginId extends sfValidatorBase{ protected function doClean($value){ // DBから同じログインIDのレコードを取得 $user = UserTable::getInstance()->getOneByLoginId($value['login_id']); // 同じログインIDのレコードが既に存在する場合、バリデーションエラー if($user != false){ throw new sfValidatorError($this, '同じログインIDが既に登録されています', array('value' => $value)); } return $value; } } |
これを単一のフィールドに対するエラーであるNamedErrorにするには、
if($user != false){ throw new sfValidatorError($this, '同じログインIDが既に登録されています', array('value' => $value)); } |
の部分を、sfValidatorErrorSchema を使って以下のように書き換えると、個別のフィールドにバリデーションエラーを表示させることができます。
・symfony API » sfValidatorErrorSchema Class | symfony | Web PHP Framework
class ValidatorSameLoginId extends sfValidatorBase{ protected function doClean($value){ // DBから同じログインIDのレコードを取得 $user = UserTable::getInstance()->getOneByLoginId($value['login_id']); // 同じログインIDのレコードが既に存在する場合、バリデーションエラー if($user != false){ throw new sfValidatorErrorSchema($this, array( 'login_id' => new sfValidatorError($this, '同じログインIDが既に登録されています'), )); } return $value; } } |
以上です。
PHP で Amazon API を使うときに参考にしたサイトをまとめてみました。
「PHP Amazon API」というキーワードでGoogle検索すれば、たくさん記事が見つかると思います。
利用例は色んな記事を参考にしても良いと思いますが、メインで参考にするのはこれらのサイトだけで良いんじゃないかと思います。
■ リファレンス的な記事
Amazon 公式のリファレンス(英語)
・Documentation Archive : Amazon Web Services
Amazon API界隈では有名なサイト
・Amazon Web サービス入門(Product Advertising API)
■ まとめ記事
・AmazonのAPI(通称Amazon Product Advertising API)覚え書き – Csideのダイアリー
■ 体型的に学べる参考記事
・PHPでAmazon Web Servicesを利用する(1/5):CodeZine
以上です。
Symfony1.4にて、メール配信処理を実装しました。
参考にした公式サイトのリンクをメモ。
・Practical symfony | 16日目: メーラー | symfony | Web PHP Framework
・The More with symfony book | メール | symfony | Web PHP Framework
・A Gentle Introduction to symfony | 第11章 – Eメール | symfony | Web PHP Framework
実用的な「クラスとしてメールメッセージを使う」を特に参考にしました。
・クラスとしてメールメッセージを使う | A Gentle Introduction to symfony | 第11章 – Eメール | symfony | Web PHP Framework
以上です。