Zend Framework Part4
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2010/02/09(火) 22:21:24ID:???http://framework.zend.com/
マニュアル
http://framework.zend.com/manual/ja/
翻訳状況
http://mikaelkael.dyndns.org/checker/language/details/lang/ja
http://framework.zend.com/wiki/display/ZFDEV/Japanese+(Nihongo)
バグ報告
http://framework.zend.com/issues/secure/Dashboard.jspa
API
http://framework.zend.com/apidoc/core/
前のスレッド Zend Framework Part3
http://pc11.2ch.net/test/read.cgi/php/1239320100/
0322319
2010/06/02(水) 13:22:49ID:NqHn07VJありがとうございました。
調べたところ問題なさそうでした。
0323nobodyさん
2010/06/04(金) 15:51:23ID:???/index = IntexController->indexAction();
/hoge = IndexController->hogeAction();
とルートしたい場合、独自Routerを書かないと駄目でしょうか?
設定で対応出来るものでしょうか?
0324nobodyさん
2010/06/04(金) 16:27:09ID:???0325sage
2010/06/06(日) 10:36:36ID:???0326nobodyさん
2010/06/09(水) 16:15:06ID:zdg5Ro52Zend_Session::rememberMe()
をログイン画面でログイン成功時に使用しています。
引数には1800秒を指定しているのですが、
この場合、ログイン成功してから1800秒間
セッションが有効になるのでしょうか?
ログイン後の次の画面で
Zend_Session::start();
を呼んで、ログインに成功しているかどうかを判断しているのですが、
Zend_Session::start();をコールしただけでは
セッションの生存期間はリセットされないのでしょうか?
0327nobodyさん
2010/06/11(金) 12:51:52ID:1eqyNkqt0328nobodyさん
2010/06/13(日) 04:57:57ID:???0329nobodyさん
2010/06/13(日) 05:25:30ID:???0330nobodyさん
2010/06/13(日) 07:21:39ID:???0331nobodyさん
2010/06/13(日) 07:57:06ID:???ローカル環境にPHPいれてZF最新版いれて・・・ってやる程恩恵あるのかなと疑問に思ったんだけど、
覚えなくてもいい感じかね。
0332nobodyさん
2010/06/14(月) 20:34:32ID:sDoDPQ6e恥ずかしいんだけど簡単に教えて欲しい、
$query = new Zend_Service_Amazon($access_key, 'JP', $secret_key);
$results = $query->itemSearch(
array(
'SearchIndex' =>'Music',
'Keywords' =>$params['key']
)
);
この$queryと$resultsに対してどうしたら良いのか。。
Amazon/Item.phpの
public function __construct(DOMElement $dom)
をどう解釈したら良いのかわからない…
誰かアドバイス頼みます
0333nobodyさん
2010/06/14(月) 22:17:48ID:+e+bNGnA$results を foreach で回す。
foreach ($result as $k => $v) {
var_dump($v);
}
0334nobodyさん
2010/06/15(火) 10:40:13ID:???どうもありがとう、自己解決したよ
searchのオプションで'ResponseGroup' => 'Medium',指定しないと必要な情報が
そもそも取れないのを気づかなかった
アドバイスもサンキュー
0335nobodyさん
2010/06/16(水) 16:18:46ID:N9yq5s20この返り値$objは $num = $obj -> rowCount(); でアップデートの対象件数を
調べられるってことだけど、これについて教えて欲しい。
具体的に言うと、 アップデートする既存データ(カラム情報)と上書きするデータが
全く変化がないとき、$num=0を返すんだけど、これってこれで正しいの?
まるで変更前のカラム情報と変更後のカラム情報を比較して、実際のupdateするしないを決めてるみたいな挙動だけど
純粋にWhere以下の条件をクリアしてるアップデート対象の件数を返すと思って
更新のエラー判別や件数判定しようと思ってたので困ってます。
ZendFWは1.10、DBはMysqlです。
0336326
2010/06/16(水) 16:42:17ID:XZSSnjmGどなたかご存知の方はいらっしゃらないでしょうか。
0337nobodyさん
2010/06/16(水) 16:44:39ID:???0338326
2010/06/17(木) 11:07:21ID:???色々と試行錯誤しながらも
皆様からのご意見をお待ちしておりました。
現状まだ解決しておりませんので
ご意見いただけると幸いです。
0339nobodyさん
2010/06/17(木) 12:45:38ID:???0341326
2010/06/18(金) 00:18:45ID:???ご回答ありがとうございます。
できれば、一度ログインして
タイムアウトもしくはログアウトをするまでは
同じセッションIDを使用したいと考えています。
rememberMeを呼ぶとセッションIDが書き換わるようなので
ちょっと困っています。
同じセッション間でユーザがどのように
ページを遷移していったかログをとりたいのですが、
その時に識別するキーにセッションIDを使用しています。
セッションIDを使うのではなく、別の一意のIDを用意するべきでしょうか?
0342nobodyさん
2010/06/18(金) 01:06:33ID:???0344nobodyさん
2010/06/18(金) 06:24:53ID:???という神の啓示セヨ
0345326
2010/06/19(土) 12:24:02ID:???ありがとうございます。
それではセッションID以外の一意のキーを用意するようにします。
rememberMeもあまり多用すると、パフォーマンスに影響するという
情報もありましたので、要所要所で使用していきたいと思います。
0346nobodyさん
2010/06/19(土) 12:46:56ID:???0347nobodyさん
2010/06/19(土) 16:33:15ID:MplSKe7WDBがMysqlのとき、トランザクションでcommit()メソッドを使って処理が成功した場合
$db->query($q1);
$db->query($q2);
$rs = $db->commit();
の返り値$rsをvar_dump($rs)したら、object(Zend_Db_Adapter_Pdo_Mysql)なんだけど、
このオブジェクトからエラーコードや処理した行数を取得するメソッドってないのかな?
エラーだけならtry~catchの分岐で捕まえられるけど、行数を取得するにはどうしたらいいの?
非トランザクション処理で返ってくるZend_Db_Statement_Mysqliオブジェクトの場合、
rowCount()とかerrorCode()とかのメソッドを利用してクエリ結果を簡単に確認出来るけど
トランザクション時の方はわからない。
どなたかアドバイスお願いします。
0348nobodyさん
2010/06/19(土) 22:51:45ID:???トランザクションの時も同じだよ。
commit()はあくまで処理を確定する為のメソッド、
実際に処理が行われるのはquery()メソッドなので、
その戻り値(Zend_Db_Statement_Mysqli)で処理結果を取得すればいい。
0349nobodyさん
2010/06/20(日) 00:19:42ID:???おお、レスありがとう。じゃあ、トランザクション処理としてfor文で
クエリ($rs=$db->query($hoge))を10回繰り返すとしたら、
$n = $rs->rowCount(); とか $rs->errorCode();とかの処理も
10回for文の中で繰り返さなきゃいけないわけだよね
しょうがないけど、効率悪いような… ともかくありがとう
0350nobodyさん
2010/06/20(日) 00:38:46ID:???それはZendじゃなくてSQLの仕様だよ
10回クエリを投げるなら、10回期待した結果が得られたかどうかキチンと判定しないと、
commitもしくはrollbackが出来ないだろうさ
0351nobodyさん
2010/06/20(日) 01:13:52ID:???たとえば5回目でinsertするカラムの数と値の数があわなかったらエラーで
rollbackされるわけだよね?
逆に言えば複数回のクエリ(トランザクション利用)の「全体としての成功/失敗」程度しか
確認が必要じゃない時は
commitできたときはtrueをreturn、rollbackのときはfalseなりエラーメッセージをreturnで
検証完了と割り切っちゃって良いのかな
0352nobodyさん
2010/06/20(日) 02:11:43ID:???>commitしたってことは各回のクエリに失敗は無かったってことでしょ?
>たとえば5回目でinsertするカラムの数と値の数があわなかったらエラーで
>rollbackされるわけだよね?
これは逆じゃない?
commitする前にクエリが正常に完了したかどうかを自前で判断して、
OKであればcommit、NGであればrollbackを行うべきかと・・・
SQLクエリ自体が通ってしまえば、commitは出来てしまうので、
commitが出来た=全体として成功って判断は危険だと思うよ。
0353nobodyさん
2010/06/20(日) 02:22:43ID:???トランザクションの認識自体がオカシイ、Zend以前の問題ぽいですね
ttp://pluto-blog.blog.so-net.ne.jp/2007-01-15
こんなサイト見つけて、この考え方で良いのかなって思ったんだけど…
0354nobodyさん
2010/06/20(日) 03:14:42ID:???そのサイトの超絶簡単サンプル1だね。
サンプルでは「SQLクエリにエラーがなかった場合、処理は成功」としているけど、
例えば「行を削除するが、テーブルの行が5件未満になってはいけない」みたいな条件がある場合、
単にSQLクエリが成功したかどうかで判断するのは難しいよね。
例)DELETE句自体に問題は無いのでcommit()出来てしまう。
$db->beginTransaction();
try {
$db->query("DELETE FROM tableName");
$db->commit();
} catch (Exception $e) {
$db->rollBack();
}
これではマズイのでcommit()を行う前に、
自前でDELETE後の行数を確認する必要があるわけだ。
0355nobodyさん
2010/06/20(日) 18:48:10ID:???空港でチケット止めたり、ICカードシステムが止まるような仕様だよそれ。
普段はうまく行ってるけど、実はバグってて見えないだけ、を隠蔽してる。
0356351
2010/06/20(日) 23:49:48ID:???どうもありがとう。正直すんなり理解出来ないんですよね、トランザクション勉強し直しかなこりゃ。。
>「行を削除するが、テーブルの行が5件未満になってはいけない」みたいな条件がある場合
…というような条件は無いんだけど、ループするクエリ処理をその都度検証すべしってことは
try{
$success = 0;
for($i=0;$i<$loop;$i++){
$rs = $db->query(insert 〜);
//以下で登録クエリの成功を確認
$chk1 = $rs->rowCount();
$chk2 = $rs->errorCode();
if($chk1==1 && $chk2=="00000")$success++;
}
if($success ==$loop){
$db->commit();
}else{
//ループのどこかで失敗してる
$db->rollBack();
}
} catch (Exception $e) {
$db->rollBack();
}
こんな感じでいいんですかね?
5件以下になってはいけない云々みたいな条件が無い時でもこういう処理が必要なら
トランザクションの説明全部にそう書いてて欲しかったなぁ… ずっと誤解してたよ
0357nobodyさん
2010/06/21(月) 00:03:17ID:???途中でエラーが出た場合、ループを抜けないと無駄なクエリを発行する事になってしまうので、
ループ部分はこんな感じでもいいと思う。
for($i=0;$i<$loop;$i++){
if($db->query(insert 〜)->rowCount() != 1)
throw new Exception('クエリの結果がおかしいです><');
}
>トランザクション
簡易カートシステムを設計してみると理解し易いかもよ。
1回の処理で、在庫確認、発注処理、決済処理が発生して、
1つでも失敗した場合はrollbackを行う。みたいな。
0358nobodyさん
2010/06/21(月) 00:14:33ID:???その不可分なクエリをまとめるのがトランザクションで、
含まれるクエリ全部が成功するか、あるいは何もしなかったことにするか、
どっちかの結果しかない。(中途半端な成功はデータの不整合になる)
特に指定しなければ、1つのクエリが1つのトランザクションという扱いになってる。
というのがオイラの理解。
0359351
2010/06/21(月) 00:14:59ID:???おお、素早いレスありがとう。
その例だとわかりやすいし、よく銀行の出金〜入金を例にしてるけど
そういうサンプルでも出勤処理と入金処理それぞれのクエリ文2つ並べてるだけで、
それぞれの結果をチェックしてるのみたことないよ
だからcommit処理ってエラーチェック自体したうえでcommitしてるものだと思ってた
まあZendFWと関係ないレベルで申し訳ないです。
勉強になりました。ありがとう。
0361nobodyさん
2010/06/22(火) 16:44:11ID:???いや、つーか惜しかったんだよ。
commitが成功するか、否かじゃなくて例えば100件個別にインサートするのに
100回実行した後で、インサート件数が100件じゃなかったらrollbackする、
つうまとめてチェックなら一般的に用いられてる。それでも失敗した件数
(出来ればとれが失敗したか)をユーザに知らせる親切設計にするんだけどね。
まぁTwo phase commit とかsave point経験すると、この辺は呼吸するみたいに
当然の仕様になるんだが、、、金融系だと1円のミスでも塵積で賠償問題に
なっちゃうからね。
0362nobodyさん
2010/06/22(火) 16:45:59ID:???0363nobodyさん
2010/06/22(火) 17:55:44ID:???0364nobodyさん
2010/06/22(火) 20:27:27ID:???お前ら程度だとまっさきにバグるだろうがな。
0365nobodyさん
2010/06/22(火) 20:34:28ID:???0366nobodyさん
2010/06/22(火) 20:35:54ID:???もうこの一言で程度が知れるなあ
気の毒に
0367nobodyさん
2010/06/22(火) 20:35:58ID:???0368nobodyさん
2010/06/22(火) 20:41:24ID:???じゃないとこの流れでいきなり2相コミットの話なんて出ようがない
0369nobodyさん
2010/06/22(火) 20:46:10ID:???rollbackもしくはcommitしたあとの結果の話なんだから
2PhaseCommitに至っては全く持って話と関係ないし
0370nobodyさん
2010/06/23(水) 05:46:35ID:???議題が読み取れないのに、聞いてもいない自分論を喜々として語る。
その内容も大抵は誰の得にもならない、意図不明な物が多い。
0371nobodyさん
2010/06/23(水) 08:53:23ID:???0372nobodyさん
2010/06/23(水) 10:39:45ID:???0373nobodyさん
2010/06/24(木) 08:49:30ID:j4+/2c3lbootstrupに登録したdbの情報も使うので、単純にapplication/batchを作ってスクリプトを再生して起動しても、
bootstrupを通らないので、うまくDBなども使えません。
コントローラーを使うかのようにバッチを使いたいです。
やり方が記載されているページなど有りましたらおしえてほしいです。
0374nobodyさん
2010/06/24(木) 09:11:32ID:???バッチ用のBootstrap&Dispatcherを作ればいいと思うよ。
面倒なのであればバッチからWEB呼び出しちゃえば?
file_get_contents("http://xxxxx/xxx");
0375nobodyさん
2010/06/25(金) 01:30:49ID:AQc08b3W0376nobodyさん
2010/06/27(日) 07:11:07ID:???無理してPHP使う理由なくなってきたなぁ
0377nobodyさん
2010/06/27(日) 10:36:41ID:???0378nobodyさん
2010/06/28(月) 02:58:43ID:???0379nobodyさん
2010/06/28(月) 13:39:35ID:???PHPしか動かないレンタルサーバなんてまず滅多にないだろ
0380nobodyさん
2010/06/28(月) 13:48:03ID:???0381nobodyさん
2010/06/28(月) 15:07:53ID:???PHPの中では便利だけど、PHP以外でなら選択肢は山ほどあるだろうに。
0382nobodyさん
2010/06/28(月) 15:18:21ID:???Railsとか死ぬほどクソだったわ
0383nobodyさん
2010/06/28(月) 15:20:21ID:???2.SAStruts
3.Zend
4.Catalyst
5.Click
って感じだな俺の評価は
RubyやPythonはそもそも言語的に微妙
やっぱPerl、PHP、Javaでまとまっちゃうわ
0384nobodyさん
2010/06/29(火) 10:12:03ID:???PHPしかつかったことないWebプログラマなんだけど
RubyやPythonの方が言語的に微妙って
どの辺からそう感じるんだろうか
自分がPHP使ってて苛々することが多い上に
RubyやPythonの評価見てると逆だと思ってた
0385nobodyさん
2010/06/29(火) 14:29:24ID:???OOP流行りだからPHPは言わずもがな使い辛いとなる
ただ言語仕様守らない人にとっては何使っても一緒
0386nobodyさん
2010/06/29(火) 18:46:44ID:???好みに合わなくても無理矢理使わされる人が殆どいないからいい評判ばかり聞こえてくる
0387nobodyさん
2010/06/29(火) 19:47:06ID:???Java(Servlet)+SpringMVC+Velocity+Jakartaいろいろ
を組み合わせてやってたけど、ちょっとしたサイトつくるときに
レンタルサーバで動かせないから
PHP+ZendFrameworkに移行したんだけど
上記の組み合わせとほぼ同じ感じで出来てるから満足してる。
0388nobodyさん
2010/06/29(火) 19:51:06ID:???コンテナ起動中はApplicationスコープに変数保持してられるし、
PHPでもmemcachedとか使えばいいんだろうけど、手軽さが全然ちがう。
0389nobodyさん
2010/06/29(火) 19:53:43ID:???Apacheプロジェクトで良質なFW・ライブラリが選り取り見取りだし。
0390nobodyさん
2010/06/30(水) 02:14:21ID:???勘違い乙。
だいたいRubyやPython使ってる連中は他言語を使ってる。
ちゃんとつかって>>383みたいな評価するのは超少数派。
というか使ってるかどうかすら怪しい。
0391nobodyさん
2010/06/30(水) 14:54:36ID:???0393nobodyさん
2010/06/30(水) 15:52:01ID:???手軽さと利便性はPHP、言語仕様としてはRubyを評価するかな。
PHPの気持ち悪い点
・namespaceの区切りがバックスラッシュ
・無理矢理っぽい無名関数
・try catchにfinalyが無い
・goto文
・引数の型チェックが中途半端(stringとか指定出来ない)
0394nobodyさん
2010/06/30(水) 17:07:27ID:???0395nobodyさん
2010/06/30(水) 17:22:46ID:???0396nobodyさん
2010/06/30(水) 17:44:40ID:???0397nobodyさん
2010/06/30(水) 17:58:24ID:???気持ち悪いけど
0398nobodyさん
2010/06/30(水) 20:17:05ID:???ていうかここZFスレね
0399sage
2010/07/03(土) 00:16:16ID:???try catch の finaly は確かに欲しいね。
Ruby の入門書を見て便利だなと思ったのは、各文字列オブジェクトごとに文字エンコードをプロパティーとして指定できるところ。
0401nobodyさん
2010/07/04(日) 16:17:02ID:???0402nobodyさん
2010/07/04(日) 20:37:45ID:???0403nobodyさん
2010/07/04(日) 20:38:37ID:???PHPの初心者スレか、自分のブログに書いたらいいよ
0404nobodyさん
2010/07/04(日) 22:41:57ID:???2つ以上立てようとするとキモくなる、なんで?
0405nobodyさん
2010/07/04(日) 23:15:04ID:???0406nobodyさん
2010/07/04(日) 23:47:14ID:???0407nobodyさん
2010/07/05(月) 09:38:39ID:???うちはVirtualHost別にmodule振り分けるRouter自作してやってるよ。
いい感じに疎結合になるし、管理も楽。
0408nobodyさん
2010/07/05(月) 10:20:06ID:???0409nobodyさん
2010/07/05(月) 13:01:04ID:???Zend_Controller_Router_Route_Hostnameだと、
:hoge.fuga.com
とかやると:hogeが省略出来ないとか、
あと他にも理由あったような気がするけど
正規表現でHostnameマッチできるRouter自作した。
0410nobodyさん
2010/07/05(月) 13:03:27ID:???module用のPluginが登録されるようにした。
0411nobodyさん
2010/07/05(月) 13:10:07ID:???どのくらい複雑なHOST名にしてるのか知らないけど、
Hostnameでも複数ルートを登録できるから、その程度の理由なら自作しなくてもいいな。
他にも理由があったと言う他を思い出したら教えて
>>410はプラグインとZend_Applicationで処理するのが常道だけど、
Routerに書いてんの?Routerでプラグイン登録?まぁ、いいけど。
0412nobodyさん
2010/07/05(月) 14:56:06ID:???あ、RouterでPlugin登録してるわけじゃないよ。
Module別Bootstrapはあるけど、
Module別Pluginが欲しかったから
Routeされた段階で遅延登録されるようにした。
Host数=Module数は30個くらい?で、
その中でもさらにサブドメイン(?)をパラメータにして
いろいろやってた。
ちなみに今のバージョンでどうなのかは知らない。。
0413nobodyさん
2010/07/05(月) 15:00:43ID:???route要素もextendsとか多用してて複雑になってたから
標準のRoute_Hostnameだと
対応できなかったから自作したんだっけかな?
0414nobodyさん
2010/07/05(月) 15:05:19ID:???まず正規表現でHostnameからパラメータ取得したかったのと、
その際にPunycodeをデコードしたかったんだった。
0415nobodyさん
2010/07/05(月) 15:48:35ID:???おれだったら、正規表現はmod_rewriteで済ませて、
デコードはルーティングに入る前にプラグイン処理だな。
もしくは、RouterじゃなくてRouteで。
まぁ、Routerでもいけるだろうけど。
0416nobodyさん
2010/07/05(月) 17:46:39ID:???0417nobodyさん
2010/07/13(火) 22:41:12ID:???画像のリンクが切れてるだけでdispatchLoopStartup何回も走るとかうぜぇ・・
0418nobodyさん
2010/07/14(水) 00:21:27ID:???dispatchする前に別処理へ移行すればいいだけの話だ
0420nobodyさん
2010/07/16(金) 15:47:04ID:???0421nobodyさん
2010/07/22(木) 09:02:40ID:8xnHx2roネットとかみてZend_Fromを勉強中ですが、デコレーターとかのファイルを
どこに置いていますか?
Contoroller内?????
■ このスレッドは過去ログ倉庫に格納されています