カテゴリー : PHP

PHPFog + Symfony2 でステージング環境を作る方法:Symfony Advent Calender 2011 JP – 13日目 –

こんにちは!「Symfony Advent Calendar JP 2011」 13日目です。

昨日の @77webさんからバトンタッチで、今日は「PHPFog + Symfony2 でステージング環境を作る方法」をご紹介します。

続きを読む

[PEAR] Services_Amazon にて setProxy でプロキシ情報を設定する方法

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: public

Parameters:

string $host — Proxy host
int $port — Proxy port
string $user — Proxy username
string $pass — Proxy password

[引用元]:Docs For Class Services_Amazon

以上です。

[PHP] Zend Framework 入門者向けの参考サイト・書籍まとめ

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(コードジン)
 

Zend Framework 入門書/参考書

Symfonyと比べて、Zendはたくさん書籍が出版されていていいですね。

僕は、会社にあった「オープンソース徹底活用 Zend FrameworkによるWebアプリケーション開発」を読みました。 

[PEAR] Strict、Deprecated error や Warning を表示させない設定方法

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の安全設定

PHP5でPEAR::DBを教本通り使ったらStrict Standardsエラーが発生した件 – TMD45LOG!!!

PEARの呼び出しなどで出るStrict errorやWarningを一時的に消す方法 – Layer8 Reference

php5.3 Assigning the return value of new by reference is deprecated – 為せば成る・・・かもしれない

[Doctrine] SQLを直接実行する方法 [Symfony1.4]

Symfony1.4にて、SQLを直接実行する方法を調べたのでメモ。

以下の記事を参考にしました。

・参考:DoctrineでSQLを直接実行する – ゆっくり*ゆっくり

以上です。

[Doctrine] サブクエリ(副問合せ)を使う方法 [Symfony1.4]

Symfony1.4にて、Doctrineでサブクエリ(副問合せ)を使う方法を調べたのでメモ。

Doctrineでサブクエリを使う : アシアルブログ

The symfony Cookbook | データをDoctrineで読み取る | symfony | Web PHP Framework

なるほど、createSubquery()を使えばいいんですね。

MySQLのサブクエリについてはこちら。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.8 サブクエリ構文

以上です。

[Symfony1.4] 認証(authentication)と承認(authorization)のチェックは security.yml で設定する

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ユーザー会

settings.yml 設定ファイル | 日本Symfonyユーザー会

symfony book 日本語ドキュメント ユーザー証明の管理方法

[Symfony1.4] PostValidatorで個別のフィールドにバリデーションエラーを設定する方法

Symfony1.4にて、PostValidatorで個別のフィールドにバリデーションエラーを設定する方法を調べたのでメモ。

・参考: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 はてなブックマーク - 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;
	}
}

以上です。

[API] PHP で Amazon API を使うときに参考になるサイトまとめ

PHP で Amazon API を使うときに参考にしたサイトをまとめてみました。

「PHP Amazon API」というキーワードでGoogle検索すれば、たくさん記事が見つかると思います。

利用例は色んな記事を参考にしても良いと思いますが、メインで参考にするのはこれらのサイトだけで良いんじゃないかと思います。

■ リファレンス的な記事

Amazon 公式のリファレンス(英語)

Documentation Archive : Amazon Web Services はてなブックマーク - Documentation Archive : Amazon Web Services

Amazon API界隈では有名なサイト

Amazon Web サービス入門(Product Advertising API) はてなブックマーク - Amazon Web サービス入門(Product Advertising API)

■ まとめ記事

AmazonのAPI(通称Amazon Product Advertising API)覚え書き – Csideのダイアリー はてなブックマーク - AmazonのAPI(通称Amazon Product Advertising API)覚え書き - Csideのダイアリー

■ 体型的に学べる参考記事

PHPでAmazon Web Servicesを利用する(1/5):CodeZine はてなブックマーク - PHPでAmazon Web Servicesを利用する(1/5):CodeZine

以上です。

[Symfony1.4] メール配信処理の実装

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

以上です。