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

ZendFrameworkってどうよ?

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/10/07(土) 02:49:15ID:6wQ8r0Dc
ようやくVer.1.0が出るらしいね
これってどうよ?

PHP5に移行したほうがいいのかな
0074nobodyさん2007/02/26(月) 00:52:56ID:???
ZFにMojaviでいうフィルタ実装しようとしたら結構苦労すんね。
プラグインでなんとか出来そうだけど。
0075nobodyさん2007/02/26(月) 01:44:59ID:???
ZFで組んだらZFにあわせて
非publicなら_付けるみたいなダサいコーディングしないと駄目なの?
0076nobodyさん2007/02/26(月) 03:30:35ID:???
カッチリした規約のくせに
オートローダ用意してないのはなんで?
いちいちZend::loadClass()とか書いてられねーっつの
0077nobodyさん2007/02/26(月) 03:37:20ID:???
つーか、Zend::loadClass()とかあるくせに、
ソースではrequire使ってるよな
0078nobodyさん2007/02/26(月) 08:47:24ID:???
>>74
MojaviでいうフィルタがZFでいうプラグインなのかと思ってた
0079nobodyさん2007/02/26(月) 10:16:54ID:???
>>76-77
__autoloadがFWに組み込まれてるとFWにオートローダを強制されてしまう
ZFはあくまでライブラリ集なスタンスだから
phpの__autoloadのような一度定義したら変えようのないメカニズムを
FWをロードしただけで強制的に定義されてしまうと色々と困る事もある

symfonyのようにFW全体で1セットなフルスタックFWなら
__autoloadが組み込まれててもまあいいかと思うけど

つーかZend::loadClassがZFのオートローダだから
function __autoload($class) { Zend::loadClass($class); }
くらい我慢しろ

Zend::loadClassは動的にロードするファイルが
変わるような場面で使うためのもの
ロードする事が必須で静的に名前(パス)が決定しているものは
requireで良い、要は使い分け
0080nobodyさん2007/02/26(月) 17:31:26ID:???
>>78
MojaviのフィルタはpreFilterとpostFilterの二つがセットになってるけど
ZFのプラグインは一カ所のフックに差し込むだけでバーガー状にできない。
まあバーガーが必須でもないからこういう形にしたのかな
0081nobodyさん2007/02/26(月) 22:19:05ID:???
アプリ固有のクラスとか設定ファイルはどこに置く?
/application/models?
/library/?
0082nobodyさん2007/02/26(月) 22:21:40ID:???
Zend:_Sessionに
session_id()を返すgetId()ってメソッドはあるのに
session_name()を返すメソッドがありません。
クッキー使えない環境を想定してリクエストにセッション情報を含めたいんですが、
直接session_name()を使うしかないんでっしゃろか?

