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

【PHP】フレームワーク CakePHP 10ホール目【v1.3】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/11/01(月) 21:43:26ID:???
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです
CakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう

※sage推奨
※質問時もsageること
※他フレームワークとの比較等はスレ違いです
テンプレは>>1-5くらい

■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
the Bakery
http://bakery.cakephp.org/
CakeQs
http://cakeqs.org/
CheatSheet (PDF)
http://cakephp.org/files/Resources/CakePHP-1.2-Cheatsheet.pdf
github - cakephp
http://github.com/cakephp

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
http://book.cakephp.org/ja
0583nobodyさん2011/01/14(金) 14:38:02ID:???
ViewのテンプレートをデザイナーやPHPプログラマー以外に
触らせるのって無茶だと思うけど、どう思う?
0584nobodyさん2011/01/14(金) 14:39:20ID:???
>>583
どういうこと?営業とか?
0585nobodyさん2011/01/14(金) 14:45:30ID:???
>>584
いやそうじゃなくて、テンプレ内に専用コードが入って複雑にならない?
MVCの考え方から、Viewで処理する物はテンプレート内に書くけど
CakeのコードやらPHPのコードやら入るこむから
テンプレが複雑になって、Cakeに詳しくない人間は編集できないと思う。
0586nobodyさん2011/01/14(金) 14:45:56ID:???
ctpそのまま使うってこと?ありえないw
普通何らかのテンプレート使うだろ
0587nobodyさん2011/01/14(金) 14:47:37ID:???
そうなのか?Smartyを間に入れるとか?
あんたの言う「普通」ってはじめて聞いたな。
みんなctpに処理を書いていると思ってたよ。
0588nobodyさん2011/01/14(金) 14:51:43ID:???
ctpよりSmartyがいいときってどういう時?
Smarty使ってたら逆に複雑になると思うんだけど。
0589nobodyさん2011/01/14(金) 14:53:46ID:???
じゃ、「何らかのテンプレート」ってどういう意味?
0590nobodyさん2011/01/14(金) 15:00:10ID:???
扱うデータが多すぎて、1つのコントローラにモデル20個ぐらい使うんだけど
これって設計がおかしいのだろうか
しかしテーブル最適化するとそのくらいに増えてしまうのだよな…とにかくデータが多すぎて
1つのテーブルにまとめるとカラム数が凄いことになるし
0591nobodyさん2011/01/14(金) 15:00:20ID:???
なんにしても、デザイナーでもプログラマーでもない人間が
ビューを触るケースというのが想像できない
0592nobodyさん2011/01/14(金) 15:06:09ID:???
デザイナーがPHPわからないケースもあるんじゃない?
知り合いがデザイナーにctpいじらせて不具合起こされまくってた
0593nobodyさん2011/01/14(金) 15:06:11ID:???
>>583-589,591

運用スタッフにコンテンツを更新させるなら何らかのCMS的な仕組み作っとけ
0594nobodyさん2011/01/14(金) 15:08:37ID:???
文言変更や画像差し替えぐらいならそれでいけるけど
html編集まで必要だと厳しくないか?
0595nobodyさん2011/01/14(金) 15:29:30ID:???
Wordpressなんかのテンプレートぐらい作れる程度のPHPの知識がある
デザイナーはいっぱいいるとは思うけど、
でもcakeのviewファイル自体はプログラマーがいじるもんだと思ってる。
05965882011/01/14(金) 15:30:13ID:???
>>589
だからctpで十分じゃないかなって意味だった。
ウチで開発した時はコーダの作ったHTMLをテンプレートに当てはめる係がいたな。
その人はctpもHTMLやCSSやJavaScriptのコーディングもどっちも面倒見れる人
0597nobodyさん2011/01/14(金) 16:33:54ID:???
>>596
ああ、あんたは>>586じゃないんだな。それなら俺も同じ意見だな。
>>594
html編集が必要な場面って結構あるからな。
ページ内に説明文追加する時とか。追加じゃなくても変更とか。
その時、どうやったってctpを変更しなくちゃいけないけど、
CakeやPHPの知識がない人間が触るのは厳しい。
「あれ?そうすると、デザインとプログラムの分業って出来ないんじゃねぇ?」
って思ったんだよ。
0598nobodyさん2011/01/14(金) 16:52:49ID:???
やっぱ業務だと作業進行中にデザインの変更とか入ること多いの?
0599nobodyさん2011/01/14(金) 17:14:20ID:???
>>598
いざデザインを適用してみて動かしてみると色々変えたくなる
1枚ペラで見てたのとページ遷移した流れで見たデザインのイメージって結構違うものだなって感じる
0600nobodyさん2011/01/14(金) 17:26:57ID:???
フレームワーク使ってない時は、

