トップページphp
1001コメント368KB

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/
0521nobodyさん2010/10/19(火) 09:50:18ID:???
皆、デフォルトコントローラー群にprefixってつけてる?

IndexController

と書くところを

ModuleName_IndexController
ProjectName_IndexController

のように冗長に。
PDTで複数プロジェクト編集する時にクラス名が被るとコード補完が厄介なんだ・・・
何か上手い方法ないかね
0522nobodyさん2010/10/19(火) 12:00:40ID:???
>>515
すまん、ポインタを見間違えた
0523nobodyさん2010/10/19(火) 15:08:51ID:???
>>521
Controllerをコード補完で呼び出すことなんてあるか?
0524nobodyさん2010/10/19(火) 17:58:33ID:???
>>523
コントローラ内でメソッド呼び出すとき、
$this->hogeXXXで保管しようとしたら、
他のプロジェクトの同名コントローラのメソッドがでてきちゃうんじゃね?
0525nobodyさん2010/10/19(火) 19:56:12ID:???
>>524
ControllerにAction以外のメソッド書くってこと?
private でも他のメソッド出てきちゃうんだっけ?
0526nobodyさん2010/10/19(火) 22:05:23ID:zJOQfrg+
>>463

Ver.1.10.8のZend_OpenId_Consumerの733行目に『/* TODO: OpenID 2.0 (7.3) XRI and Yadis discovery */』があるよ。
やっぱり、mixiのOpenIDだめだった。
0527nobodyさん2010/10/19(火) 22:19:07ID:???
2.0から対応するんだと思う
0528nobodyさん2010/10/19(火) 23:13:44ID:???
>>525
コントローラ固有だったり、サイト全体で使うようなショートカットメソッドを登録する事があるんよ。
$this->log(); とか $this->getXxx() みたいなのを・・・
privateにしててもクラス名が同じだと補完対象にされてしまう。

コントローラにアクション以外書くのってまずい?
0529nobodyさん2010/10/19(火) 23:28:47ID:???
別に君がそう書きたければそれでいいと思う
0530nobodyさん2010/10/20(水) 04:30:26ID:???
$this->log()はログの発行元が追跡しやすくて良い
0531nobodyさん2010/10/20(水) 12:10:17ID:???
アクションコントローラーにActionメソッド以外のメソッドって
結構いろんなサンプルとかでやられてるよな
0532nobodyさん2010/10/20(水) 13:31:25ID:???
privateメソッド限定なら補完の必要性もあんまりないから
放置したほうがいいと思う。

$thisで同名他クラスのメソッド出てきちゃうのは
そのうちPDTのほうで対応されそう。
heliosで親クラスの補完が変だったのもSR1で改善されたし。
05335092010/10/20(水) 17:08:16ID:goNec+dl
>>515
質問したの俺だよ、答えてくれてありがとう
サイトの運営ってプログラム書ければ良いワケじゃないんだね、
わかってたけどトラブル発生時の対応とか考えると大変だわ
みんなはプログラム書く以外にシステム設計とかもやってるの?

>アフィリタグ踏んでくるアクセスだからDB書き込みやらんとならん

これってアクセス解析のためだよね?
うーむ、勉強になったよ
0534nobodyさん2010/10/21(木) 01:30:25ID:???
>>531
>>532
Zend_Controller_Actionのコード見る限り、
普遍的なメソッドはController自体に登録してあるしね。

0535nobodyさん2010/10/21(木) 04:34:34ID:???
>>534
どんなメソッド?
0536nobodyさん2010/10/21(木) 05:14:21ID:???
>>535
_fowerdとか_redirectとか他にも色々、てかコード読めよw

Actinは xxxAction って命名規則があるんだし、
ActionCtonroller = Actionのみを記述するものでは無いってこった
0537nobodyさん2010/10/21(木) 05:18:53ID:???
>>536
それがなかったらコントローラじゃないだろ?何言ってんだ
0538nobodyさん2010/10/21(木) 07:16:01ID:???
>>537
別に?無くてもコントローラとしては機能するよ。

