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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん2011/02/16(水) 21:52:35ID:zCTGjUMq
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
0904nobodyさん2011/06/09(木) 21:02:53.56ID:???
>>903
大丈夫、噛み合ってるw

modelを直で使えればと俺も思うが、多分厳しい。
苦労するよりは、WebサービスとしてバックエンドでCakeを使うのが
色々と使い回しが効いて良いと思う。
ちなみに今フロントは.netで作って、DBアクセス周りはCakeでWebサービス、
という構成でシステム作成中。
0905nobodyさん2011/06/09(木) 22:16:01.93ID:???
>>904
なるほどな。やっぱりバックエンドで使う方が良いよな。
今フロントもCakeで作ってるんだが、
単なるブログのようなものでも重い重いw
0906nobodyさん2011/06/10(金) 22:19:33.22ID:???
サイトの一部だけCakeにする場合、Apacheウェブルートにcakeをもってきて
非Cakeのファイルをwebroot以下に置くのと、
Apacheウェブルート下の特定のディレクトリにCakeを置くのどっちがいいかな?
後者のほうが融通はきくと思うんだけど。
0907nobodyさん2011/06/10(金) 23:52:41.41ID:???
俺は後者だな。君の言うように融通が利くし。
0908nobodyさん2011/06/14(火) 18:45:46.48ID:???
ショッピングサイトとかで、注文のデータを保存するとき、
別のデータ(例えば注文と商品を結びつけるレコードなど)を同時に保存するとき、
両方がバリデーション通ったときのみ、両方を保存する、
としたい場合どういうコード書いてる?

今悩んでいるケースは、
別のデータが、前に保存した別テーブルのIDを必要とするので、ややこしい。。。

テーブルA
 ・ID
 ・フィールド1
テーブルB
 ・ID
 ・テーブルAのID

このような感じ。

if ($this->Model1->validates()) {}
if ($this->Model2->validates()) {}
こうやって、両方のバリデーションが通ることを確認したあとでやりたいんだが、
上述したとおり、Model1のIDがModel2で必要になるとしたら、
どういうコードをかいてバリデーションさせたらいいんだろう?
0909nobodyさん2011/06/14(火) 19:51:17.48ID:???
普通にsaveAllすればいいのでは。
0910nobodyさん2011/06/15(水) 02:07:15.67ID:???
「CakePHPは重いからCodeIgniter使え」って書かれてるのみて
CodeIgniterの公式みてたんだが、オレオレFWと大差ないな。

他のフレームワークを悪く言うつもり無いんだが、
速い理由わかってガッカリしたよ。何かもっと特別なやり方してると思った。
0911nobodyさん2011/06/15(水) 02:16:56.77ID:???
んまあ適材適所だろうね。使えるものの幅は広くても損しないし。
ciで良い時もあるし、ciじゃめんどくさい時もある。
0912nobodyさん2011/06/15(水) 02:58:07.54ID:???
それはそうなんだが、わざわざ新たなFW覚えるほどでもないなっと。

Cakeは小規模向きって良く解説されてるけど、
小規模ならそれこそオレオレでいいわけだ。更新もあまりないだろうし。
けど、ポータルサイトとかモデルが50も100もあるような場合、
更新性や他者との連携に備えてCakeみたいな有名FWが活用できる。

CIのメリットは「高速・軽量」だろうけど、Cakeの代替には向かないなと。
それならオレオレのリファレンス作って共同作業者に渡した方が
よっぽど無駄が省けるんじゃないか?っと思い、>>910の結論に達した。
0913nobodyさん2011/06/15(水) 03:10:08.70ID:???
Lithiumの情報少ないなぁ・・・
いつ移行するか悩む。
0914nobodyさん2011/06/15(水) 06:07:44.18ID:???
Cakeのバージョンうpしたいんだけど
cake以下だけ上書きすればいいの?
0915nobodyさん2011/06/15(水) 10:56:44.90ID:???
そうだよ
0916nobodyさん2011/06/15(水) 13:45:01.93ID:???
>>899
>単体でモデルをfindで呼び出して配列を取得する事って出来ないかな?

これでできたけど。

$_GET['url'] = 'favicon.ico';
require_once('path_to_app_dir/webroot/index.php');
// and then for example:
$PostModel =& ClassRegistry::init('Post');
print_r( $PostModel->find('all') );

http://osdir.com/ml/CakePHP/2009-08/msg01425.html
0917nobodyさん2011/06/15(水) 14:14:09.06ID:???
>>916
なぜか