DBからデータ取得→foreachで該当するデータを処理→ビューに出力

ってやってた。そうすれば極力、ビューにPHPのコードを書かなくて済むし。
でも二度手間だし、コントローラーでビューの内容を変更するのも違和感があって止めた。
0601nobodyさん2011/01/14(金) 17:49:38ID:???
何言いたいのかわからんけど
フレームワーク使ってるとそれと同じような事やってるじゃん
モデル、コントローラでぐるぐるデータ回して、
最後にビューでも回してるよ
0602nobodyさん2011/01/14(金) 18:02:52ID:???
>>601
説明不足ですまん。

$list = $this->Member->find('all');
$output_list = array();
foreach ($list as $i => $col) {
 $output_list[$i] = $col;
 $output_list[$i]['Member']['body'] = nl2br($col['Member']['body']);

 if ($col['Member']['image'] != "") {
  $output_list[$i]['Member']['image_url'] = Router::url('/img/') . $col['Member']['image'];
 }
}

みたいなことをコントローラーでやって、
ビューでは最小限のコードでforeachして出力するってこと。
0603nobodyさん2011/01/14(金) 19:00:07ID:???
すみません、CakeDCで公開してる、usersプラグイン使ってみた人いますか?
README見てもさっぱり使い方がわからない。
いい参考ページあったらおしえてください。。。
0604nobodyさん2011/01/14(金) 19:08:10ID:???
>>602
それちょっといじりたいときにコントローラ弄らなくちゃダメじゃない?って思ったら>>600に書いてあったw
フレームワーク使ってる場合はどっちみちビューでforeachするから$listの時点で十分扱いやすい形になってるなと思う
0605nobodyさん2011/01/14(金) 20:10:12ID:???
>>604
そもそもの話のネタが「デザイナーにテンプレいじらせるのって無理じゃない?」
って事だからね。ビューに手を加えるよりも、コントローラーに手を加える方が
プログラマーとしてはやりやすいし、デザイン変更も対応しやすいから。
ま、MVCに反するから今は>>602みたいに書いてないけどね。
0606nobodyさん2011/01/17(月) 11:39:15ID:???
お問い合わせフォームのメールアドレスに
空白入れて送信される場合があるんだけど、save前に

$this->data['Inquiry']['email'] = trim($this->data['Inquiry']['email']);