俺がいいたいのは、コントローラにはアクション以外定義するのはおかしいなんて事は無い。
それだけだ。
0539nobodyさん2010/10/21(木) 07:23:46ID:???
ああ、MVCのコントローラとZend_Controllerの実装の話が噛み合ってないわけね
0540nobodyさん2010/10/21(木) 07:32:49ID:???
ついでに言うとそれらはルーティングを行うための基底コントローラに実装されているメソッドであって
自分がそれを継承して作るコントローラに、アクション以外の(コントローラから逸脱する)ロジックなり処理なりを実装するのは
MVCの考えに反するよ。
てかZend_Controllerを見たらAction以外のメソッドがあるから定義しておかしくないなんてのは余りにも短絡すぎ
無かったらユーザがActionだけ書いて動くわけないでしょ
0541nobodyさん2010/10/21(木) 10:18:49ID:???
きっちりしたのはzendに任せるとして
ユーザは好きなように使えばいいのさ
0542nobodyさん2010/10/21(木) 11:09:59ID:???
>>539
MVCの思想としても_fowardをアクションコントローラに実装する必要は無い。
例えばZFで言えばヘルパでもいい。

>>540
最初から全てを書くとは誰もいってなくね?
Action間で共有するメソッドやログ出力ショートカット程度しか言われてない気が。

0543nobodyさん2010/10/21(木) 14:12:10ID:???
>>536

各ControllerでActin以外に独自メソッドいろいろ書いてたら、
将来的なZFのバージョンアップで拡張されたときに
不意なオーバーライドしちゃって動かなくなりそうで怖い。

間に1サブクラスかませてそこでやるならまだしも。
0544nobodyさん2010/10/21(木) 15:03:42ID:???
>>543
Zenc_Controller_Actionを継承した基底コントローラは最低限用意しておく
各コントローラは基底コントローラを継承しておく

全体で必要なら基底コントローラ、
コントローラ固有ならそのコントローラに書く

という感じかな。

オーバーライドしてしまって動作しなくなるケースって相当希だと思う。
0545nobodyさん2010/10/21(木) 19:36:11ID:???
PHPにもJavaみたいにアノテーションで@Overrideとか指定出来れば良いのにね。
0546nobodyさん2010/10/22(金) 01:09:01ID:???
そこまで厳密にやるならもうJavaか.NETやれよみたいな話になるんじゃないの?
0547nobodyさん2010/10/22(金) 01:53:39ID:???
>>545
アノテーション自体は定義出来るし
ランタイム時にReflectionクラスで取得する事も出来るので
必要だと思うなら自分で作ればいい


作ってるうちに >>546 と同じ答えにたどり着くと思うがw
0548nobodyさん2010/10/22(金) 13:26:45ID:???
いやいや、そこまでの話じゃないよ。

単に @deprecated とかPDTでも対応してて便利だし、
そのレベルであれば良いなあって。
0549nobodyさん2010/10/22(金) 15:12:14ID:qwjMjkx8
dbの登録データのデリートアクションみたいに、実際には画面を表示しない場合って
(削除処理がされたら完了画面にリダイレクトする)
viewの設定をどうしたら良いの?

phpエラー(warning)を吐かれてるのを止めたいんだけど…
ルーティングで対処するのか、それともdeleteAction()の中で何か書くのかわからないです

routingは以下のようになってます

routes.scheDelete.route= "/admin/schedule/delete/*"
routes.scheDelete.defaults.module= "admin"
routes.scheDelete.defaults.controller= "Schedule"
routes.scheDelete.defaults.action= "delete"
routes.scheDelete.type= "Zend_Controller_Router_Route"

回答お願いしますー
05505492010/10/22(金) 15:13:38ID:qwjMjkx8
あ、すみません。情報がたりませんでした
どうせ画面の表示はないのだから/schedule/delete.tplを用意していないのです。

0551nobodyさん2010/10/23(土) 00:01:07ID:???
>>549
マニュアルに書いてあるよ
0552nobodyさん2010/10/23(土) 00:37:26ID:???
>>549
deleteActionの最後で_foward()か_redirect()すればいい。

