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

【PHP】フレームワーク CakePHP 13ホール目【v2.0】

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

※他フレームワークとの比較等はスレ違いです
テンプレは>>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

前スレ
【PHP】フレームワーク CakePHP 12ホール目【笑】
http://hibari.2ch.net/test/read.cgi/php/1309505626/
0683nobodyさん2012/02/23(木) 22:38:03.57ID:???
複合キーなんて使うなよw
0684nobodyさん2012/02/23(木) 22:40:40.54ID:7dkJC+lD
bar_controllerに、foosテーブルの中身をページネイションさせるとき
$this->paginate = array(
'conditions' => array(
"not" => array(
"Foo.bar" => "false"
)
),
'limit' => 2000,
'order' => array('Foo.date DESC')
);
$this->set('foo', $this->paginator());
と書いたら、「barsテーブルにFoo.barなんてない」ってエラーがでました
コントローラ名からモデルを補完してるんでしょうか?
どうしたらfoosテーブルのデータをページネイションできますか?
ご教示くださいますようよろしくお願いいたします
0685nobodyさん2012/02/23(木) 23:41:08.20ID:7dkJC+lD
$this->set('foo', $this->paginator());

$this->set('foo', $this->paginate('Foo'));
に書き換えたらいけました
0686nobodyさん2012/02/24(金) 04:00:19.56ID:???
モデルにprimaryKeyって必ず定義しないと行けないんですね。
プライマリーキーがないモデルにsaveしようとしたけど、エラー出ました。
0687nobodyさん2012/02/24(金) 09:30:06.44ID:???
>>686
Excelとデータベースの違いから勉強しようぜ
0688nobodyさん2012/02/24(金) 12:24:37.97ID:???
会員→日記
   →写真

のようなアソシエーションで繋がっているテーブルがあったとして、
会員情報を削除した時、その会員が投稿した日記や写真を
削除する必要があります。

その場合、会員情報を削除した後、日記・写真を削除しますか?
それとも全てアソシエーションで繋げてdeleteAllで削除しますか?
0689nobodyさん2012/02/24(金) 13:26:33.24ID:???
>>688
好きにすればいいんじゃね
deleteAllがアソシエーション含んだ削除って誤解してる気がするんだけど気のせい?
0690nobodyさん2012/02/24(金) 13:56:47.10ID:???
関連データも一括で削除するのはdependentだよね
0691nobodyさん2012/02/24(金) 14:01:26.76ID:???
>>689-690
まさに勘違いしてました・・。

アソシエーションの削除が上手く行かないので
自分は個別に削除するやり方をしているのですが、
勘違いだったようです。すみません。
0692nobodyさん2012/02/24(金) 19:09:30.64ID:???
XMLデータの出力って、CakePHP 2.0でどのように行えますか?

find('all')で複数県取得したデータを、1.3まではviewで$xml->serialize()に
データを渡していました。
2.0からはxmlHelper自体が廃止となって、代わりにXml::buildを使えとのことですが、
1.3と同様の複数県のデータを渡すと例外となります。

1.3と同様の結果が取得できるように死体のですが・・・
0693nobodyさん2012/02/24(金) 19:10:11.66ID:???
すみません、複数県→複数件です。
0694nobodyさん2012/02/25(土) 15:36:54.21ID:???
cake1.3を最近使い始めたのですが、
データベースを使うほどじゃない簡単なデータ保存処理のためにtxtファイルを読み書きしたいのですが、どこに置いてもうまくアクセスできません。
自分で用意したファイルにアクセスするにはどうしたらいいのですか?
0695nobodyさん2012/02/25(土) 16:53:26.47ID:???
データベースを使うほどじゃなかったら、cake使わない方が良いよ
0696nobodyさん2012/02/25(土) 17:03:08.52ID:???
テキストファイルのデータを読み込みたいのがデータベースから情報を持ってきてるページなのでそういうわけにもいかないのです・・・
テキストファイル自体は多くて10個程度のワードを保存&編集したいだけなのですが・・・
0697nobodyさん2012/02/25(土) 17:25:39.89ID:???
Cakeが発行する、SELECT COUNT(*) (ページネーションから?)が
ものすごい遅いんですが、解決法はあります?
みなさんどうしてます?
0698nobodyさん2012/02/25(土) 17:33:00.25ID:???
COUNTするのはgroup指定したカラムにすれば良いよ
0699nobodyさん2012/02/25(土) 17:52:58.99ID:???
>>698
ページネーションするときって自動でCOUNT発行されません?
0700nobodyさん2012/02/25(土) 18:04:29.58ID:???
>>694
自分で、model、またはdata sourceを書く。
csvならdata sourceあった希ガス
0701nobodyさん2012/02/25(土) 18:05:54.56ID:???
>>700
ありがとうございます
まずはdata sourceにつ
0702nobodyさん2012/02/25(土) 18:06:37.16ID:???
途中で送信すみませんorz