ってする以外にお手軽な方法無いですかね?
0607nobodyさん2011/01/17(月) 11:50:52ID:???
$('form').submit(
 function() { $('#email').val($.trim($('#email').val()); }
);

検証してないから動かなかったらごめんね
0608nobodyさん2011/01/17(月) 13:57:08ID:???
つまりjQueryで対処するんですね。
Cakeのモデル処理で出来るかな?と思ったのですが、
>>606みたいなやり方以外無さそうですね。
0609nobodyさん2011/01/17(月) 15:06:42ID:???
はぁ?
なんでバリデーションしないの?
アホなの?死ねよ屑が
0610nobodyさん2011/01/17(月) 15:24:13ID:???
酷い言われようでワロタww
0611nobodyさん2011/01/18(火) 00:57:16ID:???
>>606
つ beforeValidate()
0612nobodyさん2011/01/18(火) 01:57:53ID:???
は?
beforeValidate?
普通にバリデーションルール書けばいいだけだろうが
アホしかいないのかよここは。
0613nobodyさん2011/01/18(火) 06:22:24ID:???
適当に書いておけば顕示欲の強いバカが勝手に答えてくれるから楽で仕方ない
>>609=>>612
あざーっす^^^^
0614nobodyさん2011/01/18(火) 07:47:03ID:???
何が起きてるんだ……
0615nobodyさん2011/01/18(火) 08:17:12ID:???
trimで余計な空白消して対応しようってのがやろうとしてることじゃないのか?
validationで弾いてどうすんだよ
0616nobodyさん2011/01/18(火) 10:30:08ID:???
>>606 がなにをしたいのか書いて無いからなぁ。
trim()使ってるところを見ると、半角スペースだけのデータになるのが嫌なのか、
それともメールアドレスのカラムに半角スペースだけで問い合わせされるのがダメなのか、
どっちなんだ。

まぁ、コントローラーのbeforeFilter()でtrim()して、
モデルのバリデートでrule => email, allowEmpty => false を使うのが良いと思うが。
beforeFilter() ではちゃんとアクション名の確認や、$this->data['Inquiry']['email']の有無は調べてからな。
0617nobodyさん2011/01/18(火) 13:36:46ID:???
だから!!
rule=>emailの時点で半角スペースだけの入力は弾かれるだろ
アホはシネ
答えるな
0618nobodyさん2011/01/18(火) 14:02:09ID:???
お前な、サイト運営したこと無いのかよ。
素人がスペース認識できずに「なんでエラーになるの!」って
クレーム言ってくる場合があるんだよ。もう少し頭使えよ。
0619nobodyさん2011/01/18(火) 14:13:29ID:???
おいおい

emailアドレスに半角スペース入れる
rule=>emailのエラー文として「正しいEmailアドレスを入力してください」

なにが問題あるんだ?素人もクソも関係あるかよ
0620nobodyさん2011/01/18(火) 14:16:26ID:???
emailの前後に空白入れられるってことか。
Email欄に空白だけで登録してくるんだと思ってたわ
だったらbeforeValidateでtrimでいいや
そんなケース聞いたことないわ

それかもう一個ルール追加してemailルール検査前に空白が入ってないか調べてそれ用のエラー文はく
0621nobodyさん2011/01/18(火) 15:06:02ID:???
質問の内容に嘆くのは勝手だけどみっともないから黙っててほしいわ
0622nobodyさん2011/01/18(火) 15:07:53ID:???
入力に対してtrim()は基本だろ。
まぁ全角スペースもあるからほんとはもう一工夫必要だけど。
0623nobodyさん2011/01/18(火) 15:57:16ID:???
>>616
controllerで$this->dataをいじるとユーザーの入力値をいじることになるから
なるべくmodelで対応したほうがトラブりにくい
このケースはどっちでも良いけど
でもなるべくmodelでやるべきことはmodelほうがベターかと
0624nobodyさん2011/01/18(火) 18:41:15ID:???
>>623
俺はコントローラーの仕事だと思うけどなぁ。
もしかしたらコントローラーじゃないかもしれないけど、
モデルだと遅いと思うんだが。
コントローラー内でNULLバイト攻撃されないように、
なるべく早い段階で、入力値からNULLなどを削るようにしてるんだ。
trimは実はbeforeValidateと迷ったけど、
まぁ似たような処理なのでついでにやってる感じ。
コントローラーで入力値をいじるとトラブルになるかな?
0625nobodyさん2011/01/18(火) 20:23:47ID:???
お知らせをトップページでは5件表示して「一覧」を押すと
ページネーション出来る表示の仕方ってあると思います。

自分はコントローラーのアクション毎に分けて
function top_news() // トップページに表示させるお知らせ。find()で取得
function news_list() // 「お知らせ一覧」ページで表示。paginate()で取得

としているのですが、みなさんはどうしてますか?
findでデータを取得するだけだから、1つの関数内にまとめて、
件数で分岐したりしているのでしょうか?
0626nobodyさん2011/01/18(火) 20:37:24ID:???
トップページはrequestActionで取得。キャッシュして
一覧は普通にnews/indexで。
0627nobodyさん2011/01/18(火) 20:58:26ID:???
>>626
自分もトップページでrequestActionして取得しているのですが、
その時、取得するアクションって>>625に書いたように分けていますよね?
つまり、

■トップページの「お知らせ」箇所のビュー
$list = $this->requestAction('/top/news');
■トップページ一覧
コントローラーのfunction indexでpaginateしてデータを取得して、ビューに出力。
0628nobodyさん2011/01/18(火) 20:59:47ID:???
↑すみません、書き間違えました。

■トップページの「お知らせ」箇所のビュー
$list = $this->requestAction('/top/news');
■お知らせ一覧
Newsコントローラーのfunction indexでpaginateでデータを取得して、ビューに出力。
0629nobodyさん2011/01/18(火) 21:21:44ID:???
わけてないよ
paginateで取得させれば
requestActionのURLにlimit:10とかつければその数取得できるじゃん
0630nobodyさん2011/01/18(火) 21:24:20ID:???
あ、indexとは分けてるよ

function indexはほぼbakeしたままを
requestAction用には別のメソッドつくってそこでpaginateしてる

てか、本当はindex()アクションで
if ($this->params['requested']) {
return $this->paginate();
}
ってやるのがベストかな
0631nobodyさん2011/01/18(火) 21:26:37ID:???
ああ、627さんの言ってる意味がわかりました。
トップページの一覧では
$list = $this->requestAction('/news/index/limit:3');
みたいにするんですね。fieldの指定を変えたい場合は、ifで分岐させると。

自分はトップページならTopコントローラーですべてをまとめていたのですが、
やり方が間違っていたようです。参考になりました。ありがとうございます。
0632nobodyさん2011/01/18(火) 21:29:49ID:???
そうそう。

あと>>630はたぶんエラーでるな
if ($this->params['requested']) {
↓
if (!empty($this->params['requested'])) {
こうじゃないとrequestActionじゃないときにエラー吐くと思うわ
0633nobodyさん2011/01/20(木) 02:41:53ID:???
ClassRegistryで取得したモデルからpaginateに繋げる方法って無いですかね?
findの場合、こんな感じで行けるのですが・・・
$User = ClassRegistry::init('User');
$data = $User->find('all');
0634nobodyさん2011/01/20(木) 03:38:21ID:???
うん。設計しなおせ
0635nobodyさん2011/01/20(木) 04:24:58ID:???
ぐぐったら必ず1.2の情報ばかり出てくるのにいい加減ムカついてきた
今みんな1.3使ってるのではないの?
0636nobodyさん2011/01/20(木) 13:21:05ID:???
互換な点が多いから、わざわざ1.3で書き直してないだけ。1.2の情報はほとんど使える。
0637nobodyさん2011/01/20(木) 14:06:58ID:???
素朴な疑問だけど、ポータルサイト(例えばトピックイットみたいな)
の場合のキャッシュってどういう考え方したらいいの?

動的サイトだから定期的に表示される内容が変わるよね?
だからビューキャッシュしても意味ない気がするんだが。
「○○一覧」とか出来るだけ動的ではない箇所をelementキャッシュするとか?

自分の認識が間違っていると思うので、どなたか駄目出ししてください。
0638nobodyさん2011/01/20(木) 16:24:13ID:???
更新処理は知ったら消せばいいと思ったりしないのか?お前の脳みそは
0639nobodyさん2011/01/20(木) 17:35:30ID:???
ビューじゃなくてデータをキャッシュするのは駄目なん?
0640nobodyさん2011/01/20(木) 17:41:50ID:???
データというかモデル
0641nobodyさん2011/01/20(木) 18:17:57ID:???
モデルキャッシュは良いですね。
ポータルサイトの場合、ログインして表示・非表示と切り替えることは多いし。

と言うわけでモデルキャッシュのやり方を調べます。
0642nobodyさん2011/01/20(木) 20:16:03ID:???
ビヘイビア誰か作ってるよ
てかモデルのキャッシュならmysqlのqueryCache有効にしたらほとんど恩恵なくない?
0643nobodyさん2011/01/21(金) 10:51:57ID:???
レンサバだとMySQLの設定はほとんど触れないからね
0644nobodyさん2011/01/21(金) 11:08:22ID:0or6NBGg
>>633
$this->paginate['User']
0645nobodyさん2011/01/21(金) 11:30:38ID:???
queryCacheはデフォで有効じゃね
普通
0646nobodyさん2011/01/21(金) 13:49:06ID:???
おれはrequestAction結構使うからなぁ
モデルのキャッシュとかqueryCacheじゃ不十分。
エレメントをキャッシュせんことには始まらん
0647nobodyさん2011/01/21(金) 15:51:15ID:???
>>644
そうじゃなくて、$this->paginate($User) こうじゃね?
0648nobodyさん2011/01/21(金) 16:05:11ID:???
appを管理用と公開用とで分けてるんだけど、
管理画面で更新したら、公開用のキャッシュを削除したり出来る?
やっぱ、普通にulink(キャッシュまでのパス) 書くしかないの?
0649nobodyさん2011/01/21(金) 22:30:15ID:???
>>648
bootstrap.php に定数のCACHEを定義してみたら。
やったことないけど。
0650nobodyさん2011/01/21(金) 22:37:20ID:???
app_controllerわけてるだけならキャッシュの場所同じじゃないの?
cacheClear関数だっけ?で消せるんじゃないの?
つーかやってみろよ
0651nobodyさん2011/01/21(金) 23:55:41ID:???
>>650
clearCacheですね。
あと、app分けるとtmpの場所も別ですね。
キャッシュされるファイルも別だから、別の方が良いし。

自分がググった範囲では結局、ulinkでファイル指定して削除する方法を
取っている人が多い印象を受けました。clearCacheは万能でないみたいだし。
0652nobodyさん2011/01/22(土) 00:02:13ID:???
そこまでわかったなら勝手にしろよ
0653nobodyさん2011/01/22(土) 00:03:28ID:???
APP分けるとかアホじゃないのとしか思えんからどうでもいいわマジで。
0654nobodyさん2011/01/22(土) 00:11:09ID:???
横だけど、どうしてアホなの?
0655nobodyさん2011/01/22(土) 00:25:46ID:???
定数、変数、その他共通のを持てない
キャッシュディレクトリもわかれてるww
くそ
あほ
0656nobodyさん2011/01/22(土) 01:00:32ID:???
やたら煽るようなレスしてるのはリアルで惨めだから?
どうでもいいけど
0657nobodyさん2011/01/22(土) 01:16:48ID:???
> 定数、変数、その他共通のを持てない

え?ネタだよね?
0658nobodyさん2011/01/22(土) 01:21:34ID:???
キャッシュディレクトリ別って時点で
普通にやったら定数共通じゃないってことだろうがw
あほかお前
しねよくず
0659nobodyさん2011/01/22(土) 01:33:26ID:???
なぜadminルーティングじゃだめなのか
0660nobodyさん2011/01/22(土) 01:43:27ID:???
ファイル数が増えすぎるから
0661nobodyさん2011/01/22(土) 01:45:37ID:???
まーた、一人はファビョってる馬鹿がいるな。
こいつ、このスレずっと常駐してるよね。前から。
リアルで惨めだからここで吠えるしかないんだろうね。可哀想。
0662nobodyさん2011/01/22(土) 01:48:31ID:???
ファイル数は同じじゃないの?
その整理に問題があるってこと?
0663nobodyさん2011/01/22(土) 14:04:08ID:???
それよりおまいら、Securityコンポーネントとか、
$Form->scure() とか、使ってる?

なんというか、「帯に短したすきに長し」なんだよな

まあ、何の目的を達成するかによるんだろうけど、

・CSRF攻撃対策
・(Cake特有だが)$data['Post']['hoge']フィールドのデータぶち込み攻撃に対する対策
 (いちいちwhitelist記述すれば防げるが)
・簡単にワンタイムトークンを発行したい
・機械的なスパムに対するシンプルな防御(完全ではないが)

みたいな話が入り交じってるからややこしいが

みんなそこらへんどうしてる?自前実装?
0664nobodyさん2011/01/22(土) 14:28:24ID:???
基本的にCakeで用意されている機能なんて
業務用には使えないと思うが
よって普通自前でしょ、少なくとも改造
0665nobodyさん2011/01/22(土) 16:21:41ID:???
>>664
レスどうもです。
まあ、その辺はみんな自前か。

しかし、
> 基本的にCakeで用意されている機能なんて
> 業務用には使えない

コレ言っちゃうとCake使う意味がかなり希薄になるなw
0666nobodyさん2011/01/22(土) 16:46:18ID:???
セキュリティコンポーネントは使い物にならないとは思うけど、
業務用に耐えうるものかとかいう議論はそもそもPHPがということになってくるから
ナンセンスじゃないかなー
0667nobodyさん2011/01/23(日) 00:35:40ID:???
業務用って言いたかっただけでしょ。
0668nobodyさん2011/01/23(日) 17:28:31ID:???
SessionとかCookieもぶっちゃけ、PHPの関数そのまま使えばいいもんな。
Cakeの機能で便利なのはAuthとFormヘルパーぐらい。
メール送信とかファイルアップロードとか自作してる。
0669nobodyさん2011/01/23(日) 19:08:19ID:???
1つのフィールドに複数のバリデーションがあった場合のrequiredは
全てのバリデーションに書くものなの?
http://book.cakephp.org/ja/view/129/required
を見ると、フィールドが1つの例だからrequiredを一つ書けば良いけど、

複数のルールを書く場合の例の
http://book.cakephp.org/ja/view/133/
を見るとそれぞれに
// like on, required, 等、他のキーをここに書く...
と書いてあってrequiredの意味がよくわからなくなった。
06706692011/01/23(日) 19:24:17ID:???
必須なフィールドの場合は始めのルールをnotEmptyにしておいてその中だけrequiredを書けばいいですよね?
全部のルールにrequiredを書かなければいけないケースがわからない
0671nobodyさん2011/01/23(日) 20:57:47ID:???
自分が正しいと思うやり方でおk
0672nobodyさん2011/01/23(日) 22:32:32ID:???
またCakeの不可解な行動を見つけてしまったので共有
1.3.2
http://book.cakephp.org/view/999/Using-other-Components-in-your-Component
コンポーネントAから別のコンポーネントBを使っていたのだが動作がおかしいので調べてみたら
Bのstartupが実行されてなかった
Aのstartup内で$this->B->startup($controller);としたら期待通り動いた
こういうもんなの?
なんでこうなの?
なんでマニュアルにこういうこと書いてないの?
なんで誰も文句言わないの?
0673nobodyさん2011/01/23(日) 23:48:08ID:???
BというコンポーネントでAというコンポートネントが動いていたら、
どうなるんだろうと思ってしまった。
0674nobodyさん2011/01/24(月) 01:56:53ID:???
Authの認証モデルが「User」で、UserはProfileとhasOneの関係だとします。
ログイン後に、$this->Auth->user()でログイン情報を取得しようとしたのですが、
Profileの内容が返り値に含まれていません。
アソシエーションをしている情報は取得できないのでしょうか?
0675nobodyさん2011/01/24(月) 15:47:44ID:???
COOKBOOKの開発例「11.2 ACL を制御するシンプルなアプリケーション」どおりにやれば取得できるよ
0676nobodyさん2011/01/24(月) 22:02:29ID:???
1.3.7が来てるな
日本語の方は更新されてないけど
0677nobodyさん2011/01/24(月) 22:09:20ID:???
>>675
そこを見てるのですが、>>674に該当する箇所が見あたりません・・・
0678nobodyさん2011/01/25(火) 14:23:31ID:???
COOKBOOKってモモの使い魔かとおもた
0679nobodyさん2011/01/25(火) 15:27:57ID:???
$html->metaを使って
<meta http-equiv="REFRESH" content="5;url=http://google.co.jp/">
を置き換えたいのですが、どういう書き方をすればいいのでしょうか?
0680nobodyさん2011/01/25(火) 16:49:55ID:???
>>679
質問の答えになっていないけど、直接タグ打ちじゃいけないの?
URLの部分だけを動的にしたい場合は $html->url() を使えばいいわけだし
0681nobodyさん2011/01/25(火) 16:59:59ID:???
$html->meta(array('http-equiv=>'REFLESH', 'content'=>'5;url=http://google.co.jp/'))
とかでいいんじゃないの?
0682nobodyさん2011/01/25(火) 19:32:08ID:???
>>680
ビューからレイアウトに挿入したいと思いまして、
$html->meta使うのかと思っていました。

調べたところ、$html->addScriptを使うようですね。こちらを使用します。
■ このスレッドは過去ログ倉庫に格納されています