画面を描画したくないなら、viewHelperを無効にすればいい。
http://framework.zend.com/manual/ja/zend.controller.action.html
0553nobodyさん2010/10/23(土) 00:50:00ID:???
>>540
>>543
マニュアル読んで気がついたが、

「自分のウェブアプリケーション用に便利な機能を実装していく一方で、
同じような前処理やちょっとした処理をあちこちのコントローラで書いているといったことはありませんか?
そのような場合は、Zend_Controller_Action を継承した共通基底コントローラクラスを作成し、
共通処理をそこにまとめていくようにしましょう。 」

と明記されてるね。
http://framework.zend.com/manual/ja/zend.controller.action.html
0554nobodyさん2010/10/23(土) 02:16:34ID:???
>>540
>無かったらユーザがActionだけ書いて動くわけないでしょ
動く。ルーティングを行う為の基底コントローラ(ZFではDispatcher)側の実装の問題だ。

MVCの考え方とやらに従うのであれば、Action以外にもCに実装するべきロジックは多々ある。
それを基底クラスに書くのか、別クラスに書くのか、その実装方法自体はMVCの思想には含まれていない。
05555492010/10/23(土) 02:37:46ID:???
>>551,552
お恥ずかしい。ありがとうございました
0556nobodyさん2010/10/23(土) 07:14:23ID:???
継承ってすればするほど重くなるのかな?
ある程度はキャッシュされるとしても体感しない程度に重くなってる?
0557nobodyさん2010/10/23(土) 10:09:58ID:???
>>554
Dispatcherはコントローラだろ 何言ってんだ
0558nobodyさん2010/10/23(土) 10:58:26ID:???
>>557
だからCに関するロジックであれば、Zend_Controller_Actionに実装しようが、Dispatcherに実装しようが、他のクラスに実装しようが、
MVC思想とは関係無いんで >>540 の発言の意味がわからねーんだわ。
0559nobodyさん2010/10/23(土) 11:12:25ID:???
>>558
>>無かったらユーザがActionだけ書いて動くわけないでしょ
>動く。ルーティングを行う為の基底コントローラ(ZFではDispatcher)側の実装の問題だ。

Cに関するロジックが無くても動くってどういうこと?

0560nobodyさん2010/10/23(土) 11:31:06ID:???
>>559
Zend_Ctonroller_ActionにAction以外のメソッドが無くても、
Dispatcherなり、どこかしらに実装しておけば動くって事。

>>540ではAction以外を定義するのはMVCに反すると、
意味不明な書き込みがあったが、Cに関するロジックであれば何処に書こうが何ら問題は無い。

むしろ共有ロジックはActionクラスに書くことをZFは推奨(>>553)している。
0561nobodyさん2010/10/23(土) 11:56:02ID:???
>>560
>Zend_Ctonroller_ActionにAction以外のメソッドが無くても、

Zend_Controller_Actionには_forwardや_getParamや_redirectなど
たくさんAction以外のメソッドがあるように見えるが・・・?
0562nobodyさん2010/10/23(土) 12:03:59ID:???
>>561
話ループしてるし何が言いたいかわからん
>>536 からの流れ読め
0563nobodyさん2010/10/23(土) 18:28:37ID:???
>>556
バイトコードキャッシュとか使ってない環境だと
どのくらい影響あるんだろうね。

PHPでもJavaみたいにInterface多用して設計したいけど、
実行時の無駄な処理が気になる。

本番環境ではInterfaceのチェック処理を
無視する設定とかあるのかね?

ZFでも結構多用されてるってことは、ほとんど影響ないのかな?
0564nobodyさん2010/10/23(土) 18:33:37ID:???
>>562
自分の誤りをごまかさないでほしい
0565nobodyさん2010/10/23(土) 19:07:53ID:???
>>562 >>564

君たち話がかみ合ってない。

要はZend_Ctonroller_Action継承した基底Controller作って、
共通の処理はそこに実装。
※出来ればinit()やらpreDispatch()の中だけで済ませる
それを継承した各Controllerで個別に呼び出したい処理は
ActionHelper作る。