$_GET['url'] = 'favicon.ico';

を入れないとビューまで取得されたけど、
たぶん、$_GET['url']にデータ入れないといけないとか
そういう決まりあるのかな。

何にしろ、これが出来たらかなり可能性が広がる。
凄く助かった。情報ありがとう!
0918nobodyさん2011/06/15(水) 19:42:44.38ID:???
>>916
俺もこの記事読んだが

require_once('path_to_app_dir/webroot/index.php');

これをやっている時点で、パフォーマンス的には
あまりメリットが無いんじゃないか?
0919nobodyさん2011/06/15(水) 20:13:40.33ID:???
そう言われればそうだな。どういう内部処理してるんだろ?
モデル操作以外はすっ飛ばしているなら
パフォーマンス的に早くなるのも理解できるが・・・
0920nobodyさん2011/06/15(水) 21:07:54.34ID:???
>>909
saveAllって片方がinvalidateになったら両方saveされないの?
0921nobodyさん2011/06/15(水) 21:27:51.08ID:???
dbがinnodbならされない。
0922nobodyさん2011/06/15(水) 22:08:54.84ID:???
>>921
ほう。。。あんまりその辺の知識がないなぁ。。。
CakeのAPIとか見てても付かない知識なのかな
0923nobodyさん2011/06/15(水) 22:26:32.30ID:???
>>916
index.php読むくらいならShellDispatcherつかえばいいじゃん。
0924nobodyさん2011/06/15(水) 23:54:25.65ID:???
>>922
APIというかマニュアルに書いてあるけど。
まあMySQLのトランザクションに関しての知識はCakeとは別だけどね。
0925nobodyさん2011/06/16(木) 13:20:10.21ID:???
>>923 詳しく
0926nobodyさん2011/06/18(土) 13:26:22.69ID:MtjEaHV0
1.3.7使ってるんですが
core.phpのCacheの設定でMemcacheを使おうとするとエラーが出てしまいます。
エラーのメッセージからInflector::slugを使用しているのが問題みたいなんですが、
なにか回避する方法ありますでしょうか?
もしくは現在の安定版(1.3.9)を使うべきですかね?
0927nobodyさん2011/06/18(土) 13:41:07.65ID:???
安定版使ってみたら?
0928nobodyさん2011/06/18(土) 13:52:16.37ID:FmefRTLq
質問ですが、cakeのコントローラーにmysqlのクエリ文を書くのって普通ですか?
クエリ文はモデルとかに書いた方がいいですか?
0929nobodyさん2011/06/18(土) 15:06:36.54ID:???
そもそもクエリってあまり書かないからな。
書きたいならモデルが良いと思うけど。
0930nobodyさん2011/06/18(土) 15:46:04.92ID:FmefRTLq
>>929

クエリって

