トップページ⇒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
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を使うようですね。こちらを使用します。
0683nobodyさん2011/01/26(水) 15:13:15ID:???
$data = $this->User->findById($id);
if (empty($data)) {
 Configure::write('debug', 0);
 $this->autoLayout = false;
 $this->layout = "";
 $this->cakeError('error404');
}

と言うコードを書いて、Userモデルに$idの値が無いと、
404のエラーページを出したいと思っています。

上記のコードをapp_controllerのbeforeFilterに書いてるのですが、
404にはなるものの、レイアウトが維持されています。
単なるブラウザが吐き出す404の表示にするにはどうすればいいのでしょうか?
0684nobodyさん2011/01/26(水) 16:19:14ID:???
redirect()してexit()か_stop()すればおk
0685nobodyさん2011/01/26(水) 18:10:59ID:???
>>684
$this->redirect($this->cakeError('error404'));
$this->_stop();

こうでしょうか?特に>>683の状態と変化ありません。
0686nobodyさん2011/01/26(水) 18:42:15ID:???
cakeErrorから離れろよ。あとAPIよく読め。
0687nobodyさん2011/01/26(水) 18:46:08ID:???
>>683
単なるブラウザがはき出す404というのが、よくわからん。
404 Not Found でも、サーバーから 404 Not Found のページをはき出すと思うが
0688nobodyさん2011/01/26(水) 23:08:01ID:???
今から勉強すれば
しばらくは、これで食っていけますか?
0689nobodyさん2011/01/27(木) 01:08:25ID:???
何を作るかが重要だけど
0690nobodyさん2011/01/27(木) 13:53:36ID:???
勉強しただけで食えるなら誰でもやってるだろう
0691nobodyさん2011/01/27(木) 14:03:44ID:???
十分条件じゃなくて必要条件だろ
0692nobodyさん2011/01/27(木) 18:20:00ID:???
前に「Cakeの使い方教えてください」的な仕事の依頼をどこかで見た気がするw

以外と使いこなしている人少ないから、
勉強して覚えれば講師業が出来るかも??
0693nobodyさん2011/01/27(木) 21:42:07ID:???
CakePHPで運営されてる大手サービスってありますか?

CakePHPで儲かるシステム作れますか?
0694nobodyさん2011/01/27(木) 21:48:50ID:???
あります
作れます
0695nobodyさん2011/01/27(木) 22:29:11ID:???
トピックイットとFirefoxのアドオンサイト以外で
有名な大手サービスってどこ?
0696nobodyさん2011/01/27(木) 23:01:46ID:???
book.cakephp.orgのサイトが重すぎるんだけど
これはCakePHPの使えなさを表していると見てOK?
0697nobodyさん2011/01/27(木) 23:07:24ID:???
実はcookbookはCakePHPを使ってなかったりして
0698nobodyさん2011/01/28(金) 00:40:18ID:???
>>694
CakePHPで運営されてる大手サービスって何があるよ?
0699nobodyさん2011/01/28(金) 00:44:07ID:???
大手と言えるのかは知らんがnanapiとか
0700nobodyさん2011/01/28(金) 00:56:22ID:???
CakePHPで運営ってなによ
運営の意味も分からないの?氏ねばいいのに
0701nobodyさん2011/01/28(金) 01:49:29ID:???
>>699
他には何かあるのかな?
そもそもCakePHPって世界で盛り上げて行こう!って動きなのかな?

セキュリティー関連とかの対策プラグインとかも次々更新されてたり、新しいプラグインも作られてるのかな?

世界で有名なサイトとか、これで構築されてたら感動する。
0702nobodyさん2011/01/28(金) 01:52:03ID:???
10万人規模の会員サイトには耐えられないんじゃないかな
0703nobodyさん2011/01/28(金) 02:01:22ID:???
ttp://puyo2.upper.jp/cake/files/cakestudy20080220_remora.pdf
0704nobodyさん2011/01/28(金) 02:50:50ID:???
nanapiの開発日記?かなにかの資料見たけど、
動的な部分は素のPHPや別のシステムを使ってるっぽかった。
キャッシュもmemcacheを使ったり。

ま、それが普通だよな。Cakeだけでこなすにも重いもんな。
0705nobodyさん2011/01/28(金) 03:17:15ID:???
cakeでmemcacheつかえんじゃん
0706nobodyさん2011/01/28(金) 12:33:42ID:???
フィールド「open_time」がMySQLのフィールドタイプでtimeなんだけど、
モデル内で
function getTime(){
return $this->data['Shop']['open_time']['hour'].':'.$this->data['Shop']['open_time']['min'].':00';
}
としたら、配列hour内に格納されている値は10なのに
1に変更されてしまうのは仕様?
0707nobodyさん2011/01/28(金) 12:47:02ID:???
>>706
それは知らないけど。
なぜsecに0を入れないのか。
0708nobodyさん2011/01/28(金) 13:22:11ID:???
>>707
secの配列は用意してないんで。
もしかしてそれが原因とかあるのかな?
0709nobodyさん2011/01/28(金) 15:22:25ID:???
サイトがCakeで作られてるかどうかなんて
表示されてなきゃわからないよね?
0710nobodyさん2011/01/28(金) 16:21:34ID:???
自己申告からしか分からないだろJK
(サイト内での表示や言及を含めて)

まあ食わされるCookieのキーがデフォルト"CakePHP"だったりとか
Routingがあきらかに(Railsではなく)Cake風それだったりとか
DOMの構造があからさまにBakeした「それ」だったりとか
そういうことはあるかもしれんが、ちゃんと作ってあるものからは分からない
■ このスレッドは過去ログ倉庫に格納されています