でいいんじゃない?
オーバーライド用に容易されてるメソッド以外に、
各ControllerでAction以外のメソッド書かないといけない必要性って
ほとんどないような。手っ取り早いけど。
0566nobodyさん2010/10/23(土) 19:56:33ID:???
>>565
ヘルパーブローカを使うとPDTでコード補完出来ないのが不便なんだよなぁ、
どこかしらに @return アノテーション付でgetter定義しておかないとならんし・・・

自分の場合、

プロジェクト基底コントローラ
 → アプリケーション基底コントローラ
  → モジュール基底コントローラ

をそれぞれ継承して作っておいて、
Controllerに共通プロパティやショートカットメソッド定義してるわ。
0567nobodyさん2010/10/23(土) 20:19:28ID:???
>>565
>各ControllerでAction以外のメソッド書かないといけない必要性って
>ほとんどないような。手っ取り早いけど。

Controller固有のロジックやプロパティを外部化する必要性もほとんど無いからね
臨機応変に最適な手法を取ればいいと思うよ

無闇に肥大化させるのは好ましくないけれど
将来Zend_Controller_Actionと競合するかもしれないという理由で
実装コストを上げてしまうのは同意し辛いな
0568nobodyさん2010/10/24(日) 00:52:09ID:???
>>563
ベンチで測ってみろよそれくらい
0569nobodyさん2010/10/24(日) 12:51:40ID:???
プラグインからアクションヘルパーを呼ぶ方法ってありますか?
アクションコントローラを作るたびに同じアクションヘルパーを呼ぶ記述書くより
プラグインに共通で書きたいと思ったのでやり方を探しているんですが見つけられません。
0570nobodyさん2010/10/30(土) 15:35:08ID:CCVX4Qsq
各クラス(コントローラ)の中のアクションがありますが、
これを再利用する方法ってないんでしょうか?

というのは、たとえば入力フォームのアクションだったらバリデート処理が書いてるけど
同じようなフォームの時、ほとんど中身変わらないのに同じようなのをもう一つ書くのが面倒なんです
具体的に言うと nikki_addアクションとnikki_rewriteアクションとか。。
新規登録時でも書き換え時でもバリデータは同じだけど、アクションを2つに分けると
中身同じなのにもう一つ書くことになって面倒くさいと…
何か良い方法ないですか?
0571nobodyさん2010/10/30(土) 15:55:15ID:???
バリデート込みのフォーム定義をアクション外に括り出せばいい
0572nobodyさん2010/10/30(土) 15:55:33ID:???
>>570
難しく考えなくていいよ。
コントローラにnikkiValidateメソッドを作って、
nikki_addとnikki_rewriteから呼び出せばいい。

もしそれが気持ち悪いのであれば、Nikkiクラスでも作るなりして、共通処理をまとめればいい。
0573nobodyさん2010/10/30(土) 15:57:20ID:???
アクションにバリデート書くとかMVCの意味なくね?
0574nobodyさん2010/10/30(土) 16:12:06ID:???
MVCの概要を説明する文書がどれもわかりづらいっつーか、
不明瞭な書き方するからいけないんだよね。

モデルに書けそうなロジックは全部モデルに記述するように試みればまず間違いない。
0575nobodyさん2010/10/30(土) 16:22:23ID:???
コントローラ内で局所的にしか使わないようなロジックであれば、まぁいいんでない。
汎用性とか徹底したMVCとか考えるとキリが無い。

要はケースバイケース。
コストに見合った実装すればいいよ。

RDBだからとテーブルを無闇に極限まで正規化しないだろう?
0576nobodyさん2010/10/30(土) 18:06:00ID:???
>>575
いやまあ、そうなんだけど、そういうと馬鹿はコントローラに全部書いちゃうから。
コントローラに書くことなんてほぼ無いのに。
0577nobodyさん2010/10/30(土) 18:44:20ID:CCVX4Qsq
>>571-576
おおー、ありがとうございます。
そうですね!共通利用するんだから両アクションから呼び出せばいいんだ
なんで思いつかなかったかなー
ありがとうございました
0578nobodyさん2010/10/30(土) 23:54:53ID:???
コントローラって名称に毒され過ぎだよね。
極端な例だけど、以下のようにロジックがきっちり分別されていれば、
同クラスだろうが、同ファイルだろうがMVC実装は可能。