$this->Model->find('first',array('conditions'=>array('id'=> 1));

ってやつですよ。

$query = "select * from user where id = 1";
mysql_query($query);

ってやつじゃないですよ
0931nobodyさん2011/06/18(土) 15:49:28.80ID:???
なんのこっちゃ
0932nobodyさん2011/06/18(土) 17:34:35.31ID:???
SQLを直接書きたいのではない、ってこと?
0933nobodyさん2011/06/18(土) 17:40:52.31ID:???
>>930
お前質問ずれてるよ。
てか、$this->Model->queryってのがあるの知らないのか?
俺はこのことを言ってるとばかり思ってたんだが。
0934 忍法帖【Lv=12,xxxPT】 2011/06/18(土) 21:20:47.99ID:???
>>930
どこでも書けるけど、modelに書くべきだと思う。

うちはcontrollerにSQL書き散らかしてしまって、本来のcontrollerから離れてしまった。
保守では困らないけど純粋なMVCモデルから離れてしまったと反省している。
0935nobodyさん2011/06/18(土) 23:07:42.72ID:???
>>930
viewに渡すデータが一行で取得できるならコントローラ。

アソシエーションの設定、findに渡すオプションで対応できないデータを作る必要があるなら、
そのデータを作成するファンクションをモデルに定義。
0936nobodyさん2011/06/19(日) 01:36:40.13ID:FFWzWxUl
CakePHPをSJIS環境で使ったらやばいかね?
CacheをMemcacheにしてるんだけど
SESSION周りがすげー怪しい動きしてるんだけど。
0937nobodyさん2011/06/19(日) 02:02:18.81ID:???
threadedでツリー構造のデータのうち、
親IDを削除したら子IDも削除されるようにしたいのですが、
Cakeの機能だけで削除できるのでしょうか?

やはり、一旦threadedでデータを取得して
1つずつ再帰して削除するしかないのでしょうか?
0938nobodyさん2011/06/19(日) 02:49:47.55ID:???
>>936
appまでの途中のパスに日本語使ってるとか無い?
0939nobodyさん2011/06/19(日) 03:01:01.96ID:???
>>937
treeビヘイビアを使えば、親のIDを指定してModel->delete()で子も消せるよ。
ダルマ落しみたいに中抜きしたい時は、 Model->removeFromTree()で。
0940nobodyさん2011/06/19(日) 07:14:15.09ID:???
変なバグに遭遇して調べ中なのですが
Cakeの最新バージョンでは、以下の不具合って直ってますか?
Group Byしている時にpaginator->number()が表示されない件
http://d.hatena.ne.jp/aroundthedistance/20090728/1248784179
0941nobodyさん2011/06/19(日) 12:53:39.87ID:???
>>939
treeビヘイビアというのがあったんですね。
今まで自作してツリーをカスタマイズしてました・・。

大変参考になりました。ありがとうございました。
0942nobodyさん2011/06/20(月) 15:10:17.74ID:???
都道府県のDBってどうしてる?
1~47まで都道府県のテーブル用意して、住所などが必要なテーブルでそのIDを設定するのが
本来の正しい設計かもしれないけど、
実際Cake(PHP)でやるとめんどくさいよね。毎回selectが増えるだけのような気がするし。
VARCHARで実装してしまうのはだめかな?
0943nobodyさん2011/06/20(月) 18:53:56.79ID:???
lithium、0.9.9の次、1.0じゃねーのかよw
公式リリースはまだ先なのかね?
0944 忍法帖【Lv=13,xxxPT】 2011/06/20(月) 22:37:52.29ID:???
>>942
面倒だったら日本郵政グループのKEN_ALL.CSVでマスターテーブル1つ作っちゃえばいいのでは?
0945nobodyさん2011/06/20(月) 23:28:05.47ID:???
>>942
フォームの選択の時は、bootstrapに書いてるな。
Configureに入れて。DBでは管理しない。

>>944
郵便番号から住所検索するとき、それ使ってるけど
ちょっと思うのが気になるよね。10万件ほどあるから当然なんだけど。
0946nobodyさん2011/06/20(月) 23:28:45.79ID:???
思う→重い

CakeでAjaxから読み込むとき、ちょっと重いんだよな
出力されるまで時間がかかる。
0947nobodyさん2011/06/21(火) 16:49:04.36ID:???
まだこんな時代遅れなの使う奴が存在してたのか
0948nobodyさん2011/06/21(火) 17:45:31.67ID:???
時代の最先端はどこですか?
0949nobodyさん2011/06/21(火) 19:26:01.33ID:???
文句言う前に時代後れじゃないFWを教えてください
0950nobodyさん2011/06/21(火) 23:28:19.97ID:???
やっぱりJavaのSpringだろ。

フレームワークなのにそのフレームワークを使って
書いたコードはフレームワークに依存しない。

という優れもの。
0951nobodyさん2011/06/21(火) 23:34:17.44ID:???
ちょっと何言ってるか分からないです
0952nobodyさん2011/06/22(水) 04:38:21.61ID:???
phpでおながいします
0953nobodyさん2011/06/22(水) 10:34:00.18ID:???
cakeで書いたものは移植性がない
0954 忍法帖【Lv=14,xxxPT】 2011/06/22(水) 12:36:35.63ID:???
フレームワークの変更はプログラミング言語が変更されるくらいのイメージ
0955nobodyさん2011/06/24(金) 10:38:37.73ID:???
もしかしてsetActionで別のアクション呼んでしまったら、
error-messageは出力されなくなるのか?

actionA() {
  if ($this->validates()) {
    $this-Model->save();
  } else {
    $this->setAction('actionB');
    return;
  }
}

↑このような状況で、actionBに飛んでactionBのビューが表示されたときに、
フォームのinputの下にerror-messageがでない。
ちなみに、actionAとBは同じフォームを中で呼んでいて(element)、Aを表示させるとerror-messageはちゃんと出る。
0956nobodyさん2011/06/25(土) 13:25:40.60ID:???
hasMany関係のデータを削除するとき、どうしてます?

ModelにhasManyを書いて、dependentをtrueにして削除するか、
削除時に各テーブルをforeachで回してdeleteするか。

自分はhasManyをModelに書かずに必要なときだけ
bindModelしています。
0957nobodyさん2011/06/25(土) 14:03:37.25ID:???
そうですか
0958nobodyさん2011/06/25(土) 15:25:53.73ID:???
そうですよ
0959nobodyさん2011/06/26(日) 22:52:58.28ID:???
PaginationHelperで出力するリンクって
設定かでquery string形式の(?page=1みたいな)リンクに
変更できますか?
結局PaginationHelperのソース書き換えて対応したんですが
書き換えずに済む方法があれば方法を教えて欲しいです。
バージョンは1.3です。
0960nobodyさん2011/06/27(月) 23:48:47.50ID:???
>>943
ズコー
0961nobodyさん2011/06/28(火) 03:16:25.11ID:???
Lithium 1.0は11月リリースの予定らしい。
symfony2に浮気しようかな。

他にPHP 5.3ベースのフレームワークってある?
0962nobodyさん2011/06/28(火) 04:25:36.29ID:???
どうして5.3ベースが良いの?
0963nobodyさん2011/06/28(火) 08:35:52.44ID:???
もはや5.2以前のシンタックスがタルい。
0964nobodyさん2011/06/28(火) 08:46:54.56ID:???
でも、5.3以前の鯖も多いよね
0965nobodyさん2011/06/28(火) 10:02:59.80ID:???
5.3以降と以前で主に何が変わったの?
0966nobodyさん2011/06/28(火) 22:29:51.03ID:???
http://php.net/manual/ja/language.oop5.late-static-bindings.php
0967nobodyさん2011/06/29(水) 02:01:54.30ID:???
cakephpで3年くらいやったけど
俺俺フレームワークの方が開発速度が速い。
そしてphpだけしゃ武器にはならんから
object-cを習得中。
先を見越せばphpのフレームワークなんて、時代おくれ。
0968nobodyさん2011/06/29(水) 03:29:14.31ID:???
とバカが申しております
0969nobodyさん2011/06/29(水) 08:59:10.65ID:???
>>967
俺もCake風のオレオレフレームワークを作った
どうせMySQLしか考慮しないし、速度の遅さは致命的だからね。
キャッシュ作っても新たにデータを投稿する度に削除する必要があるし、
速いに越した事はないだろう。
0970nobodyさん2011/06/29(水) 09:38:48.03ID:???
メンテする身にもなれや
0971nobodyさん2011/06/29(水) 10:11:36.12ID:???
自分がメンテする場合は?
0972nobodyさん2011/06/29(水) 11:53:23.28ID:???
会社でやるんじゃなくて個人でやるんならいいんじゃない?
会社ならやめてほしいな。
お前がずっと責任とれるはずもないんだから
0973nobodyさん2011/06/29(水) 13:19:00.43ID:???
会社でやってもドキュメント作ればいいじゃん。
Cakeのコーディングすら、個々のPGで癖があるのに
0974nobodyさん2011/06/29(水) 14:04:09.00ID:???
>>973
多分他人が作ったオレオレフレームワーク触ったことないんだろうな。
ものすごい苦痛だよ。

フレームワーク自体のバグは誰がなおす?
そのフレームワークの思想は大多数にウケるのか?
0975nobodyさん2011/06/29(水) 14:09:42.82ID:???
俺は生PHPが好き
0976nobodyさん2011/06/29(水) 14:22:57.04ID:???
>>975
あんっちゃんとゴム付けて
0977nobodyさん2011/06/29(水) 14:44:32.33ID:???
自分が一年前に作ったオレオレフレームワークだっていじるの苦痛だもんな。
0978nobodyさん2011/06/29(水) 15:48:10.37ID:???
だから、他人のコードはオレオレじゃなくても苦痛だっての
0979nobodyさん2011/06/29(水) 16:21:09.22ID:???
俺ベーマガ世代だから他人のコード読むのなんて余裕
0980nobodyさん2011/06/29(水) 16:30:41.22ID:???
バーチャルフィールドで登録数を表示する事って出来るのでしょうか?

・Userモデル
id,categories_id,name
・Categoriesモデル
id,name

として、「そのカテゴリに何人のユーザが登録しているのか?」
をバーチャルフィールドとして取得したいと思います。
バーチャルフィールドで書ける場合、書き方を教えてください
0981nobodyさん2011/06/29(水) 17:22:31.29ID:???
>>980
UserがbelongsTo Categoryならば、
Categoryにuser_countフィールドを作れば自動でカウントしてくれるよ。
0982nobodyさん2011/06/29(水) 17:37:38.74ID:???
>>981
var $virtualFields = array('user_count'=>'COUNT(User.id)');

を、Categoryモデルに書いたらカウント数を取得できました。
ありがとうございます。
0983nobodyさん2011/06/29(水) 20:13:54.90ID:???
cakephpで3年くらいやったけど
俺俺フレームワークの方が開発速度が速い。
そしてphpだけしゃ武器にはならんから
object-cを習得中。
先を見越せばphpのフレームワークなんて、時代おくれ。
0984nobodyさん2011/06/30(木) 09:37:18.67ID:???
言語がどうのって考えてる時点でセンスないからやめたほうがいい
0985nobodyさん2011/06/30(木) 10:52:27.52ID:???
センス無くても仕事は出来るよ
0986nobodyさん2011/06/30(木) 17:41:27.29ID:???
$this->set('items', h($items));

コントローラで上記のように毎回h()でエスケープするのが面倒だし、
エスケープし忘れも発生してしまいそうだから、
自動でsetした値をエスケープしたいんだが、どうしたらいい?
0987nobodyさん2011/06/30(木) 18:02:55.94ID:???
え?エスケープって既にされてなかったか?俺の勘違いかしら・・・
0988nobodyさん2011/06/30(木) 18:05:04.83ID:???
エスケープはViewの出力する部分で使うべきだよ
0989nobodyさん2011/06/30(木) 18:12:03.20ID:???
>>987
されてるの?
俺はされてないぞ

>>988
例えば
ビューで
名前だすときは、
echo h($user['User']['name']);
住所出すときは
echo h($user['User']['address']);
ってやるってこと?
>>986の方法のほうが楽なような・・・

エスケープって自動でされた覚えが俺もあるんだけど、気のせいかしら
0990nobodyさん2011/06/30(木) 18:22:21.93ID:/bA75Cwr
DBってよいのでしにない性別(1:男、2:女)と年代モデル(1,10代,2,20代・・・)をつくろうとしているんですが、(DBを使うまでもないデータ
普通のdaoと同じようなディレクトリ&クラス名で作ってしまょうか?
SeibetuModel
NendaiModel
みなさんどうされてますか?
0991nobodyさん2011/06/30(木) 18:24:17.90ID:???
日本語でおk
0992nobodyさん2011/06/30(木) 18:55:23.01ID:???
慣れない日本語を使って書き込んでくれてるんだろうから答えてあげたいけど、
ごめんわからんw
0993nobodyさん2011/07/01(金) 10:00:51.93ID:???
>>961
doophp,codeigniter,zendはphp5.3に対応してて警告もエラーも出ない
0994nobodyさん2011/07/01(金) 10:32:02.04ID:???
PEARとかのクラス名とCakeのコアクラスが衝突しちゃう場合
どう対応してますか?

ソース修正して、クラス名が出てくるところ全部書き換えるくらいしか思いつかないんですが・・・

Cakeはコアクラスにプリフィックス付いてないのがツライ・・・
0995nobodyさん2011/07/01(金) 10:37:12.36ID:???
そのために主要フレームワーク開発者が集まって議論したじゃないか
2.0が出るまで待つしかないだろ
0996nobodyさん2011/07/01(金) 13:47:40.87ID:???
>>990
テーブル、モデルとも作らない。
bootstrap.phpに
$GLOBALS['masters']['sex'] = array(1 => '男', 2 => '女');
みたいに書いてる。
0997nobodyさん2011/07/01(金) 14:09:55.01ID:???
$GLOBALS??

俺は、bootstrap.phpに
Configure::write('Masters.sex'array('1' => '男', '2'=> '女'));
って書いてるけど・・・
0998nobodyさん2011/07/01(金) 15:10:52.19ID:???
そういう意味だったのか。君たちすごい。
enum / set が使えれば良いのになって思う事はあるな。mysql限定になっちゃうけど。
0999nobodyさん2011/07/01(金) 16:22:05.12ID:???
1000取る人次スレ立ててから取ってくれ
1000nobodyさん2011/07/01(金) 16:27:18.64ID:???
やなこった
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。