>>700
ありがとうございます
まずはdata sourceについて勉強してみます
0703nobodyさん2012/02/25(土) 18:19:28.48ID:???
>>702
ベタに書いてもOKな気もすっけど。。
とりあえず、Fileクラスもあるし。
0704nobodyさん2012/02/25(土) 18:21:48.77ID:???
>>703
のちのちワードを編集するので、直書きはできないんです
fileクラスについても調べてみます
0705nobodyさん2012/02/25(土) 22:48:10.62ID:???
1.3.14を使っています。フォームのバリデーションで質問です。
ラジオボタンの場合、項目を選択せずに送信すると
空データではなく、存在しないものとして扱われます。

ですので、バリデーションルールでnotEmptyを指定しても
正しく機能しないのですが、どうすればいいのでしょうか?
0706nobodyさん2012/02/26(日) 13:38:17.41ID:???
hidden
0707nobodyさん2012/02/26(日) 14:15:41.40ID:???
156
0708nobodyさん2012/02/26(日) 16:50:00.76ID:???
>>706
ありがとうございます。勉強になりました。
0709nobodyさん2012/02/27(月) 01:32:01.91ID:???
>>697
Model::paginateCount を 軽い処理で実装するとか
0710nobodyさん2012/02/28(火) 11:46:10.73ID:???
>>697
where句に使用しているカラムにインデックスはるとか、
joinしてるなら、その辺も確認したほうがいい。
0711nobodyさん2012/02/28(火) 15:16:02.31ID:pz8Lp3oa
[動作環境]CakePHP 2.0.6 / PHP 5.1.6 / Apache 2.2

ルーティングで躓いています。
以下のようなコントローラを用意しました。

class EntryController extends AppController {

var $name = "Entry";
var $autoRender = false;

function index(){
die('index');
}

function success(){
die('success');
}
}

http://example.com/entry/
は正しく実行され、'index'が表示されるのですが、
http://example.com/entry/success/
は、Segmentation faultが発生し、Abortします。

routes.php などの設定は、敢えて変更せず使用しています。
同じような現象を経験した方、いらっしゃいますか?(そもそも、2.0.6使っている人いるんだろうか)
0712nobodyさん2012/02/28(火) 15:21:47.73ID:???
success以外でも一緒?
また、http://example.com/entry/index は表示される?
0713nobodyさん2012/02/28(火) 15:25:44.20ID:pz8Lp3oa
>> 712
success以外でも一緒です。
/entry/index もダメです。
/entry/index/abc/def もダメです。
0714nobodyさん2012/02/28(火) 16:50:04.76ID:???
>>711 です。

Router::parse($request->url);
の結果を見ると、以下のようにルーティングが間違っているようです。
array(5) { ["controller"]=> string(7) "success" ["named"]=> array(0) { } ["pass"]=> array(0) { } ["action"]=> string(5) "index" ["plugin"]=> NULL }
Routerがちょっと怪しいので、調べてみます。
0715nobodyさん2012/02/28(火) 17:13:46.37ID:???
>711 です。
/lib/Cake/Network/CakeRequest.php に、おかしな箇所を見つけました。
下記引用の下から5行目、「$baseUrl」なんですが、どこでも宣言されていないのでif自体に意味がないようです。