class Application
{
public function controller() {}
public function model() {}
public function view() {}
}
0579nobodyさん2010/10/31(日) 00:48:20ID:???
えっ
0580nobodyさん2010/10/31(日) 02:04:35ID:???
デザインパターンに実装方法は定義されてないからね
ファイル、クラス、メソッド、好きな方法で区切ればいい
0581nobodyさん2010/10/31(日) 02:12:58ID:???
お前は何を言ってるんだ
0582nobodyさん2010/10/31(日) 02:23:02ID:???
>>581
何か間違ってた?
0583nobodyさん2010/10/31(日) 04:11:44ID:???
いやそもそも同じクラスに違う目的のものを突っ込むのが
オブジェクト指向的に間違いなわけで
0584nobodyさん2010/10/31(日) 04:36:27ID:???
ああクラス名を MVCにした方が解りやすかったかな。
OOP的にも、MVC的にも問題無いと思うよ。
絶対やらんけど。

class MVC
{
public function controller() {}
public function model() {}
public function view() {}
}

0585nobodyさん2010/10/31(日) 04:46:01ID:???
クラス名がMVCってその時点でもう破綻してるだろw
自動車をオブジェクト指向で表す場合に
EngineWheelStealingってクラス作るようなもんだぞw
0586nobodyさん2010/10/31(日) 04:53:18ID:???
ワロス
0587nobodyさん2010/10/31(日) 05:44:37ID:???
普通は複数の機能が乗るわけでそうなったらどうすんだ?
AMVCとかBMVCってクラスができるのか?
それじゃmodelとcontrollerまで対じゃないと破綻するよな
それともa_controller() b_controller()って増やしていくのか?
0588nobodyさん2010/10/31(日) 13:34:07ID:???
えっ
0589nobodyさん2010/10/31(日) 14:02:42ID:???
例えの話に何ムキになってるの・・・怖い・・・

>>585
Car extends EngineWheelStealing
0590nobodyさん2010/10/31(日) 14:57:07ID:???
・・・はい?w
0591nobodyさん2010/10/31(日) 15:00:09ID:???
>>589
おまえすげーな
スパーハカーだなw
0592nobodyさん2010/10/31(日) 15:04:14ID:???
>>578ってオブジェクト指向もMVCもZendの使い方も一つも解ってないんだろうな
0593nobodyさん2010/10/31(日) 15:04:24ID:???
理解の範疇を超えると煽る事しか出来ないです><
0594nobodyさん2010/10/31(日) 15:10:21ID:???
自分はあんまりオブジェクト指向原理主義者じゃないけど、
is-aとかhas-aとかなんかそういう基本的なところのセンスがとても悪いと思う。
0595nobodyさん2010/10/31(日) 15:10:38ID:???
これはひどい初心者
0596nobodyさん2010/11/01(月) 12:15:19ID:???
class DqnCar extends Car implements AeroParts
0597nobodyさん2010/11/01(月) 20:53:23ID:???
発想は面白いがそれは英語的にもOOP的にも違うなw
0598nobodyさん2010/11/01(月) 21:21:37ID:???
このスレは独創的なオブジェクターが多いなw
0599nobodyさん2010/11/01(月) 22:07:25ID:???
オブジェクト指向っつっても、主観次第で変わるからなぁ・・・
0600nobodyさん2010/11/01(月) 23:04:15ID:EIHh7aSp
zendframeworkで、携帯とPCでviewを分けたい場合
どの部分で、振り分け処理を記載してらいいですかね?
0601nobodyさん2010/11/01(月) 23:40:28ID:???
基底コントローラやinitメソッドからの呼出でいいんじゃない?
0602nobodyさん2010/11/02(火) 00:02:44ID:yTnsmEW2
>601

