【PHP】フレームワーク CakePHP 3ホール目【本命】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/03/14(金) 15:16:00ID:HF9x5ODX10分で作るCakePHPアプリ for Windows
http://p4life.jp/cake/
マニュアル日本語化
http://www.cakephp.jp/doc/
日本語フォーラム
http://cakephp.jp/modules/newbb/
あとこのへんとか(初心者向けTIPS)
http://www.avatarfinancial.com/pages/cake/
CakePHP入門リンク集
ttp://pub.studio15.jp/2007/11/13/cakephp-links/
【PHP】フレームワーク CakePHP 2ホール目
http://pc11.2ch.net/test/read.cgi/php/1194976228/
【PHP】フレームワーク CakePHP
http://pc11.2ch.net/test/read.cgi/php/1163850802/
0550nobodyさん
2008/04/02(水) 18:06:46ID:???それは見た目を変えるだけだからビューの仕事だろうね。
モデルから戻ってきたデータとは、汎用的なfind関数の場合、
$data => array(
モデル名 => array(
フィールド名1 => 値1,
フィールド名2 => 値2,
フィールド名3 => 値3,
)
)
こんな値が返ってくる。もちろん、これをそのまま
ビューに渡してもいいんだけど、これじゃあビューで使いにくい!
って言う場合加工する。
そんな場合あるのかって? 余り無いだろう。
そう、だからコントローラの仕事は少ない。
モデルから取得した値をビューに渡す$this->set(・・・) は
コントローラの仕事ね。
0554nobodyさん
2008/04/02(水) 18:21:49ID:???もちろん、直接関係が無いモデルは別々に
アクセスするよ。
モデルというか処理の内容から考えて
一つであるべきと思う場合は一つのモデルでやる。
あと、トランザクションの為のメソッドが
モデルにあることも興味深いよね。
一連関係ある処理は一つのモデル内で完結させるものと
考えると、なるほどと思わない?
0556nobodyさん
2008/04/02(水) 18:27:56ID:???その意見はわからないでもないが、
普通にRDBMSを正規化したとき
そういう関連(リレーション)は出来るもんなんだが・・・
RDMSを正規化すると複雑になってしまう。それがいやだから
それを解決する為に、O/Rがあるんだと思うぞ!
0557nobodyさん
2008/04/02(水) 18:28:26ID:???○RDBMSでテーブルを正規化したとき
0558nobodyさん
2008/04/02(水) 18:32:44ID:???ページ数が増えたとき、コントローラを増やすことができるけど
コントローラが増えた分モデルを増やすこと出来ないよ。
ひとつのモデルに書くコードが恐ろしく増えるね
0559nobodyさん
2008/04/02(水) 18:34:17ID:???0560nobodyさん
2008/04/02(水) 18:35:56ID:???言っている意味が、よくわからないんだが・・・
例えコントローラが無くてもモデルは作れるし、
一つのコントローラで複数モデルを扱うことも出来るんだが?
0561nobodyさん
2008/04/02(水) 18:43:36ID:???あれがアフォに勘違いを植え込む。
0562nobodyさん
2008/04/02(水) 18:49:12ID:???コントローラに処理を詰め込みすぎというか、モデルに処理が何も無いのが
いけないんじゃないかな?
あれじゃ、単にテーブルに直接アクセスするネイティブな関数の
代わりのクラスにしか見えない。
一番、プログラマがいろいろ書くべきなのはモデルなのに。
逆に言えば、いろいろ書かないといけないものだからこそ
自動生成ではモデルに何もないんだろうね。
でもサンプル程度はほしいかも。
0563nobodyさん
2008/04/02(水) 18:53:30ID:KzinrGTW<!-- 0.0012s -->
みたいに、生成時間?のコメントがつくんですけど
これを付けないようにするにはどうすれば良いんでしょうか?
debugは1にしておきたいです。
0564563
2008/04/02(水) 18:58:51ID:???0565nobodyさん
2008/04/02(水) 19:00:37ID:???モデルで書かれてる処理はバリデータ関係の関数しかないんだけど
http://code.google.com/p/openflp/
0567516,522
2008/04/02(水) 19:01:23ID:Ldo05SB7「複雑な一連の処理」とかビジネスロジックとかって、たとえば俺の場合は
・�@日足の株価を取得してRSIを計算する
・�A与えられた条件引数に該当する銘柄の証券コード配列を取得(スクリーニング)
・�B現在の株価を受け取り、あらかじめ計算しておいた目標価格の条件を満たすか判別
⇒・更に条件を満たしていれば、買い/売り注文をWEBサービスに投げる処理も「証券会社モデル」(仮称)というDBと連携しないモデルを作成して、HTTP(S)で注文するメソッドを書いてる。
・�C現在の株価を取得する(楽天証券のRSSをDDE接続経由で呼び出すモジュールを別途使用)
みたいなアプリが持つほとんどの主要処理を言ってて、これらをモデル(またはビヘイビア)に記述するべきと思うのです。
逆に言えばコントローラは、
・�Cの「現在の株価を取得する」メソッドからの返し値をそのまま�B「株価と目標を評価し、注文する」メソッドに引渡し仲介する
・ビューからリクエストがあった�@などの計算処理をモデルメソッド�@に引き渡す
・スクリーニング対象銘柄の証券コードリストを取得し、そのまま�Aのスクリーニングメソッドに引き渡す。
くらいのことしかしていない。人間の世界でいうと「仲介人」かと。
0569nobodyさん
2008/04/02(水) 19:08:08ID:???Rails 製のオープンソース版 Fastladder
モデル 382steps
コントローラー 910steps
コントローラーに処理書きまくってるんですが。。。
0570nobodyさん
2008/04/02(水) 19:09:00ID:???0571nobodyさん
2008/04/02(水) 19:11:13ID:???オープンソース見れば、すぐわかることだからな
0572nobodyさん
2008/04/02(水) 19:15:29ID:???> じゃあ本家railsのソースコードみせてやる
おいっ! railsはフレームワークだ。
もともとビジネスロジックは含まれてない!
0574516,522
2008/04/02(水) 19:46:05ID:Ldo05SB7あー、「全部コントローラで出来るし」って言ってる時点でプロフェッショなるじゃないことが確定www
議論しても理解できないんだろうな、「できる/できない」ということと「(プロとして)やるべき/べからず」
といった本質的な点をwww
コントローラでも全部やろうと思えばできることくらいわかっとるわいwww
0576nobodyさん
2008/04/02(水) 21:14:45ID:???議論としては面白い
俺もその辺気になってた
まあ俺はbakeしたコードの拡張から入ったクチだから全部controllerに書いちゃうけどなwww
0577nobodyさん
2008/04/02(水) 21:37:43ID:???俺もコントローラに書いてしまったけど、
作り続けていくうちに、なんか無理が出てくるんだよ。
なんでこんなに作りづらいんだ?って思っていたときに
このスレにあった、ケーキの絵。あれで悟りを開けた気がする。
あぁモデル中心でやればいいんだって。
0579nobodyさん
2008/04/02(水) 21:58:46ID:???モデルに書けって言うけど、何を書くの?
関数で書けばいいの?モデル内のメソッドとして?
>>565
の言うとおり、実例も無いし具体的なメリットが分からない。
今のところテストが楽って事はなんとなく分かった。
0580nobodyさん
2008/04/02(水) 22:16:06ID:???これの3ページ目
http://cakephp.org/files/OCPHP.pdf
0581nobodyさん
2008/04/02(水) 22:19:41ID:???モデル = ビジネスロジック用のクラス
なんだから、言うまでも無くメソッドだろ
0584nobodyさん
2008/04/02(水) 22:27:49ID:???どう幸せになるかではなく、
どう幸せになりたいか。
貴方はプログラミングする上で、どうなったら幸せだと感じる?
0585nobodyさん
2008/04/02(水) 22:57:59ID:???0588nobodyさん
2008/04/03(木) 00:17:09ID:???松本に話したら鼻で笑われたよ
0589nobodyさん
2008/04/03(木) 00:38:13ID:???0590nobodyさん
2008/04/03(木) 00:48:42ID:???0591nobodyさん
2008/04/03(木) 10:10:52ID:Z1Ohe4yI0592nobodyさん
2008/04/03(木) 11:26:08ID:???0593nobodyさん
2008/04/03(木) 12:10:16ID:???1.フォームから画像ファイルをアップロード
2.アップロード結果・画像ファイルの不正検知
3.2が成功時、元画像名をmd5したものをuploadsフォルダに保存
4.3のファイル名をimage_fileカラムに格納
という一連の処理があったばあい、
今現在はコントロールとコンポーネントに書いてますが、
モデルとビヘイビアに書くとしたら、
2->バリデータに記述
3->ビヘイビア
4->モデル
という感じなんでしょうか?
0594nobodyさん
2008/04/03(木) 12:26:23ID:???最初から無いってことは必要性が薄いてことだよな
0595nobodyさん
2008/04/03(木) 12:32:04ID:???モデルに書いて読みにくくなるなら、書かない方がいい
結局はソースを読みやすくするために分けてるだけの話
0596nobodyさん
2008/04/03(木) 12:32:23ID:???正確には画像を保存できるビヘイビアだけどね
http://bakery.cakephp.org/articles/view/actas-image-column-behavior
0597nobodyさん
2008/04/03(木) 12:50:28ID:???一番見やすいソースとは、なるべく何も書かないこと。
画像をアップロードして保存というのは、本質的には
テーブルに画像フィールドを作ってそこに格納することと変わらない。
だからフィールド追加作業以外は、一切処理を変更しないで
作れるというのが一番理想的。
ビヘイビアを使えば、>>596のようにActsAsにわずかなフィールド情報を
設定して終わりだけど、その他の方法でここまでスマートに作れるかな?
0599nobodyさん
2008/04/03(木) 13:49:15ID:Z1Ohe4yI>最初から無いってことは必要性が薄いてことだよな
正確には1.1の頃からビヘイビアのディレクトリは用意されてたんだよな。
おそらく必要性はあったのだけど、1.1.xのステイブル版までに実装できなかっただけなのでは?
0600nobodyさん
2008/04/03(木) 14:22:02ID:???0601nobodyさん
2008/04/03(木) 15:14:18ID:???0603nobodyさん
2008/04/03(木) 17:41:48ID:???http://book.cakephp.org/ja/view/67/introduction
> Model behaviors provide a way to mix in functionality
へぇ、behaviorsはmix-in的な機能を提供するものだったんだ。なるほど。
0606nobodyさん
2008/04/04(金) 20:03:22ID:GG6uDHIa0607nobodyさん
2008/04/05(土) 04:54:50ID:???個人的にはいい感じだと思いましたが、どうでしょう?
CakePHPを使ったMVC設計のベストプラクティス
ttp://www.sooey.com/journal/2008/03/26/717/
0608nobodyさん
2008/04/05(土) 05:21:49ID:???MVCモデル全般的な考えではない
0609nobodyさん
2008/04/05(土) 05:24:58ID:???MVCモデルでわけた場合はCが中心となる
0610nobodyさん
2008/04/05(土) 09:45:41ID:???0611nobodyさん
2008/04/05(土) 15:00:48ID:???0612nobodyさん
2008/04/05(土) 15:07:51ID:???最強のモデルとは思っていない。
最適なモデル構造というには、まだまだ完成度が低いとrails作者は言っている
0613nobodyさん
2008/04/05(土) 15:49:00ID:???面白いけど
これ通りに書いたら一覧性下がりそうだな
大規模なら修正には強くなりそうだね
まずは体に叩き込んでみるのがいいのか
0615nobodyさん
2008/04/07(月) 17:32:08ID:???今は勉強してる暇も無いからとりあえず平で書く
ってときに、最低限これだけ守ってコード書いとけば
あとでcakephpを使いたくなってもまあなんとかなるよ という
ポイントを教えて
0616nobodyさん
2008/04/07(月) 17:50:23ID:???無理じゃね
0617nobodyさん
2008/04/07(月) 18:06:48ID:???0618nobodyさん
2008/04/07(月) 18:28:13ID:???とにかく規約ぐらい把握しないと無理だよね
結局出来るのはDBの設計ぐらいじゃないかと
コードも処理部分は多少使いまわせるだろうけど
0619nobodyさん
2008/04/09(水) 22:36:27ID:0zi6cM/k考えています。
それで、実際に発行されているSQLと、可能であればアクセスパスを確認したいの
ですが、なにか方法がありますでしょうか。
0620nobodyさん
2008/04/09(水) 23:44:43ID:???0621619
2008/04/10(木) 00:04:23ID:ysAxvq3P確認できました! ありがとうございます。
0622nobodyさん
2008/04/10(木) 10:23:53ID:???$sql = <<<EOF
SELECT
`Foo`.`id`,
SUM(`Bar`.`hoge`)
FROM `bars` AS `Bar`
LEFT JOIN `foos` AS `Foo` ON (`Bar`.`foo_id` = `Foo`.`id`)
WHERE `Foo`.`id` IN (1, 2, 3, 4, 5)
GROUP BY `Foo`.`id`
EOF;
連想配列の添字がおかしくなるのですが、回避はできないのでしょうか
array(
'0' => array(
'Foo' => array('id' => ***)
'0' => array('SUM(`Bar`.`hoge`)' => ***) ←ここ
)
.
.
.
)
0623nobodyさん
2008/04/10(木) 10:42:01ID:???なんかqueryなんか使わないで、find()で出来そうな気がするんだが?
queryだとRDBMSごとの違いを吸収できないことがあるのでお勧めしない。
んで、試してないんで間違っている可能性が高いんだが
$sql = <<<EOF
SELECT
`Foo`.`id`,
SUM(`Bar`.`hoge`) as `Bar`.`hoge`
以下同じ
じゃだめかな?
内部的には帰ってくるデータのフィールド名がどうなっているかを判断して
連想配列に入れているようだから、SUM関数とか使うとフィールド名が
CakePHP的に想定外になる。それが原因じゃないかな?
ちなみに、この、 as `Bar`.`hoge`の文字列の部分がRDBMSによって違うので
考えなしに使ってしまうと、RDBMSごとの違いを吸収できなくなる。
(たしかPostgreSQLだとas Model__Field)
もちろん、MySQLにだけ対応していればいいのなら、問題ないけどね。
0624nobodyさん
2008/04/10(木) 11:29:33ID:???レスありがとうございます
alias噛ませる方法は私も試してみたのですが
FROM `bars` AS `Bar`の宣言と被っているためエラーが返ってきます。
hasManyで繋がっている集計先テーブルの条件指定なども追加したい場合
CakePHPの作法だとどのようにするべきなのでしょうか?
たとえば、PostのViewにユーザ名だけでなく、そのユーザが所属するグループ名を表示したい場合、どうすればいいんだろう?
Post.id
Post.user_id−参照→User.id
←取得−User.username
User.group_id−参照→Group.id
←取得−−−−−−−−−−− Group.groupname
User.usernameを表示する場合は、$post['User']['username']でいけるっぽいけど、
じゃあ、そのユーザのグループ名はどうやって取得すればいいんだろう?
他にも、グループ名のリンクをクリックしたときに、そのグループに所属するユーザ
(User.group_idの値がGroup.idの値と等しいユーザ)User.usernameの一覧を作成するときとか
どのように書けば良いんだろうか?
MVCにしろ、SQLにしろ始めたばっかで全然わからないや。
0626nobodyさん
2008/04/10(木) 15:04:31ID:???Post -> User -> Group という順番に適切なアソシエーションが設定されていれば、芋づる式にデータは取ってこれる。
やってるけど分からないなら>>620が書いているように、デバッグモードをonにしたほうがいい。
その質問の仕方だと、何をどこまでやって分からないのか分からない。
0627nobodyさん
2008/04/10(木) 22:22:07ID:???とりあえず、
SUM(`Bar`.`hoge`) as `sumhoge`
これだと、
Array([0] => Array([0] => Array([sumhoge] => 6)))
となるよ。
まとめて書くなら、
$query = array(
'conditions'=>array(
'Foo.id'=>array(1,2,3,4,5),
'1=1 GROUP BY Foo.id'
),
'fields'=>array('Foo.id','SUM(Bar.hoge) as sumhoge')
)
$this->Bar->find('all',$query);
って感じかな
0628nobodyさん
2008/04/10(木) 22:25:44ID:???どこのモデルのデータかという情報が消えてしまい、
0という名前のモデル名になるってだけで
おかしいわけじゃないんだけどな。
今回はBar.hogeのSUMだからモデル名はBarになるべきだと
思うかもしれないけど、SUM(`Foo`.`hoge` + `Bar`.`hoge`) という
書き方だって出来るわけだし。
0629nobodyさん
2008/04/11(金) 00:29:36ID:???しかし、扱いにくいのはたしかなんだよね
0630nobodyさん
2008/04/11(金) 01:18:44ID:???Scaffoldなんていう土建屋みたいなネーミングはいかがなものかねぇ。
いくらRoRのパクリとはいえ、違う名前でもよかったんじゃないかな。
なぁんて、チラシの裏w。
0631nobodyさん
2008/04/11(金) 01:32:12ID:???0632nobodyさん
2008/04/11(金) 01:40:16ID:???私も初心者ですが、私の場合はVIEWの最後に、
<?php print_r($post); ?>
というデバッグ出力を出して確認しながらやってます。
あ、確認は「ソースの表示」をした方が分かり易いかも。
秀丸など、UTF8等のキャラクタセットに対応するエディタが必要ですが。
0633nobodyさん
2008/04/11(金) 02:27:45ID:???NET Framework 3.0がWEBサイト最強のフレームワークになるな
PCのWEBサイトはC#じゃないと追いつけないわ
そしてPHPなどの下級言語は携帯サイトでしか使用されなくなる
0634nobodyさん
2008/04/11(金) 02:39:04ID:???asp.netの注目度がかなり上がってる
どう考えてもPHPから3Dにも強いasp.net(C#)に移行するだろうな
0635nobodyさん
2008/04/11(金) 02:40:09ID:???時代遅れ君たち
0636nobodyさん
2008/04/11(金) 04:43:59ID:???0637nobodyさん
2008/04/11(金) 04:57:27ID:OBoZ/5C8代わりに、なにがいま時代の最先端なの?
0638nobodyさん
2008/04/11(金) 13:47:57ID:???別に、すでにCakePHPで作ったものをC#に置き換える必要は
ないんだし。
0639nobodyさん
2008/04/11(金) 15:17:40ID:???0640nobodyさん
2008/04/11(金) 17:09:12ID:???mysql の max 関数を使うには cakephp ではどのようにすればよいでしょうか。
よろしくお願いします。
0641nobodyさん
2008/04/11(金) 22:44:28ID:???0642nobodyさん
2008/04/11(金) 23:41:35ID:???findといえ
0643nobodyさん
2008/04/12(土) 13:37:27ID:???自分も、するんだったらクエリ発行するしかないと思ってたんだけど、
使った事がないので書かなかった。
findでmax関数ってできるの?
0645nobodyさん
2008/04/12(土) 15:57:22ID:???$this->Model->find('all',array('fields'=>array('MAX(id)')));
>>644
<?php pr($post) ?>でいいよ
0646nobodyさん
2008/04/12(土) 16:42:32ID:???0647nobodyさん
2008/04/12(土) 19:44:31ID:???せっかく、CakePHPのデータベース用ドライバが、
RDBMS間の差を吸収しているのに
フレームワーク使っている意味半減するじゃん。
■ このスレッドは過去ログ倉庫に格納されています