protected function _base() {
$dir = $webroot = null;
$config = Configure::read('App');
extract($config);

if (!isset($base)) {
$base = $this->base;
}
if ($base !== false) {
$this->webroot = $base . '/';
return $this->base = $base;
}

if (!$baseUrl) {

//★ここを改編したらうまくいった
//$base = dirname(env('PHP_SELF'));
$base = '';
0716nobodyさん2012/02/28(火) 21:52:15.32ID:???
>>715
ソース見てみたけど確かに$baseUrlはどこでも値が入ってないね
0717nobodyさん2012/02/29(水) 02:33:19.83ID:???
1.3系でプラグインの作成方法について質問します。

公式のマニュアルを見ているのですが、
/pizza/pizzaOrders/index
でアクセスする方法は分かるのですが、
/pizza/
でアクセスするにはどうしたら良いのでしょうか?

普通に/app/controllers/pizza_controller.phpを作ればいいと思ったのですが、
作ってもアクセスエラーになります。
これってルーティングの設定になるのでしょうか?
0718nobodyさん2012/02/29(水) 08:54:37.66ID:???
>>709
1000件しか表示しない!って決めたら、
function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
  return 1000;
}
こうしてもいいんですかね?
0719nobodyさん2012/02/29(水) 15:57:45.32ID:OuUO3AKR
>>717
プラグイン関係ない
ルーティングの問題
0720nobodyさん2012/02/29(水) 16:49:35.18ID:???
>>719
了解しました。ルーティングで調節します。
0721nobodyさん2012/02/29(水) 21:04:59.32ID:???
>>717
/app/plugin/pizza/controllers/pizza_controller.php
(要するにプラグイン名と同名のコントローラー)を作って、indexアクションを作れば
ルーター触らなくても/pizza/でアクセス可能だよ。
0722nobodyさん2012/02/29(水) 21:19:59.68ID:???
>>721
出来ました!勉強になります。ありがとうございました
0723nobodyさん2012/03/01(木) 05:51:29.65ID:???
モデルって別にテーブル名じゃなくても良いんだね
同じのでもサイトのコンテンツによって変えてる
0724nobodyさん2012/03/05(月) 10:09:01.94ID:???
2.1 Stableキター
つうかペース早いな
0725nobodyさん2012/03/05(月) 19:23:27.93ID:???
うおおおお
公式サイトも変わってCookBookもなんか綺麗になったー

マイグレーションガイドによると.htaccessの変更が必要という、
アップグレード時に見落としがちな変更があるのにリリース文では触れられてないな・・・
http://book.cakephp.org/2.0/en/appendices/2-1-migration-guide.html
http://bakery.cakephp.org/articles/lorenzo/2012/03/05/cakephp_2_1_0_just_landed
0726nobodyさん2012/03/05(月) 20:11:55.24ID:???
まだ開発中なんだけど、バージョアップすべきなのかな?
0727nobodyさん2012/03/05(月) 20:59:06.49ID:???
リリースしてないならageた方がいいと思う
2.0.xは今までのバージョン系列で一番寿命が短いし、下手したら1.3.xより今後のアップデートが期待できない気がする
0728nobodyさん2012/03/05(月) 23:06:32.47ID:???
>>727
ありがとう。
2.0.x系からならフレームワーク置き換えだけでいいのかな。
0729nobodyさん2012/03/05(月) 23:42:52.00ID:WIGrArNU
>>728
自分の一つ上のレスも見ようぜ!
0730nobodyさん2012/03/06(火) 01:02:47.42ID:???
次の開発案件から2.0系にしようとしてたら、もう2.1・・・。
2.0系は結局書籍も出ずじまいか。
0731nobodyさん2012/03/06(火) 03:40:14.04ID:???
互換性をきっちりしてくれないと困るにょ
0732nobodyさん2012/03/06(火) 21:43:10.65ID:???
>>727
ありがとう。
出来ました(゚ω゚)
0733nobodyさん2012/03/06(火) 22:01:24.25ID:???
2.0リリースが10月半ばだったから5ヶ月経たずに2.1出たのか
2.0は短命だったね・・・
本が出ないのもしょうが無いというか、出してしまっていたらすごい中途半端なタイミングになっていたと思う


1.2 2008/12
1.3 2010/04
2.0 2011/10
2.1 2012/03
0734nobodyさん2012/03/06(火) 23:43:25.94ID:???
Cakeにcreate tableする関数はありますか?
普通にqueryでベタSQL投げないと駄目?
0735nobodyさん2012/03/07(水) 18:16:47.78ID:???
お前らなんか言えよ
0736nobodyさん2012/03/07(水) 22:24:25.29ID:???
お前らがcakeで作ったもので、何を最大どのくらいの期間かかった?
俺はSNSで3ヶ月。
0737nobodyさん2012/03/08(木) 08:15:28.96ID:???
官公庁のシステム
2ヶ月3000万円
0738nobodyさん2012/03/08(木) 09:50:17.49ID:???
>>737
まじかよ。
あぁいう国の案件はどうやって仕事もらうの?

みんなやりたいよね。
0739nobodyさん2012/03/08(木) 10:16:55.80ID:???
てか、2ヶ月って凄いな。
国のシステムだからそんなに凝ったことはしてないだろうけど、
どんな機能があって2ヶ月なんだろ?

0740nobodyさん2012/03/09(金) 11:27:56.60ID:???
犯罪の香りがする
0741nobodyさん2012/03/09(金) 11:43:23.36ID:???
随意契約くさいな
0742nobodyさん2012/03/09(金) 12:57:11.13ID:???
2.0から始めたいのにマニュアルが英語しかないとかwww
0743nobodyさん2012/03/09(金) 13:13:11.92ID:???
英語英語うるせーよ、このスレ小卒ばっかりか?
0744nobodyさん2012/03/09(金) 14:27:27.18ID:???
お前は英語で書けよ
0745nobodyさん2012/03/09(金) 16:18:01.14ID:???
speak english or die
0746nobodyさん2012/03/09(金) 16:24:51.22ID:???
shine!
0747nobodyさん2012/03/09(金) 16:51:22.89ID:???
dieとかwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
エイリアス使ってるバカってまだいたんだwwwwwwwwwwww
0748nobodyさん2012/03/09(金) 16:54:34.34ID:???
fack you!
0749nobodyさん2012/03/09(金) 17:40:19.41ID:???
OUTA MY WAY, WTF!!!!!!!!!!
0750nobodyさん2012/03/09(金) 17:54:30.33ID:???
アソシエーションするとき、プライマリキー以外とforeignKeyで
繋げるにはどうすればいいのでしょうか?
0751nobodyさん2012/03/11(日) 02:18:22.14ID:???
そんなことより誰か複合主キーに対応するためのプラグインを書けよ。な?
0752nobodyさん2012/03/11(日) 10:46:34.94ID:???
ビュー内の$this->Paginator->prev()とかnumbers()で吐き出されるリンクに
PHPSESSIDをくっつけたい(?PHPSESSID=hoge)んだけど、どうしたらいいかな

コアの$html->link()を書き換えたりしたらいけそうだけど、
もっとスマートな方法ある?
0753nobodyさん2012/03/11(日) 11:29:49.63ID:???
>>752
自己解決
'options' =>
array(
'?' => array(session_name() => $this->Session->id())
)
こうした
0754nobodyさん2012/03/11(日) 16:36:31.78ID:???
ソース追ったけどよくわからなかったので質問します。
CakePHPでのCookieを書き込む際に暗号化したデータをJavaScriptで復号するロジックはありますか?
0755nobodyさん2012/03/11(日) 22:15:13.63ID:+TvrXerP
うるせぇ!
いいからCakePHPで複合主キーに対応する為のプラグインを誰か書けや。
な?
0756nobodyさん2012/03/11(日) 23:31:02.18ID:???
>>754
ソース見る限り、Security::$typeで設定した暗号方式でSecurity.salt使って
それをbase64_encodeして暗号化してるっぽいので
それを逆に処理すればJavascriptでも復号化できると思う。
詳しくはcookie componentのソース見て。

だけど、複合に必要なキーのSecurity.saltをJavascriptに
書かないといけないので、そもそもなんで暗号化したんだって
ことになるので設計を見なおしたほうがいい。
0757nobodyさん2012/03/12(月) 00:06:16.05ID:uEcRtOSh
>>754
老婆心ながら、>>756が言っていることを強調しておく。
設計を見直せ。salt の意味がない。
0758nobodyさん2012/03/12(月) 13:24:30.73ID:???
よくある返信不可のメールアドレスって
@以前のユーザ作成してるのかな?noreplyみたいな
存在しないアカウントをreturn-pathに設定してメール送ってるのかな?
0759nobodyさん2012/03/12(月) 16:18:31.39ID:???
UI含めて設計について相談です。

複数チェックボックスを使って、チェックした項目をDBに登録し、
後から検索できるようにしたいと思います。疑問は2点。

1:テーブルの1つのカラム内にカンマ区切りで登録するのでしょうか?
2:その場合、conditionsで検索できるのでしょうか?
0760nobodyさん2012/03/12(月) 17:53:27.28ID:???
画像のサイズ別のURLって、
テーブルに保存してますか?
afterFindなどで組み立ててますか?
それとも、ビューでその都度組み立ててますか?
0761nobodyさん2012/03/12(月) 18:10:15.80ID:???
ビューで変えてます。携帯用の画像とか。
0762nobodyさん2012/03/12(月) 19:45:42.19ID:???
>>759
1は好きにしたらいい
2はインデックス当たらなくていいならできる
0763nobodyさん2012/03/12(月) 19:58:56.46ID:???
>>762
どうやって検索するのでしょうか?
1カラムにカンマ区切りのレコードがあったとして、
それをCakeのconditionsで検索する方法がわかりません
0764nobodyさん2012/03/12(月) 21:01:20.27ID:???
>>763
cakephpに配列をシリアライズして
登録するプラグインあるから、それ使え。
0765nobodyさん2012/03/12(月) 21:33:33.63ID:???
わかりました。探してみます
0766nobodyさん2012/03/12(月) 21:53:31.19ID:???
>>763
SQLのLIKEはわかってんのかな?
0767nobodyさん2012/03/12(月) 22:27:22.65ID:???
小一時間探しましたが、save時にシリアライズできるものの、
find時にconditionsで絞り込むのは無理みたいですね・・。
>>766
はい。それは分かりますが、登録されている値が
「1,10,11」みたいな場合、likeは利かないと思います。
0768nobodyさん2012/03/12(月) 23:32:17.51ID:???
>>756
>>757

ありがとうございます。
サーバサイドのJSでの実装を考えているため、種が漏れることはないと考えています。

ご回答/ご指摘ありがとうございました。
0769nobodyさん2012/03/12(月) 23:45:06.08ID:???
>>767
ソート順さえあっていれば、1かつ10かつ11なら column LIKE '%1,%10,%11,%' とかでいけるんじゃないの
ソートしてないのなら column LIKE '%1,%' AND column LIKE '%10,%' AND column LIKE '%11,%'
0770nobodyさん2012/03/12(月) 23:58:59.56ID:???
>>769
さすがにひどい。

>>767
方法1.「ビット演算 チェックボックス」でぐぐれ。
方法2.項目ごとにカラムを分ける。
0771nobodyさん2012/03/13(火) 02:48:15.55ID:???
脆弱性対策は大事だよ
http://www.1x1.jp/blog/2012/03/mass_assignment_vulnerability_cakephp.html
0772nobodyさん2012/03/13(火) 10:18:36.45ID:???
>>767
もっと頭使おうぜ
1,10,11
ではなくて
001,010,011
みたいにすれば、like %001% で検索できるだろ。
あくまで1例だから、データに何がくるかによって
良い実装があると思うので、よく考えて。
0773nobodyさん2012/03/13(火) 12:48:03.37ID:???
俺ならHABTMにしちゃうね
07747602012/03/13(火) 13:20:03.94ID:???
>>761
ビューが条件分岐だらけになりませんか?

if (!empty($post['Post']['image_filename']):

....

else:

こんな風に。

$post->getImageUrl(array('mobile' => true));
みたいに書けたらいいんですけどねぇ・・・
0775nobodyさん2012/03/13(火) 13:39:42.66ID:???
>>774
Helperつくれば?
0776nobodyさん2012/03/13(火) 13:45:55.38ID:???
>>775

そうなんですけど、
モデルの返り値が配列じゃなくてエンティティなら、
もっとスマートに書けるのに、と思いまして・・・

これがCake流なんですかね
0777nobodyさん2012/03/13(火) 13:53:09.13ID:???
>>772
その考えはありませんでした。勉強になります!

ビット演算の事を>>770さんから教えていただき勉強しましたが、
数学が苦手な私の頭ではさっぱりで、
単純にテーブルを分ける(Cake的にhasMany)を考えていました。

テーブルを分けて正規化する方法も一般的なようですが、
正直、チェックボックスを使用するカラムが必要な度に
テーブルを生成するのもどうかと思い、悩んでいました。

772さんの方法も視野に入れて設計面を工夫してみます。
みなさん、ありがとうございました。
0778nobodyさん2012/03/13(火) 22:24:16.17ID:???
likeなんか使ったらインデックス使えなくて
遅くなるだろw
0779nobodyさん2012/03/13(火) 23:03:53.03ID:???
>>776
エンティティが返ってこないのが俺がCakeが嫌いな理由の一つではある。
07807762012/03/14(水) 03:34:06.02ID:???
CakeEntityなんてのもあるみたいですが・・・

今はYiiを調べてる。
0781大便2012/03/15(木) 08:30:03.53ID:UhuckWxP
ペニー秋田は犯罪です。
早速ペニーオークションで破産しました。
0782nobodyさん2012/03/15(木) 15:50:54.34ID:???
>>778
別にLIKE使ったからってインデックス効かなくなるわけじゃないから
■ このスレッドは過去ログ倉庫に格納されています