>>80
Mojavi使ったことないんで良く分かりませんが、
registerPluginで複数プラグイン登録するんじゃ駄目なんですか?
0083nobodyさん2007/02/26(月) 23:25:21ID:???
>>82
駄目じゃないけど順番を気にしないといけない。
まあフィルタなんてそんなに頻繁に書く部分じゃないから
気にすればいいんだけど。
0084nobodyさん2007/02/26(月) 23:32:30ID:???
ACLのとこ見てるんだけど
「今ユーザがどのロールを持っているか」の部分を担当するクラスを
ZFは提供してない?
0085nobodyさん2007/02/27(火) 00:17:59ID:???
しかしこれは拡張しまくらないと使いものにならないねぇ
フレームワークを作るためのフレームワークに近い。
0086nobodyさん2007/02/27(火) 01:39:24ID:???
ルータあるのにURLヘルパまだないのかよ
こういう基本的なとこから先に作れっつの。
0087nobodyさん2007/02/27(火) 03:32:40ID:???
MojaviのFilter/FilterChainと
ZendのFilter/FilterChain、
用語が同じで用途が違うからややこしいね。
言葉からの連想から言えばZendの方が直感的かな。
0088nobodyさん2007/02/27(火) 03:36:11ID:???
ZendのFilterはCompositeパターンなんだね
言われてみればこの方が理にかなってるか…
0089nobodyさん2007/02/27(火) 06:57:41ID:7OKXpCAA
誰か教えてくれ。
どうもセッション周りがおかしいと思っていたんだが、
Zend_Session::start()
を呼ぶと$_SESSIONの値が全て消えてしまっている。
どうすればいいんだ。
もう眠い。調子こいてZF使わなければよかったorz
0090nobodyさん2007/02/27(火) 07:39:34ID:???
よく見たらFilterもValidateもCompositeじゃなかった
>>89
Zend_Session::start()内でsession_start()してるから
その時にクリアされるみたいよ。
0091nobodyさん2007/02/27(火) 07:56:00ID:???
もっとよく見たらやっぱりCompositeパターンだった(´д`)
leafにaddできないから違うと思ったけど
もともとこういう風に書くのか
なんだかんだで勉強になるな
0092nobodyさん2007/02/27(火) 08:28:16ID:???
Zend::load_Interface消えてるワロタ
0093nobodyさん2007/02/27(火) 08:31:21ID:???
なんでZend::loadInterfaceだけなくしたんだろ
Zend::loadClassもいずれ消える運命?
0094892007/02/27(火) 11:16:48ID:???
自己レス。
オプション指定しないとデフォルトでクッキーのみになってしまうんだね。
0095nobodyさん2007/02/27(火) 11:47:54ID:???
ValodatorManagerとかRequest::Errorsあたりの機能がごっそりないじゃん
実際使ってる人どうしてる?
0096nobodyさん2007/02/27(火) 12:22:12ID:???
m9(^Д^)プギャーーー
0097nobodyさん2007/02/27(火) 12:23:10ID:???
ヒント:ZFを実稼働させてる奴なんていない
0098nobodyさん2007/02/27(火) 12:29:46ID:???
まだ正式版じゃないしな
0099nobodyさん2007/02/27(火) 12:38:38ID:???
ってかContextがない・・・
各オブジェクトに何を持たせたらいいんだよ
非フルスタックを目指すのはいいが穴ぼこだらけだろ
NIKIBI-frameworkに改名しろや
0100nobodyさん2007/02/27(火) 12:55:26ID:???
front controllerをcontext代わりに使うことにしたぜ
0101nobodyさん2007/02/27(火) 13:10:16ID:???
zend frameworkでググったら
関連検索が「zend framework 動かない」だったwwww
0102nobodyさん2007/02/27(火) 18:29:00ID:???
>>101
ほんとだ!!!
http://www.google.co.jp/search?q=zend+framework
関連検索:
Zend Framework 動かない

Googleの突っ込みキツイなーwww
http://pya.cc/pyaimg/spimg.php?imgid=15589
0103nobodyさん2007/02/28(水) 00:04:07ID:???
>>102
ワロタ
0104nobodyさん2007/02/28(水) 10:23:33ID:???
>>91
Compositeパターンは幹にしかAddできないんじゃないか?

Zend::load_Interface消えたんだよな。
なんでだろ。
クラスのロード、全部Zend::loadClassでやってるから
Interfaceだけrequire_onceとかめんどいんだけども。

loadClass消えちゃうんだろか。
0105nobodyさん2007/02/28(水) 14:29:05ID:???
>>104
うん、勘違いしてた。
ファイルであると同時にディレクトリでもあるようなものがあれば
ちょっと面白そうだけど…。

クラスのロードはオートローダに任せておくのがいいのかもしれんね。
0106nobodyさん2007/02/28(水) 16:52:50ID:???
コントローラークラスに
AbcDefController
ってできない。
ttp://xxxxxxx/AbcDef/
としても
AbcdefController
を探しに行ってしまうっぽい。
0107nobodyさん2007/02/28(水) 17:23:22ID:???
>>106
ファイル名が2語以上のcamelcaseだと確かにだめみたいね
ファイル名をAbcdefController.php にしたら動いた
クラス名はどっちでもいいみたい
古いバージョンはファイル名もcamelcaseでもいけてたような気がするんだけどな
確かにこれ地味に嫌な感じだな、バグなんかなこれ
0108nobodyさん2007/03/01(木) 05:00:15ID:???
loadClassは>>79とともに星になりました
0109nobodyさん2007/03/01(木) 19:13:09ID:???
オートロード使うと遅くなるのは間違いないから
あまり使いたくはなかったんだがなあ。
使うとしたら>>79の

>つーかZend::loadClassがZFのオートローダだから
>function __autoload($class) { Zend::loadClass($class); }
>くらい我慢しろ

これが一番楽ちんかな。
0110nobodyさん2007/03/02(金) 13:46:15ID:MGhMK5UU
なかなかよさそうなので試してみてるんですけど
Zend_Dbで接続する時
apacheの実行ユーザー名と
dbの実行ユーザー名が違うと

SQLSTATE[08006] [7] FATAL: role "apache" does not exist

という例外が投げられるんですけど、これは設定でどうにかなるのでしょうか?
ちなみにPDOでじかに接続してる時はならなかったです。

まあ、同じにしてもいいですけど・・・

お願いいたします
0111nobodyさん2007/03/02(金) 14:03:35ID:???
DBは何を使ってる?MySQL?
DB接続時にユーザ名指定してる?
0112nobodyさん2007/03/02(金) 20:31:47ID:MGhMK5UU
>>111
レスありがとうございます

DBはpostgreSQLです。
$params = array(
    'host' => 'localhost',
    'username' => 'hoge',
    'dbname' => 'hogedb'
);
$db = Zend_Db::factory('PDO_PGSQL', $params);

$sql = $db->quoteInto( 'SELECT* FROM t_zip_code WHERE address like ? ' , '%東京%' );
echo $sql;

この時点で実行してエラーが出ます。
実際クエリーは発行していません。SQLを取得しただけです。

httpd.confの
User apache
Group apache
を
User hoge
Group hoge
にしたらエラーもなく、SQLも無事取得できました。
0113nobodyさん2007/03/02(金) 22:29:09ID:???
>>112
$params = array(
'host' => 'localhost',
'username' => 'hoge',
'password' => '',
'dbname' => 'hogedb'
);
みたくパスワードもちゃんと空のパラメータにしてみて
あと、試しにfactory直後でクォートせず何かクエリ投げてみて、
同じようにroleがないみたいな例外が返って来るなら
多分DB接続がうまくいってなくて
PDOはクォートする時もコネクション使うからそこでこけてると思うんだ
01141122007/03/02(金) 22:32:52ID:AEjNDMWg
コードながめて、おかしなところを見つけたんですけど。

Zend/Db/Adapter/Pdo/Apstract.phpの85行目付近のDBに接続するところ

$this->_connection = new PDO(
$this->_dsn(),
$this->_config['username'],
$this->_config['password']
);

PDOで繋ぐときのDNSの設定がカンマで区切られていて
しかも $this->_config['username'] を覗いたら、user= も無かったので
カンマをドットに変えて下のようにしたら動きました。

$this->_connection = new PDO(
$this->_dsn().
' user='.$this->_config['username'].
$this->_config['password']
);

でも、これって、PDOでいろんなDBに接続するクラスのスーパークラスですよね?
こんなコアなところにバグあったら、みんな気づきますよね?
なんか勘違いというか、設定ミス的なことを私がやらかしてるのでしょうか?

ちなみに使ってるのはPreview 0.8.0です。
0115nobodyさん2007/03/02(金) 22:45:15ID:???
>>114
PDOのコンストラクタの引数は
new PDO('mysql:host=localhost;dbname=test', $user, $pass);
こんな感じ
そこのコードは特に間違ってはいない

んで引数の指定がなかった場合なんだが、
おそらくDB側はUNIX自体のユーザ名・パスワード
をDBのユーザ・パスワードと仮定して扱うと思うから
ちょうど今君はapacheのユーザ・パスワードを合わせてしまっているから
たまたま接続がうまくいってるとかそんな気がする
01161142007/03/03(土) 01:47:36ID:fjJSaYh6
>>115
確かにPDOのマニュアルにはその書き方が出てるんですけど
(うちの)postgresqlにはその書き方ではつながりません。
それだと>>110と同じエラーが出ます。

ttp://www.php.net/manual/ja/ref.pdo-pgsql.connection.php
PDOのマニュアルを見ても
pgsql:host=localhost port=5432 dbname=testdb user=bruce password=mypass
と表記するように出てると思うんですけど・・・
違うとこ見てますか?^^;


う〜ん、でもおかしいですね。
もしかしてpostgresqlの人、>>115の書き方でつながってるんでしょうか?
サーバーとかDBの設定の問題でしょうか?

ちなみに、apacheとDBのユーザとパスは同じではありません。
どちらかというと、同じにすると動くと言う感じです。

ちなみにPHP5.2.1を使っています。
01171162007/03/03(土) 02:45:02ID:???
いろいろ実験してみたけど
うちの環境ではやっぱり
new PDO('pgsql:host=localhost;dbname=test', $user, $pass);
ではなく
new PDO('pgsql:host=localhost dbname=test user=user password=pass');
じゃないとつなげないっぽいですね。

ZendFrameworkと関係なさそうなのでPHP版の方へ行ってみます

ありがとうございました。
0118nobodyさん2007/03/03(土) 05:32:34ID:???
>>114
> PDOで繋ぐときのDNSの設定がカンマで区切られていて
カンマ区切りは関数のパラメータの区切りであってDSNの区切りじゃないだろ;;

>>116
> PDOのマニュアルを見ても
マニュアル上ではuserとpasswordはDSN文字列で指定する他に
第二引数、第三引数で指定する方法もある。
パラメータの優先は第一引数のDSN側なんだが、
ZendFrameworkのPDOインスタンス時には
unset($dsn['username']);
unset($dsn['password']);

// use all remaining parts in the DSN
foreach ($dsn as $key => $val) {
$dsn[$key] = "$key=$val";
}
という処理でDSNを組み立てているので、unsetで除外することで
DSNの中にはuserとpasswordは入らないようにされている。

その上で、PDOが第二引数をちゃんと受け取れていない、という話であれば
それはPDOのバグかもしれない。
01191122007/03/03(土) 13:57:46ID:fjJSaYh6
PHP板にも書いたんですけど
>>113を見逃していました。みなさんごめんなさい。

passwordを省略すると、あの得体の知れないエラーが出るようです。
エラーが間違ってるジャン!PDOのバグだ!と怒りたいところですが
113の指摘を見逃した私がすべて悪いわけでして・・・

申し訳ございませんでした。
&ありがとうございました。  
0120nobodyさん2007/03/03(土) 23:21:06ID:???
Zendで行こうかと思ったがやっぱりsymfonyで行きます
symfonyが10としたらZendは3くらいだし
Zendしょぼすぎワロタ
0121nobodyさん2007/03/04(日) 04:37:54ID:???
Zend_Service_Akismetとやらを見て、Akismetの存在を知った。
面白いなこれ。
0122nobodyさん2007/03/04(日) 05:28:00ID:???
ZendはsymfonyのescapingOutputがないのが糞
いちいちescapeしてられるかっての
0123nobodyさん2007/03/04(日) 14:32:22ID:???
おいおい…
http://www.zend.co.jp/tech/index.php?%A4%BD%A4%CE%C2%BE%2FZend%20Framework
ここのサンプルだと、View呼び出すのに絶対パスコントローラに埋め込んでるじゃねぇか…
いくらなんでもひどすぎだろ
0124nobodyさん2007/03/04(日) 14:52:52ID:???
zend japanのレベルなんてそんなもの
0125nobodyさん2007/03/04(日) 16:57:57ID:brIiO66u
Zend_Db_Tableってもしかして
Zend_Db_Selectと連携出来ないっぽいですか?
0126nobodyさん2007/03/04(日) 17:01:33ID:???
>>125
別扱いだな
tableにrailsライクなfind()が欲しけりゃselect使って実装しろってこった
0127nobodyさん2007/03/04(日) 17:05:28ID:???
ZF疎結合すぎワロタ
0128nobodyさん2007/03/04(日) 17:21:00ID:brIiO66u
>>126
public function fetchSelect($select){
      return new Zend_Db_Table_Rowset(array(
'db' => $this->_db,
'table' => $this,
'data' => $this->_db->fetchAll($select),
));
}

でいちおう出来たけど、こんな感じかな。

これって、DBから一度配列で持ってきてから、PHPでオブジェクトにマッピングしてないですか?
PDO::FETCH_CLASS使った方が早いと思うんですけど、どうなんでしょう?
01291252007/03/05(月) 00:37:51ID:514EdfV5
PDO::FETCH_CLASSでfetchAll簡単に出来ました。
やっぱり早いですね。当然ですけど。
まあ、WEBアプリでは一回に何千もレコード取得して表示する事もそんなないだろうから
差は微々たる物だけど

このフレームワーク、完成度は(当然正式版じゃないので)イマイチだけど
ソース見てると、すごいよく設計されてると思う。

今後に期待しちゃうな

とりあえず自分で改造したやつ使うつもりだけど。
0130nobodyさん2007/03/05(月) 10:22:28ID:???
図書館で「PHPの薬箱」を借りてきました。
Symfony、Zend Framework
とりあえずこの二つを使えればプロとして自信が持てそうですw
0131nobodyさん2007/03/05(月) 10:43:01ID:???
結構いいよね、phpの薬箱。
01321252007/03/05(月) 14:11:20ID:c6MP6ips
良く見たらZend_Db_Table_Rowsetって
1rowが1objectじゃなくて
Zend_Db_Table_Rowset Object に全行の配列を持ってるんですね

見間違いました。

>>130
PHPの薬箱は、まだ読んでないですね。チェックしてみます。
私のオススメは
Zend Frameworkと関係なさそうで、微妙に関係ある
「PHPによるデザインパターン」
0133nobodyさん2007/03/12(月) 08:54:48ID:2JUfcRN6
ttp://www.itmedia.co.jp/enterprise/articles/0703/08/news018.html

この記事試してみた人いますか?
動きが解って良いんですけど、このブログツールにログインするIDとパスが解りませんOTZ
記事投稿してみたり、いろいろしてみたいんですけど・・・

解りましたら。教えてください。
0134nobodyさん2007/03/14(水) 10:42:23ID:62gHBZHz
Zend_Controllerで質問です。

IndexControllerのnoRouteActionが呼ばれないんですけどなんか設定が必要なのでしょうか?
例えば
http://www.hoge.com/Index/foo/
とか設定してあるActionを呼ぶと問題なく動きます。で、
http://www.hoge.com/Index/bar/
とか、設定してないActionをよんでもnoRouteActionが呼ばれません。
試しに
http://www.hoge.com/Index/noRoute/
とすると呼ばれます。
なぜでしょうか?指定がないときに呼ぶActionを設定したりしなきゃならないのでしょうか?
お願いいたします。
0135nobodyさん2007/03/14(水) 10:47:31ID:62gHBZHz
ちなみに、ないアクションを呼んだときは真っ白な画面でソースを見ると
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8"></HEAD>
<BODY></BODY></HTML>
しかありません。
0136nobodyさん2007/03/14(水) 11:52:04ID:???
なんかそんなのあった気もするがバージョンは?
最新の0.8ってもうnoRoute自体なかったような(__call()で処理)
0137nobodyさん2007/03/14(水) 11:54:47ID:???
>>135
PHPのエラーログとか見れ。
01381352007/03/14(水) 13:09:56ID:???
>>136
>>137
レスありがとうございます

まさに0.8でした。
__callで処理するようになったんですね。
うまく出来ました。
0139nobodyさん2007/03/14(水) 20:08:38ID:???
Zend_Controller_Router_Route_Module が動かないんだけど・・・

マニュアルには
$compat = new Zend_Controller_Router_Route_Module();
$this->addRoute('default', $compat);
って書いてあるけど、いろいろ試したが動かない・・・・・・
0140nobodyさん2007/03/14(水) 21:37:24ID:???
ルーター細かくいじるならソース嫁
よっぽどでない限りデフォルトのルートだけで事足りるじゃん
0141nobodyさん2007/03/14(水) 22:10:20ID:???
0.8でモジュールも色々変更あったんで
http://framework.zend.com/manual/ja/zend.controller.modular.html
ここ読めば分かると思うけど普通のフロントコントローラー使って、
配列でディレクトリ指定してやれば使えるようになると思うよ。
0142nobodyさん2007/03/14(水) 23:00:11ID:???
レスサンクス!

>>140
確かに普通のルーティングだけでも十分満足だけど、
admin を別のアプリにしようと思って。
ソースよむかな・・・

>>141
なるほろ。
助言を基にもう一度やってみます。
01431392007/03/15(木) 10:40:52ID:???
できました。
include_path が通っていないだけでした。。
0144nobodyさん2007/03/18(日) 13:33:48ID:WPSFKvBp
お約束?のディレクトリ構造にしてアプリをつくるとして
やっぱりmodelsにはincludeパスは通して使う物なのでしょうか?

そうすると

Zendのlibrary
pear(使いたい物がちょこっとあるので)
全アプリ共通で使うclass群の入ってるディレクトリ
そして、いくつかのmodelsディレクトリ

と結構includes path通すところが数が多いのですが、
なんか、どこかで、あんまりいっぱいincludes pathを通すと、
検索する場所が増えるので、全体のパフォーマンスが低下するって
見た覚えがあります。

modelsにあるものを毎回フルパスで指定するのも何だし・・・
なんかうまい方法見逃してますか?
それとも5.6個通すぐらいなら気にすることないのでしょうか?
0145nobodyさん2007/03/18(日) 20:07:56ID:???
pear用のディレクトリに関してはもう
php.iniレベルで設定しておいていいし
pear本家でZendネームスペースを使う事もないだろうから
pear用ディレクトリ以下でZend/Zend.phpをsymlinkにしておけば
アプリ側でinclude_path追加するのは
lib/modelくらいで済むんじゃないかね
0146nobodyさん2007/03/18(日) 22:00:42ID:WPSFKvBp
>>145
レスありがとうございます

ふむ。modelに関してはそのアプリのindex.phpでパスを通せばいいのか・・・
まあ、なれてないのでいろいろ考えちゃってるけど、とりあえず作ってみれば
どうすればいいか解ってくるかな。

プレビューが0.9.0になってますね。
マニュアルもちょっとアップされたかな。たぶん。
祝い上げしておきます。

ところで、フォームはpearでやろうと思ってたけど、viewヘルパーなるよさげなものが
あるんですね。あれとZend_Validateを使ってみます。
0147nobodyさん2007/03/19(月) 15:31:58ID:Y3+UeIKc
View周りをプラグインで簡単にしようと思うんですが
クラス名をどうしたらいいか悩んでます
My_Plugin_Viewとか考えたんですけど
なんか良い感じの無いですか
0148nobodyさん2007/03/20(火) 23:47:27ID:EqlsiciX
>>147
そんなんどうでもいいよっていう人も多そうだけど
意外にネーミングって悩むし、大事ですよね。

個人的にMyと_(アンダーバー)は嫌いなので
(サイト名や会社名や自分の名前)(機能を端的に表した単語)ViewPlugin
例HogeConvertViewPlugin
とか・・・
長いか・・・・
いっそのこと
HogeConvertVP
とか。
01491482007/03/21(水) 00:05:18ID:+1/xKX/r
質問しようと思って開いたのに書くの忘れた。
MVCというのが何となく解ったようで解らないんですけど

例えばフォームからの入力をDBに登録後、一覧を表示。

なんてアプリの場合、ファームのヴァリデイトはControlでするのでしょうか?
そんな気がするのですが、Modelのような気も・・・

どんなもんでしょうか?
0150nobodyさん2007/03/21(水) 06:51:01ID:???
>>149
validationの定義はmodelに対して行う。
それを呼び出すのはcontrollerで行う。
0151nobodyさん2007/03/21(水) 16:05:45ID:NvhysGYm
Smartyのキャッシュ使いたいんだけど、その辺どうなの?
0152nobodyさん2007/03/22(木) 11:11:22ID:???
>>151
使えばいいと思うヨ!

みんなViewを素で使ってるのかな?
俺はViewを抽象化もせずにSmarty直接叩いてるけど。
0153nobodyさん2007/03/22(木) 13:22:24ID:???
今頃Zendコアクラスに変更か
0154nobodyさん2007/03/25(日) 00:39:42ID:kYJTpB8y
404ページをどうやって作ればいいんだ
0155nobodyさん2007/03/25(日) 02:34:38ID:07q9VATM
>>154
奇遇だね。今日おれも同じコトやってたw

Actionが見つからない場合はは__callが呼ばれるので
そこで404ページを出せばOKだけど
問題はControllerだよね。

省略された場合はデフォルトコントローラー(index)が呼ばれて、
ないコントローラーが呼ばれた場合デフォルトでは何も起こらない(本当は例外が投げられてるけど)じゃないですか?
Dispatcherまわりをもっとよく調べれば簡単な解決策あるかもしれないけど、とりあえず強引に解決してみた。

まずZend_Controller_Frontで
$controller->setParam('useDefaultControllerAlways',true);
で、ないコントローラーが呼ばれた場合もデフォルトのコントローラーが呼ばれるようにして

indexControllerのinit()で

$controller_name=$this->getRequest()->getControllerName();
$request_params=$this->getRequest()->getParams();
if($controller_name != $request_params['controller']){
    $this->__call();
}

とかやって実際にリクエストされたコントローラー名と呼ばれたコントローラーが違った場合は
__callを呼んで404ページを呼び出すようにした。

こんな感じじゃ駄目ですか?
もっと簡単な方法あったら伝授お願いします。

どうもDispatcherっていうのが馴染みがないせいか、イマイチよくわからなくて・・・
0156nobodyさん2007/03/25(日) 02:45:08ID:???
1.0になったらどうにかなるかもしれないから放置するべきか・・・
404くらいデフォルトでなんとかなるようにしてくださいよ!
フレームワークあんだから!
0157nobodyさん2007/03/25(日) 12:06:39ID:???
useDefaultControllerAlways=trueで
デフォルトのコントローラを404コントローラにする
んでアクションが無い場合(__call)もそっちにforwardしてやるとか

何事にも気が利かないのはZFのデフォルトの仕様
rails:設定より規約
ZF:規約よりおまえが書け
0158nobodyさん2007/03/25(日) 13:20:21ID:07q9VATM
>>157
それするとコントローラー省略したときも404が出ちゃわない?
ttp://www.yahoo.co.jp/
みたいにドメインだけ入力したとき。

省略された場合と、存在しない場合で動き変えられれば簡単に解決なんだけど・・
0159nobodyさん2007/03/25(日) 14:55:53ID:???
>>158
URLが空の場合はIndexControllerにルーティングすればいい
0160nobodyさん2007/03/25(日) 15:33:13ID:UfKh4Z0S
noRouteActionじゃダメなの?
0161nobodyさん2007/03/25(日) 15:50:16ID:???
俺もそう思った。
コントローラごとにオーバーライドするのは面倒くさいと見るか、コントローラごとに分けることができて便利と見るか・・・。
いざとなったら、404用のabstractなコントローラを用意して、継承しまくるとか。
0162nobodyさん2007/03/25(日) 15:58:06ID:???
noRouteActionはもうない
01631612007/03/25(日) 16:49:33ID:???
ごめん、最近のバージョンは全然チェックせずに言ってた。

ついでに最新バージョン落としてソースを追ってみたけど、
useDefaultControllerAlwaysをfalseにしておけば、コントローラが存在しない場合にZend_Controller_Dispatcher_Exceptionが投げられるから、これをcatchして404出せばいいんじゃないかと思った。
あと、アクションが存在しない場合はZend_Controller_Exceptionが投げられるっぽい。
さすがにZend_Controller_Exceptionだと、その名前から察するに別の状況でも投げられそうな気がするから、少し微妙かもしれない・・・。

とりあえず、>>155の言ってる、
>Actionが見つからない場合はは__callが呼ばれるので
>そこで404ページを出せばOKだけど
ってのがどういう意味かよくわかんなかったんだけど、__callを自分のアクションでオーバーライドして処理するってこと?
0164nobodyさん2007/03/25(日) 18:22:22ID:???
>>163
そう、旧バージョンのnoRouteActionを__callでどういう風にするのかは
http://framework.zend.com/manual/ja/zend.controller.migration.html#zend.controller.migration.fromzerosix
ここの一番下に載ってる

まとめてみる
コントローラが見つからなかった場合、どっちでもいけると思う

useDefaultControllerAlways=falseなら>>163のように
Exceptionをcatchして404にforward or redirect

useDefaultControllerAlways=trueなら>>157のように
デフォルトコントローラを404のハンドリングに使う

ルーティングが '' (ドキュメントルート)の場合にも
404にハンドリングされてしまうのでRouterに最優先で
'' の場合はIndexControllerにルーティング

あと個人的にActionが見つからないのをハンドリングするためだけに
__callを使うのはもったいない(__callを使った拡張ができない)ので
Zend_Controller_Actionのdispatchをオーバーライドして
自前でアクションが見つからなかった場合の処理を実装して
__callを自分で使えるようにしておいた方がいいと思う

こんな感じかな?
01651612007/03/25(日) 19:58:28ID:???
>>164
なるほど。APIが禿しく変わったと思ってたけど、けっこうちゃんとマニュアルに書いてあるんだな。
404の処理方法も正式バージョンではドキュメント化されるかもね。
ひとまず当面は>>164のやり方しかないんだろう。
0166nobodyさん2007/03/25(日) 23:02:53ID:clpaUIjl
Zend_Loaderってなんだよorz
01671572007/03/26(月) 10:29:04ID:jn+p2f5C
例外キャッチするって言う手もあるか
すっかり頭から抜け落ちてた。

getRequest()->getParams()['controller']とgetRequest()->getControllerName()
を較べるのはまずいっぽい。_forwardしたときに呼ばれちゃう・・・

例外キャッチにしようかな

まあ、どっちにしても1.0までには指針を示してくれるのだろうか?

ところで、Validateチェーンって
$breakChainOnFailure を true にしなければgetMessages() で全てのエラーメッセージを配列で受け取れる仕様じゃないんでしょうか?
どうも期待通り動かなくて、ソースを見たところ

$this->_messages = $this->_messages + $validator->getMessages();

となっています。
こういうのってarray_merge使わないとだめだったようなきがするんですけど勘違いでしょうか?
それとも最初エラーメッセージだけ帰ってくるのが動き的にあってるのでしょうか?

話は違いますが
0.9.1がでてますね。早く正式リリースされないかな
0168nobodyさん2007/03/26(月) 11:28:00ID:B9eaVhyg
2重投稿防止の処理ってなんかあるの?
今までは自前でセッションとリクエスト比較して来たんですが。
0169nobodyさん2007/03/26(月) 11:55:36ID:???
そんな高級な機能がZFにあるわけないです
01701682007/03/26(月) 12:52:34ID:???
>>169
おお。
気に入った。
0171nobodyさん2007/04/01(日) 11:53:09ID:sAfc6g3U
Controllerを使って推奨のディレクトリ構成で構築したとき
例えばあるviewにスタイルシートを埋め込むとき、
Frontを起動したindex.phpから見たパスになるんじゃないんでしょうか?

相対パスで
<link href="styles/hoge.css" rel="stylesheet" type="text/css" />
とやっても認識されず、
<link href="/styles/hoge.css" rel="stylesheet" type="text/css" />
と、ドメインを省いた絶対パス指定じゃないと認識しないのですが、これしか方法ないのでしょうか?

それとも、相対パス指定が間違ってますでしょうか?

絶対パスでも良いんですけど、dreamweaverで認識しないので、ちょっと面倒かなと・・・
0172nobodyさん2007/04/01(日) 12:01:18ID:???
あった、ZFcheckDoublePost
0173nobodyさん2007/04/01(日) 12:32:18ID:???
>>171
mod_rewriteの設定は修正したのか?
0174nobodyさん2007/04/01(日) 15:41:17ID:sAfc6g3U
>>173
.htaccessは

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

となっています。
変わったのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています