2008/6/27 金曜日 by kouichi
HTTPリクエストのログをうまいこと出力できないかなぁと思案していました。
$reqからパラメータをひとつひとつgetするのは芸がないので、
print_r($req->getParams())
とかを使ったところ、レスポンスにArrayの情報が出力されてしまいどうもNG。
とのことで調べると、
print_r($req->getParams(),true)
と第2引数があるらしいとのことで
$log = new Zend_Log();
$log->addWriter(new Zend_Log_Writer_Stream('log.log'));
$log->log('request data = ' . print_r($req->getParams(),true),Zend_Log::INFO);として、うまく出力できました。
こちらを観ると
~~~
print_r() の結果を取得したい場合には return 引数を試用してください。 print_r() はデフォルトでは結果を直接表示してしまいますが この引数が TRUE の場合には結果を戻します。
~~~
とのこと。
デフォルトが標準出力というは、PHPがスクリプト言語だという特徴がでているんだろうなぁと、背景をしみじみと感じつつ。
Posted in PHP | No Comments
2008/6/25 水曜日 by kouichi
例えばView部分でヘッダやフッタ部分だけ共通なphtmlを作成したいとした場合がよくありますが、その場合 <html>
<body>
<div class="header">
<? include "header.phtml"; ?>
</div>
<div class="main">
メインの表示部分
</div>
<div class="footer">
<? include "footer.phtml"; ?>
</div>
</body>
</html>
こんな感じでメインのphtmlを書いて、header.phtml、footer.phtmlをincludeパスに指定されているディレクトリに設置すればOKです。
最初はheader.phtml、footer.phtmlをおいたディレクトリに、includeパスが通っていなくて表示されませんでしたが、includeパスのディレクトリに設置して、無事表示されました。
ただ、一般的なZendのディレクトリ構成だと、MVCをきっちり分けるべきなので、Viewディレクトリへもincludeパスを通して、そちらにphtmlファイルをまとめるのが良さそうですね。
index.phpのset_include_pathにapplication/view/scriptsも追加して、読み込みOKでした。
Posted in PHP | 2 Comments
2008/6/20 金曜日 by kouichi
ZendにはValidateのライブラリもあるのか、ということで使ってみました。
こちらなどを見ると、
< ?php
require_once 'Zend/Validate/EmailAddress.php';
$validator = new Zend_Validate_EmailAddress();
if ($validator->isValid($email)) {
// email は妥当な形式です
} else {
// email は無効な形式です。理由を表示します
foreach ($validator->getMessages() as $messageId => $message) {
echo "バリデーションエラー '$messageId': $message\n";
}
}のように、各Validatorのインスタンスを作ってというやり方もあるようですが、
$success = Zend_Validate::is($value, $type, $option);を使ったほうが使い勝手が良いかと思われます。
例えば、
< ?php
require_once 'Zend/Validate.php';
abstract class AbstractValidator
{
abstract protected function _getValidators();
public function validate($data){
return $this->_validate($data);
}
protected function _validate($data){
$results = array();
$validators = $this->_getValidators();
foreach($validators as $validator){
$key = $validator['key'];
if(array_key_exists($key,$data)){
$value = $data[$key];
$type = $validator['type'];
$option = $validator['option'];
$success = Zend_Validate::is($value, $type, $option);
if(!$success){
$result = array('value'=>$value,'validator'=>$validator);
array_push($results, $validator['message']);
}
}
}
return $results;
}
}という基底クラスを作成し、
< ?php
require_once 'AbstractValidator.php';
class UserValidator extends AbstractValidator
{
protected function _getValidators(){
$validators=array(
array('key'=>'account','type'=>'Alpha','option'=>array(),'message'=>'アカウントは英数字で入力してください。'),
array('key'=>'password','type'=>'Alpha','option'=>array(),'message'=>'パスワードは英数字で入力してください。'),
array('key'=>'password','type'=>'Between','option'=>array(5,10),'message'=>'パスワードは5文字以上10文字以下で入力してください。'));
return $validators;
}
}と継承クラスを作成するのはどうでしょう?
Zend_Validate::isがかなり汎用的なので、後は_getValidatorsで設定を作っていけばほとんどのケースがフォローできていい感じではないかと思います。
Posted in PHP | No Comments