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/
0552nobodyさん
2010/10/23(土) 00:37:26ID:???deleteActionの最後で_foward()か_redirect()すればいい。
画面を描画したくないなら、viewHelperを無効にすればいい。
http://framework.zend.com/manual/ja/zend.controller.action.html
0553nobodyさん
2010/10/23(土) 00:50:00ID:???>>543
マニュアル読んで気がついたが、
「自分のウェブアプリケーション用に便利な機能を実装していく一方で、
同じような前処理やちょっとした処理をあちこちのコントローラで書いているといったことはありませんか?
そのような場合は、Zend_Controller_Action を継承した共通基底コントローラクラスを作成し、
共通処理をそこにまとめていくようにしましょう。 」
と明記されてるね。
http://framework.zend.com/manual/ja/zend.controller.action.html
0554nobodyさん
2010/10/23(土) 02:16:34ID:???>無かったらユーザがActionだけ書いて動くわけないでしょ
動く。ルーティングを行う為の基底コントローラ(ZFではDispatcher)側の実装の問題だ。
MVCの考え方とやらに従うのであれば、Action以外にもCに実装するべきロジックは多々ある。
それを基底クラスに書くのか、別クラスに書くのか、その実装方法自体はMVCの思想には含まれていない。
0556nobodyさん
2010/10/23(土) 07:14:23ID:???ある程度はキャッシュされるとしても体感しない程度に重くなってる?
0558nobodyさん
2010/10/23(土) 10:58:26ID:???だからCに関するロジックであれば、Zend_Controller_Actionに実装しようが、Dispatcherに実装しようが、他のクラスに実装しようが、
MVC思想とは関係無いんで >>540 の発言の意味がわからねーんだわ。
0559nobodyさん
2010/10/23(土) 11:12:25ID:???>>無かったらユーザがActionだけ書いて動くわけないでしょ
>動く。ルーティングを行う為の基底コントローラ(ZFではDispatcher)側の実装の問題だ。
Cに関するロジックが無くても動くってどういうこと?
0560nobodyさん
2010/10/23(土) 11:31:06ID:???Zend_Ctonroller_ActionにAction以外のメソッドが無くても、
Dispatcherなり、どこかしらに実装しておけば動くって事。
>>540ではAction以外を定義するのはMVCに反すると、
意味不明な書き込みがあったが、Cに関するロジックであれば何処に書こうが何ら問題は無い。
むしろ共有ロジックはActionクラスに書くことをZFは推奨(>>553)している。
0561nobodyさん
2010/10/23(土) 11:56:02ID:???>Zend_Ctonroller_ActionにAction以外のメソッドが無くても、
Zend_Controller_Actionには_forwardや_getParamや_redirectなど
たくさんAction以外のメソッドがあるように見えるが・・・?
0563nobodyさん
2010/10/23(土) 18:28:37ID:???バイトコードキャッシュとか使ってない環境だと
どのくらい影響あるんだろうね。
PHPでもJavaみたいにInterface多用して設計したいけど、
実行時の無駄な処理が気になる。
本番環境ではInterfaceのチェック処理を
無視する設定とかあるのかね?
ZFでも結構多用されてるってことは、ほとんど影響ないのかな?
0565nobodyさん
2010/10/23(土) 19:07:53ID:???君たち話がかみ合ってない。
要はZend_Ctonroller_Action継承した基底Controller作って、
共通の処理はそこに実装。
※出来ればinit()やらpreDispatch()の中だけで済ませる
それを継承した各Controllerで個別に呼び出したい処理は
ActionHelper作る。
でいいんじゃない?
オーバーライド用に容易されてるメソッド以外に、
各ControllerでAction以外のメソッド書かないといけない必要性って
ほとんどないような。手っ取り早いけど。
0566nobodyさん
2010/10/23(土) 19:56:33ID:???ヘルパーブローカを使うとPDTでコード補完出来ないのが不便なんだよなぁ、
どこかしらに @return アノテーション付でgetter定義しておかないとならんし・・・
自分の場合、
プロジェクト基底コントローラ
→ アプリケーション基底コントローラ
→ モジュール基底コントローラ
をそれぞれ継承して作っておいて、
Controllerに共通プロパティやショートカットメソッド定義してるわ。
0567nobodyさん
2010/10/23(土) 20:19:28ID:???>各ControllerでAction以外のメソッド書かないといけない必要性って
>ほとんどないような。手っ取り早いけど。
Controller固有のロジックやプロパティを外部化する必要性もほとんど無いからね
臨機応変に最適な手法を取ればいいと思うよ
無闇に肥大化させるのは好ましくないけれど
将来Zend_Controller_Actionと競合するかもしれないという理由で
実装コストを上げてしまうのは同意し辛いな
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:???難しく考えなくていいよ。
コントローラにnikkiValidateメソッドを作って、
nikki_addとnikki_rewriteから呼び出せばいい。
もしそれが気持ち悪いのであれば、Nikkiクラスでも作るなりして、共通処理をまとめればいい。
0573nobodyさん
2010/10/30(土) 15:57:20ID:???0574nobodyさん
2010/10/30(土) 16:12:06ID:???不明瞭な書き方するからいけないんだよね。
モデルに書けそうなロジックは全部モデルに記述するように試みればまず間違いない。
0575nobodyさん
2010/10/30(土) 16:22:23ID:???汎用性とか徹底したMVCとか考えるとキリが無い。
要はケースバイケース。
コストに見合った実装すればいいよ。
RDBだからとテーブルを無闇に極限まで正規化しないだろう?
0576nobodyさん
2010/10/30(土) 18:06:00ID:???いやまあ、そうなんだけど、そういうと馬鹿はコントローラに全部書いちゃうから。
コントローラに書くことなんてほぼ無いのに。
0577nobodyさん
2010/10/30(土) 18:44:20ID:CCVX4Qsqおおー、ありがとうございます。
そうですね!共通利用するんだから両アクションから呼び出せばいいんだ
なんで思いつかなかったかなー
ありがとうございました
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:???0583nobodyさん
2010/10/31(日) 04:11:44ID:???オブジェクト指向的に間違いなわけで
0584nobodyさん
2010/10/31(日) 04:36:27ID:???OOP的にも、MVC的にも問題無いと思うよ。
絶対やらんけど。
class MVC
{
public function controller() {}
public function model() {}
public function view() {}
}
0585nobodyさん
2010/10/31(日) 04:46:01ID:???自動車をオブジェクト指向で表す場合に
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:???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:???0597nobodyさん
2010/11/01(月) 20:53:23ID:???0598nobodyさん
2010/11/01(月) 21:21:37ID:???0599nobodyさん
2010/11/01(月) 22:07:25ID:???0600nobodyさん
2010/11/01(月) 23:04:15ID:EIHh7aSpどの部分で、振り分け処理を記載してらいいですかね?
0601nobodyさん
2010/11/01(月) 23:40:28ID:???0602nobodyさん
2010/11/02(火) 00:02:44ID:yTnsmEW2ipで、振り分けようかと思ってるんですが
PEAR::Net_IPv4を使って、Bootstrap.phpで使用していいか悩んでます。
その後の、viewの振り分けもわからないですけ。。。
0603nobodyさん
2010/11/02(火) 00:03:15ID:???パソコンはphtml野間まで、携帯はhtmlに設定。
同一アドレスで同一サービスが提供可能に。
0604nobodyさん
2010/11/02(火) 00:47:33ID:???Bootstrapで携帯かPCかを判別して、
何らかの方法(FrontController、Request、Registry、etc)でControllerに渡せばいい。
振り分け方法はケースバイケースだが、面倒でなければ携帯用のViewクラスを用意するのが望ましい。
>>603
何故に拡張子?
テンプレートディレクトリで切り分けた方が良いんじゃね?
0605nobodyさん
2010/11/02(火) 01:07:52ID:???0606nobodyさん
2010/11/02(火) 01:28:32ID:???状況に応じて設定を変更したりする為のものだからな・・・
可能なら MobileBootstrap.php を作って、
リクエストを受け取る index.php でip判別して、Bootstrap自体を振り分ける方法もありかと。
0607nobodyさん
2010/11/02(火) 01:44:20ID:???表示内容とか含めてPCとモバイルでコントローラが同一でいいなら
>>603の方法を使うと思う。
0608nobodyさん
2010/11/02(火) 02:22:33ID:???0609nobodyさん
2010/11/02(火) 11:12:23ID:???今見たらinit()でこんな事してた
$this->_helper->layout->setLayout('mobile');
$this->view->setScriptPath(APPLICATION_PATH.'/views/scripts-mobile');
0610nobodyさん
2010/11/02(火) 11:43:50ID:???それが一番美しいやりかたかと思う。
ただしinitは複数回呼ばれる可能性があるので、気になる人は初期化済か否かのチェックをいれるなりした方が良い。
0611609
2010/11/02(火) 15:59:56ID:???誰も返事してくれてないしw なんかちょっと恥ずかしいぞ。 >>264
bootstrapでレイアウトを手動初期化する方法も書いてある
0612nobodyさん
2010/11/03(水) 01:33:55ID:???>>600
つZend_Http_UserAgent
いいタイミングw
0613nobodyさん
2010/11/03(水) 04:59:30ID:???クラス名も微妙に輪っか利辛いなぁ・・
Zend_Mobile_Deviceとかで良かったんじゃね?
0614nobodyさん
2010/11/03(水) 07:58:18ID:???0615nobodyさん
2010/11/03(水) 11:22:15ID:???hibernateやiBatis, S2Daoのような標準的なORMはいくつかあるのでしょうか?
0616nobodyさん
2010/11/03(水) 11:26:43ID:???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:???0622nobodyさん
2010/11/03(水) 12:52:45ID:???標準的が何を示すのか不明だがZFならZend_Db_Tableあたりだ。
0623nobodyさん
2010/11/03(水) 13:06:02ID:???0624nobodyさん
2010/11/04(木) 00:39:38ID:1iy2rlVwlocalhost/diary/edit/y/2010/m/11/d/1 って形で入力画面(editアクション)を開くとします。
そうすると、まずこの時点でパラメータが日付にふさわしい型か
パラメータチェックする必要があると思うんですが、その処理を外部化したいんです。
↓こんな感じで(diaryコントローラ)
public function init(){
require('paramChk.func.php');//検証機能の外部化
}
public function editAction(){
$param=$this->getRequest()->getUserParam();
$checkAry = array(
array($param['y']=>array('required', 'numeric'),//パラメータyが必須かつ数値かチェック
array($param['m']=>array('required', 'numeric'),
array($param['d']=>array('required', 'numeric')
);
paramChk($checkAry);
}
このとき、実際の検証用外部関数paramChk()の中でエラー(不正の発見)があったとき、
エラーコントローラにリダイレクトさせたいんですが
function paramChk($ary){
//チェック処理省略
if($err) return $this->_redirect('/error/pt/paramerr');
}
とするとエラーが起きます(Using $this when not in object context in /var/www/application/inc/paramChk.func.php)
どうしたらいいんでしょうか? 検証処理は外部化しつつ検証エラーの時のリダイレクトまで実装したいです。
意見よろしくお願いします
0625nobodyさん
2010/11/04(木) 00:54:38ID:???0626nobodyさん
2010/11/04(木) 01:10:04ID:???・editAction側でリダイレクトさせる方法
if (!paramChk($checkAry)) $this->_redirect('/error/pt/paramerr');
・paramChk側でリダイレクトさせる方法1
paramChk($checkAry, $this); // $this(コントローラを引数で渡す)
function paramChk($ary, $controller){};
多分、前者の方が好ましい。
(paramChkもグローバル関数では無く、何らかのクラスに隠蔽すると尚良い)
0627nobodyさん
2010/11/04(木) 01:31:00ID:???0628nobodyさん
2010/11/04(木) 02:11:43ID:???0629624
2010/11/04(木) 11:44:09ID:???ありがとうございます。
なるほど、確かにエラーの時にfalse返してコントローラでリダイレクトの方が
あとあと便利そうですね!
「if (!paramChk($checkAry)) 」こういうの思いつかないのでホント聞いて良かったです
>paramChkもグローバル関数では無く、何らかのクラスに隠蔽すると尚良い
これはなぜですか?
0630nobodyさん
2010/11/04(木) 16:29:59ID:???>paramChkもグローバル関数では無く、何らかのクラスに隠蔽すると尚良い
>これはなぜですか?
他にparamChkという関数が存在していると不具合が出ちゃうからね。
値を検証するクラスを別に作り、必須や数値チェックするのもそちらに外部化する方が見通し良くなると思うよ。
以下簡単な例
・Controller側
$diary = new Diary($param['y'], $param['m'], $param['d']);
if ($diary->isValid()) $this->_redirect('/error/pt/paramerr');
・Diaryを処理するクラス
class Diary{
private $_param = array();
public function __construct($y, $m, $d) {
$this->_param['y'] = $y;
$this->_param['m'] = $m;
$this->_param['d'] = $d;
}
public function isValid() {
// $this->_param に正常な値が入っているかチェック
return true;
}
}
0631nobodyさん
2010/11/04(木) 20:13:18ID:???アクション内で
$this->reqParams('y', 'm', 'd');
基底コントローラ内で
public function reqParam() {
foreach (func_get_args() as $arg) {
if (!$this->hasParam($arg)) {
throws Hogehoge_Parameter_Exception();
}
}
みたいなことやってたよ
0632nobodyさん
2010/11/04(木) 21:06:11ID:???func_get_argsとか、array渡してextractとかやって
可変引数を扱うのにいまだに馴染めないんだけど
これらってバッドノウハウじゃないのかな?
0633nobodyさん
2010/11/04(木) 21:17:13ID:???可変引数はPHPにおいてはバッドノウハウでは無く、割と一般的なテクニックかと。
個人的にはfung_get_args()よりarray渡しを使うけど。
#extractは使う場面は思い浮かばない。
0634nobodyさん
2010/11/04(木) 21:18:32ID:???さすがにPHPの経験不足が露呈しすぎだぞ
0635nobodyさん
2010/11/04(木) 22:32:56ID:???というのも、 >>632 で書いたのもスレチなわけではなくて
ZFのViewHelperのForm**** 見てたらどれも
public function form****($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n")
{
$info = $this->_getInfo($name, $value, $attribs);
extract($info); // name, value, attribs, options, listsep, disable
みたいになってて、こんなのどうやって呼び出すんだよ…って思ったんだよ。。
こういうのってPHPでは無茶なやり方ではないのかな?
まあ、フレームワークでやってるってことは一般的なのか・・・
0636nobodyさん
2010/11/04(木) 23:16:22ID:???引数が限られているなら危険性もないし、逐一コード書くより統一性が取れて開発効率も上がるから使ってるんだろう
0637624
2010/11/05(金) 01:38:03ID:FPhbRDb9>他にparamChkという関数が存在していると不具合が出ちゃうから
なるほど、納得出来ました。paramChkクラスを作ってみます。
>if ($diary->isValid()) $this->_redirect('/error/pt/paramerr');
これは、ifの()の中ってこれで良いんですか?
trueを返す条件でエラーのリダイレクトにならないですか?
自分凄い勘違いしてるのかな
他の人の意見も勉強してみます
ありがとうございました
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:???■ このスレッドは過去ログ倉庫に格納されています