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/
0638nobodyさん
2010/11/05(金) 02:12:03ID:???>>if ($diary->isValid()) $this->_redirect('/error/pt/paramerr');
>これは、ifの()の中ってこれで良いんですか?
ごめん。 if (!$diary->isValid()) だね。
0640nobodyさん
2010/11/05(金) 09:45:33ID:???JSONやXMLとの親和性もいいんじゃないか?
0641nobodyさん
2010/11/05(金) 16:52:21ID:???0642nobodyさん
2010/11/05(金) 19:40:31ID:???http://sourceforge.jp/magazine/10/11/05/0641258
0644nobodyさん
2010/11/06(土) 00:53:16ID:???普通は無尽蔵に可変なら配列で渡すし、
引数の数や型よって処理が変えたいのであればオーバーロードする。
PHPはオーバーロードが無いから仕方無い。
0646nobodyさん
2010/11/06(土) 01:11:09ID:???func_get_argsの話。
単に不特定多数の値を渡すだけなら配列渡しの方が見通しが良い。
func_get_argsは、引数の数をチェックして振る舞いを変える為にあるイメージ。(疑似オーバーロード)
まぁ好みの問題だろうけど。
0647nobodyさん
2010/11/06(土) 01:38:52ID:???0648nobodyさん
2010/11/06(土) 02:46:56ID:???配列渡しの書き方を省略したいだけなら array() でくくった方が良いと思う。
IDEとの相性も悪いし。
0649nobodyさん
2010/11/06(土) 02:49:53ID:???0650nobodyさん
2010/11/06(土) 03:05:36ID:???逆にarrayで囲わない理由は何だろうか?面倒だから?
0651nobodyさん
2010/11/06(土) 03:08:01ID:???0652nobodyさん
2010/11/06(土) 04:48:15ID:???うーん。そもそもオーバーロードの概念が無い人には説明し辛いんだが
function hoge($array) {}
function hoge($string, $string) {}
function hoge($string, $array) {}
という感じで、同名関数だけど引数によって処理が変わる場合に使うのが望ましいだよ。
ここまでは解る?
fung_get_args()で配列を受け取りたいだけならarrayを受け取る関数一つでもいいよね?
function hoge($array) {}
ここでまでは解る?
オーバーロードは本来、
受け取った引数の型や個数によって処理を振り分ける場合に有用なんだよ。
PHPじゃなくてプログラミング言語自体の基礎がついていれば普通は理解出来ると思うが。
0653nobodyさん
2010/11/06(土) 13:19:33ID:???func_get_argsがオーバーロードを実現するための関数だという根拠は何か
そしてそれを使うとどういう不具合が発生するのか
を聞いてるんだけど
0654nobodyさん
2010/11/06(土) 14:18:26ID:???0655nobodyさん
2010/11/06(土) 14:24:08ID:???オーバーロードは、引数の型や個数を関数を区別する情報の一部として扱うことで、
それぞれ別個の関数を定義する仕組み。
実行時に引数を見てシミュレートすることはできるだろうけど。
0656nobodyさん
2010/11/06(土) 14:32:07ID:???0658nobodyさん
2010/11/06(土) 17:36:17ID:???マニュアル嫁
http://php.net/manual/ja/function.func-get-args.php
逆に配列渡しにしない理由はなんだよ?
>>655
わかってるよ(>>646に書いてる)
0659nobodyさん
2010/11/06(土) 17:46:21ID:???引数を実行時に組み立てたいなら配列しかないだろうし、
printf的な使い方なら、いわゆる可変引数の方が直感的だろうし。
0662nobodyさん
2010/11/06(土) 21:23:28ID:???User Contributed Notesはユーザが勝手に追加するコメントだよ?
逆にいうとそこ載っているという事こそ、標準の使い方でないことの証明。
しかも数十件ある中で1件しかそんなこと書いてないからPHPユーザの中でもそんなことしてるのはマイナーと思われる。
0663nobodyさん
2010/11/06(土) 21:43:07ID:???>逆にいうとそこ載っているという事こそ、標準の使い方でないことの証明。
なんねーよw
func_get_argsが直接バグを生み出す訳では無い
・関数の内部処理を見ないとパラメータの扱いが解らない
・タイプヒンティングが使えない
・IDEによる補完機能が使えない
・バージョンによる挙動の違い
という制約が結果的に潜在的なバグを生み出しやすいって事だよ。
それらを踏まえて、単に複数パラメータを渡すだけならarrayを使い、
オーバーロード的な振る舞いを行いたい時にfunc_get_argsを使えば良い。
で、頑なに配列渡しを拒む理由は何なの?
0664nobodyさん
2010/11/07(日) 21:13:27ID:???いくつか見た感じ、ZFではオーバーロード的な振る舞いを狙った使い方はしてないかも?
ただ >>663 の
>単に複数パラメータを渡すだけならarrayを使い、
>オーバーロード的な振る舞いを行いたい時にfunc_get_argsを使えば良い
はわりと同意。
0665nobodyさん
2010/11/09(火) 09:47:23ID:???ありがとう。
検索してみたけど、確かにオーバーロード的な使い方はしてないね・・・(sprintf系が多い?)
個人的にIDEに洗脳されつつあるので、可変引数は毛嫌いしてたけど、
ちょっと引き出しが増えた気分だよ。ありがとう。
0666nobodyさん
2010/11/09(火) 17:16:52ID:bQQ5pU57$ret = $db->query("insert〜〜");
$rowCount = $ret->rowCount();
$errCode = $ret->errorCode();
if($rowCount == 1 && $errCode="00000"){//クエリは成功しました}
自分は普通、Zend_dbで単純なinsert処理とかをする場合は上記のようにクエリの成功/失敗を判別してるけど
トランザクション処理の場合、以下のようにやってます。
try{
$db->beginTransaction();//トランザクション開始
$lastInsertIdAry = array();
for($i=0; $i<$n; $i++){
$db->query(
"INSERT INTO `{$table}`(id,uType) VALUE(:id,:uType)",
array(':id'=>0, ':uType'=>$uType)
);
$lastInsertIdAry[$i]=$this->_dbConn->lastInsertId();
}
$db->commit();
return array('status'=>'success', 'insertIdAry'=>$lastInsertIdAry);
}catch (Zend_Db_Statement_Exception $e){//トランザクション失敗A
$db->rollBack();
$msg = $e->getMessage());
return array('status'=>'errorA', 'errorMsg'=>$msg);
}catch (Exception $e){//トランザクション失敗B
$msg = $e->getMessage();
return array('status'=>'errorB', 'errorMsg'=>$msg);
}
もっと効率的なやり方ないですか? またそもそもこの方法に穴はないでしょうか。
発生したエラーをログに残すのに効率的な方法を探してます。
0667nobodyさん
2010/11/09(火) 23:37:52ID:???あと何のDB使ってるか知らんけどidに0入れてauto incrementになるのかい
効率的といってもコード量なのかメモリ量なのか実行速度なのか可読性なのか開発効率なのか保守性なのか
何を重視するのかによる
0668nobodyさん
2010/11/09(火) 23:49:24ID:???> ・関数の内部処理を見ないとパラメータの扱いが解らない
> ・タイプヒンティングが使えない
> ・IDEによる補完機能が使えない
それって全部arrayでも同じじゃないの?
0672nobodyさん
2010/11/10(水) 00:22:28ID:???0673nobodyさん
2010/11/10(水) 00:31:38ID:???>・関数の内部処理を見ないとパラメータの扱いが解らない
これは少々語弊があるね・・・
パラメータの扱いではなく、必要なパラメータが関数の宣言を見るだけで解る。
(func_get_argsにすると内部処理を見ないとわからない)
(PHPDocに書けば別だが、IDEは認識出来ない)
>・タイプヒンティングが使えない
arrayは使える
>・IDEによる補完機能が使えない
引数定義しておけばパラメータ補完機能が働く
以下コード例
function hoge(array $array) {}
function hoge() { $array = func_get_args(); }
0674nobodyさん
2010/11/10(水) 14:17:57ID:JflIvKmc$referer = urlencode("http://www.yahoo.co.jp");
$this->_redirect('/hoge/user/taro/referer/'.$referer);
↑の方法でリダイレクトさせたら404 Not Foundが返ってきて困ってる
($refererを空欄にするとちゃんとリダイレクトできる)
$refererをurlencode()しなければリダイレクトは成功するけどrefererの値がhttp:になってしまうし
もしかしたらZend以前の問題かも知れないけどアドバイスお願いします
0676nobodyさん
2010/11/11(木) 19:52:34ID:???引数が多くなってきたらハッシュで渡すのが、メソッドオーバーロードのないスクリプト言語での常套手段だと思う。
0677nobodyさん
2010/11/11(木) 21:00:10ID:???0678nobodyさん
2010/11/12(金) 11:04:01ID:???ページのエレメントではないチェックボックスやテキストボックスの状態を
ページ移動後も維持したいのですが、
方法が分かりません。ページ移動すると初期状態にもどります。
Zend frameworkに何か仕組みはあるのでしょうか?
0679nobodyさん
2010/11/12(金) 12:11:24ID:???クライアント側で変更したなら当然Javascript使わなきゃだよ。
0680nobodyさん
2010/11/12(金) 12:21:47ID:???viewscript内のhrefって基本は自分で書くようになってるやん。
維持するのもリセットするのもあんた次第。
維持する項目が多くてPC用ならセッション使うのが普通。
0681nobodyさん
2010/11/12(金) 13:54:05ID:wenK3AdPBootstrapで初期処理を行うクラスとみて大丈夫でしょうか。
また、Bootstrap.phpで
protected function _initTest() {
$this->foo = 'var';
}
と変数を格納した場合、
class TestController extends Zend_Controller_Action
public function indexAction()
{
var_dump($this->foo);
}
}
のように、コントローラ側に値を渡すにはどうすれば良いのでしょうか
0682nobodyさん
2010/11/12(金) 16:52:02ID:???$this->getInvokeArg('bootstrap')->foo
0683nobodyさん
2010/11/12(金) 18:01:38ID:???いちいち必要なモジュール読み込んで
手続き書いていくだけでおなかいっぱいだよ・・
0685nobodyさん
2010/11/13(土) 01:50:36ID:???0686nobodyさん
2010/11/13(土) 09:44:11ID:YYAlO5qeちょっと違う
ブートストラップは、リソースを初期化してコンテナに保存する所なのよ。
つまりこう
protected function _initTest() {
$test = new stdClass;
$test->foo = "bar";
return $test;
}
とやるとtestという名前でコンテナ(レジストリ)に保存されるから、
あとはコントローラでもモデルでもビューでもどこからでも
ZendRegistry::get('test')->foo;
てやれば取り出せる
フロントコントローラとかビューとかDBとか良く使うリソースは、それ用のプラグインがあって、
初期値だけiniファイルで与えてやればコード書かなくても勝手に作られるようになってる。
0687nobodyさん
2010/11/13(土) 10:24:40ID:???/* @var $name ClassName */
を駆使すりゃどうにでもなるだろ
まぁ無駄なコードは増えるが
0688nobodyさん
2010/11/13(土) 10:47:24ID:???だからハッシュだとか可変引数だとかの議論はナンセンス
0689nobodyさん
2010/11/13(土) 10:54:25ID:???0690nobodyさん
2010/11/13(土) 11:35:43ID:???それはタイプヒンティングでは無い。
>>688
そんな事は名言されていない。
思想時に無かった故に、継ぎ足しされてカオスなコードになっているだけ。知ったか乙。
0691nobodyさん
2010/11/13(土) 12:00:49ID:???縛られてなんかないよ。
PHPでもやろうと思えばできる、やってもいいしやらなくてもいい、
ただ元々の設計思想が違うんだからJavaと同じようにできるわけがない、だからPHPがどうとかJavaならどうとかいう議論自体が無意味。
むしろ、OOP的に書かねばならないという方が凝り固まっているよ。
>>690
明言されてたら無条件に従うのか?w
思想時って何かよく分からないけど、上述の通りスタートが違うんだから仕様が違って当然。
カオスになって付いていけない?Perl的な書き方もC的な書き方もJava的な書き方もできるようにしましょう、ってだけの簡単な話だと思うが。
別に使うか使わないかはユーザの自由だよ。
0692nobodyさん
2010/11/13(土) 12:22:25ID:???議論の価値そのものを否定してるわけではないだろうし
そうしてる間にも俺はオナ禁してるわけで
0694nobodyさん
2010/11/13(土) 14:09:27ID:YYAlO5qeそんなことよりzendの話しようぜ。
>>686 たいぶ間違ってた、みんなごめん。ZendRegistry::set()/get()も簡単で悪くないと思うけど。
リソースが保存されるのはブートストラップの中にあるZend_Registryインスタンスだった。
だからアクションでtestリソースを得るには、
$this->getInvokeArg('bootstrap')->getResource('test')->foo
モデルとか外部から呼ぶときは、やっぱフロントコントローラのインスタンスからブートストラップを
とってくんのかな・・なんかまわりくどいような。
quickstartでDBアダプターどうなってんだろうと思って調べたら・・・!なんとで、Zend_Db_Tableの
staticなクラス変数にデフォルト値としてアダプタのインスタンスを突っ込んでたw
たしかブートストラップのリソースプラグインあたり
0695nobodyさん
2010/11/13(土) 17:25:56ID:YYAlO5qeZend_Applicationを使うときの話です。
リソースプラグインを書かず、一般に俺々リソースを注入するには
まず application.ini に
oreore.foo = bar
Bootstrapで、
protected function _initOreore()
{
$oreore = new Oreore($this->getOption('oreore'));
//または
$oreore = new Zend_Config($this->getOption('oreore'));
//または
$oreore = $this->getOption('oreore');
// または
Oreore::setDefaultOptions($this->getOption('oreore'));
return $oreore;
}
アクションコントローラで、
$this->getInvokeArg('bootstrap')->getResource('oreore')->foo
モデルで使うには、
Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('oreore')->foo
またはアクションコントローラでモデルをnewするときに、
$this-_oremodel = new Oremodel(
$this->getInvokeArg('bootstrap')->getResource('oreore')
);
0697nobodyさん
2010/11/13(土) 17:30:24ID:???むしろ、フレームワークって凝り固めてブレを減らすためのツールじゃないの?
0698nobodyさん
2010/11/13(土) 18:43:11ID:???リードオンリーなら2番目の
return new Zend_Config($this->getOption('oreore'));
禿げしく推奨
0699nobodyさん
2010/11/13(土) 21:54:53ID:???検証を行うアクションを別にするとどうもしっくり来ない
検証エラーがあった場合に表示させることを考えると同じメソッドにした方が楽だけどそのへんどう?
0700nobodyさん
2010/11/14(日) 12:36:29ID:cYG57qWr0702nobodyさん
2010/11/14(日) 21:38:53ID:???$this->bootstrap('Request');
がなぜ使えないという事を聞いてるんですか?
普通に $_GET や $_POST 使えばいいのでは
0706nobodyさん
2010/11/15(月) 16:55:25ID:5FHMT34S最後にデータベースに格納したauto_increment_idを取得する場合、
last_insert_id()に値する関数はありますか?
(ちなみにZend_Dbを使っております)
0707nobodyさん
2010/11/15(月) 17:07:49ID:???こんなふうに DbTable でやっています。
$this->insert($data);
return $this->_db->lastInsertId();
0708nobodyさん
2010/11/15(月) 19:35:02ID:tul9B6Yrエラーの質問ですが
An error occurred
Application error
と出てエラー内容が出ないのですが、どこで設定できるのでしょうか
宜しくお願いします
0709nobodyさん
2010/11/15(月) 22:49:00ID:???insertの戻り値でもプライマリキー取れるよ。
>>707
http://framework.zend.com/manual/ja/learning.quickstart.create-project.html
Configurationの項目見る、環境変数はhtaccessで設定するようになってたと思う
0710nobodyさん
2010/11/16(火) 07:53:24ID:Rh5mS6i1あちがとうできました!
お陰でエラーの原因を突き止めやすくなりました
0711nobodyさん
2010/11/16(火) 09:45:32ID:???.htaccessかhttpd.confに
SetEnv APPLICATION_ENV development
0713nobodyさん
2010/11/19(金) 19:11:59ID:???該当モジュールにルーティングされようとなかろうと、
常に全モジュール初期化されるって仕様はどうなの。
モジュール別にPlugin動かしたりしたいのにわけわからなくなるだろ・・・
意味なくね?
0714nobodyさん
2010/11/19(金) 19:21:11ID:???豪にイラズンバゴウに従え。
0715nobodyさん
2010/11/19(金) 21:29:39ID:???というかZend_Controller系全般が微妙
0716nobodyさん
2010/11/21(日) 15:42:08ID:???亀ですまんが、モデルからFrontController参照するのは筋が悪いと思う。
モデルの単体テストが難しくなる。
サービスロケータでも作ってモデルインスタンス取得を初期化し、
そこでセットしてあげるのがいいんじゃないかな。
単体テスト時はsetUpでセットしてあげれば良いし、
モックをセットするようなことも簡単になる。
0717nobodyさん
2010/11/22(月) 11:29:12ID:???だいたいこうやっときゃ齟齬ないよってのが知りたいだけなんだけど。
たしかにモデルからFrontController参照するのは都合悪そうですな。
やっぱモデルのコンストラクタに必要なリソースを入れるのが普通ですかな。
0718nobodyさん
2010/11/22(月) 16:21:21ID:???Bootstrapでリクエストオブジェクトを使うには、自分でリソース化しなきゃだめ。
やり方はリファレンスガイドのZend_Applicationあたり参照。
リクエストオブジェクトってリソースって扱いじゃないみたい。
フロントコントローラで作られて、ルーター、ディスパッチャやコントローラーで共有してるって感じ。
0719nobodyさん
2010/11/24(水) 15:59:17ID:???htmlやjavascript並にちゃんと表示されて動けばいいジャンで終わってるし。
0720nobodyさん
2010/11/24(水) 16:08:32ID:???どっかに日本語で講義してるサイトとかあればいいなぁ
0721nobodyさん
2010/11/25(木) 23:18:34ID:???シングルトンだと思ってたらinitが何度も呼ばれてたりしてよくわからん。。
0722nobodyさん
2010/11/27(土) 01:59:15ID:???0723nobodyさん
2010/11/27(土) 15:01:11ID:PanI73UWpublic function init(){
echo $this->view->render('index/header.phtml');
exit();
}
正しくheader.phtmlは出力されるのですが、
$this->_helper->layout->header =$this->view->render('index/header.phtml');
として、
レイアウトスクリプトの中で、
<?php echo $this->layout()->header; ?>
としても何も出力されません。
なぜ出力されないのでしょうか?
0724nobodyさん
2010/11/27(土) 15:23:52ID:???0725nobodyさん
2010/11/27(土) 15:38:07ID:PanI73UWしかし、何も表示されないです・・・・。
0726nobodyさん
2010/11/27(土) 23:57:44ID:???<?php echo $this->header; ?>
0728nobodyさん
2010/11/29(月) 22:14:24ID:???基底クラスからコントローラー付きの_forwardが使えないのって仕様なんでしょうか?バグなんでしょうか?
require_once APPLICATION_PATH . '/controllers/AbstractController.php';
class IndexController extends AbstractController
{
public function adultAction()
{
die("adult");
}}
require_once APPLICATION_PATH . '/controllers/AbstractController.php';
class TestController extends AbstractController
{
public function init()
{
$this->setup();
}
public function indexAction()
{
// action body
}}
class AbstractController extends Zend_Controller_Action
{
protected function setup()
{
// $this->_forward("adult", "index");
$this->_forward("adult", "index");
//$this->_redirect("/index/adult");
}}
0729nobodyさん
2010/11/30(火) 10:35:10ID:???_forwardはinitじゃなくてpreDispatchで使う仕様。
無駄を省くためわざとそうなってんのかな。
0730nobodyさん
2010/11/30(火) 15:54:28ID:???そこまでして…という気がしなくもなくなってきたんですがまあせっかくなんで。
[command-line : production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
phpSettings.error_repotring = -1
phpSettings.log_errors = 1
resources.frontController.throwExceptions = 1
resources.frontController.noErrorHandler = 1
resources.frontController.noViewRenderer = 1
resources.frontController.disableOutputBuffering = 1
resources.layout.layoutPath =
resources.layout.layout =
↑残念ながらiniの値はunsetすることができずlayoutは作られてしまう。
どこかでdisableLayout()する必要がある。
あとはindex.phpのようなやつから以下のようにアプリケーション起動
My_は空っぽのやつを作る必要がある。たしかレスポンスのsendHeaders()は空メソッドでオーバーライド
Zend_Layout::startMvc()->disableLayout();
$application->bootstrap()
->getBootstrap()->getResource('FrontController')
->setRequest(new Zend_Controller_Request_Simple($action, $controller, NULL, $params))
->setRouter(new My_ZendControllerRouterRouteCli())
->setResponse(new My_ZendControllerResponseCli());
$application->run();
0731nobodyさん
2010/11/30(火) 16:28:36ID:???既存のアプリケーションのリソースやコントローラーを利用して
コマンドラインからほげほげするというものです。
0733728
2010/12/03(金) 19:24:14ID:zaEZnwnp0734nobodyさん
2010/12/03(金) 19:48:49ID:???0735nobodyさん
2010/12/03(金) 20:39:31ID:???0736nobodyさん
2010/12/04(土) 10:56:51ID:???zf固有の質問でなくて申し訳ないが、WEBアプリの一般的なロジックとして、
投稿時に投稿内容と投稿者キーをDBに挿入する為には投稿者キーはcookieで保持し続けるのだろうか?
0737nobodyさん
2010/12/04(土) 12:26:29ID:???■ このスレッドは過去ログ倉庫に格納されています