ipで、振り分けようかと思ってるんですが
PEAR::Net_IPv4を使って、Bootstrap.phpで使用していいか悩んでます。
その後の、viewの振り分けもわからないですけ。。。
0603nobodyさん2010/11/02(火) 00:03:15ID:???
俺は邪道だと言われるかもしれないけど、拡張子を変えてる。
パソコンはphtml野間まで、携帯はhtmlに設定。

同一アドレスで同一サービスが提供可能に。
0604nobodyさん2010/11/02(火) 00:47:33ID:???
>>602
Bootstrapで携帯かPCかを判別して、
何らかの方法(FrontController、Request、Registry、etc)でControllerに渡せばいい。
振り分け方法はケースバイケースだが、面倒でなければ携帯用のViewクラスを用意するのが望ましい。

>>603
何故に拡張子?
テンプレートディレクトリで切り分けた方が良いんじゃね?
0605nobodyさん2010/11/02(火) 01:07:52ID:???
bootstrapなんでもありだな
0606nobodyさん2010/11/02(火) 01:28:32ID:???
本来Bootstrapはアプリケーションを初期化したり、
状況に応じて設定を変更したりする為のものだからな・・・

可能なら MobileBootstrap.php を作って、
リクエストを受け取る index.php でip判別して、Bootstrap自体を振り分ける方法もありかと。
0607nobodyさん2010/11/02(火) 01:44:20ID:???
俺は同じコントローラなのがかなり不便だからコントローラから分けてる。
表示内容とか含めてPCとモバイルでコントローラが同一でいいなら
>>603の方法を使うと思う。
0608nobodyさん2010/11/02(火) 02:22:33ID:???
controllerの親クラス作ってそこでやってるわ俺
0609nobodyさん2010/11/02(火) 11:12:23ID:???
俺もそれだわ、だってPCと携帯で同じアクション使ったりしてるもん。
今見たらinit()でこんな事してた
$this->_helper->layout->setLayout('mobile');
$this->view->setScriptPath(APPLICATION_PATH.'/views/scripts-mobile');
0610nobodyさん2010/11/02(火) 11:43:50ID:???
>>609
それが一番美しいやりかたかと思う。


ただしinitは複数回呼ばれる可能性があるので、気になる人は初期化済か否かのチェックをいれるなりした方が良い。
06116092010/11/02(火) 15:59:56ID:???
よく似たのがあると思ったら、なんと以前このスレに俺が自分で質問してるじゃあないか
誰も返事してくれてないしw なんかちょっと恥ずかしいぞ。 >>264
bootstrapでレイアウトを手動初期化する方法も書いてある
0612nobodyさん2010/11/03(水) 01:33:55ID:???
http://devzone.zend.com/article/12724-Zend-Framework-1.11.0-FINAL-Released

>>600
つZend_Http_UserAgent
いいタイミングw
0613nobodyさん2010/11/03(水) 04:59:30ID:???
Zend_Http_UserAgentってIPアドレス判別とか出来るのかね・・・
クラス名も微妙に輪っか利辛いなぁ・・

Zend_Mobile_Deviceとかで良かったんじゃね?
0614nobodyさん2010/11/03(水) 07:58:18ID:???
IPで判別とか日本ローカルなんだからお前らが作れ
0615nobodyさん2010/11/03(水) 11:22:15ID:???
Java屋です。次案件でzend frameworkを使った開発をするのですが
hibernateやiBatis, S2Daoのような標準的なORMはいくつかあるのでしょうか?
0616nobodyさん2010/11/03(水) 11:26:43ID:???
なんでぐぐらんの?
06176152010/11/03(水) 11:35:27ID:???
>>616
ぐぐってから聞いてる?
自分はぐぐってから書いてるよ。
0618nobodyさん2010/11/03(水) 11:40:14ID:???
じゃそれで分かるじゃん
0619nobodyさん2010/11/03(水) 11:47:12ID:???
ググってわかったら書かないでしょ
0620nobodyさん2010/11/03(水) 12:00:20ID:???
そうかすまんかった。まぁ頑張ってくれ。
0621nobodyさん2010/11/03(水) 12:09:09ID:???
おお。応援ありがとう。頑張るわ
■ このスレッドは過去ログ倉庫に格納されています