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

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

■ このスレッドは過去ログ倉庫に格納されています
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
0722nobodyさん2011/05/03(火) 13:16:24.74ID:???
Cakeに慣れると、簡単なPHPのプログラム作ろうとしても
いつの間にかCake風のプログラミングしてることあるよな
0723nobodyさん2011/05/03(火) 13:54:27.72ID:???
Cake風のプログラミングってどういうのだ?
0724nobodyさん2011/05/03(火) 14:06:56.07ID:???
RoR風MVCと言いたいのかな?

PHPあんまり知らないJavaはよく知ってる人が、ぱっと見で
「あ、これ分かりやすいね」と言ってた。
0725nobodyさん2011/05/05(木) 03:39:50.22ID:???
MeioUpload Behaviorを使っているんだが
確認画面で画像を確認した後、saveってできるのかな?
やっぱりそこは自作しないといけないのかな
0726nobodyさん2011/05/05(木) 10:09:53.55ID:???
2.0はいつ正式版でんのかな
Symphonyに先行されたくはないよな
0727nobodyさん2011/05/05(木) 13:07:28.09ID:???
>>726
それはあなたが参加チームに入ればいい。
あなたも参加チームに加わって、2.0のバージョンの開発スピードを速くしましょう、ボケ。
0728nobodyさん2011/05/06(金) 00:21:29.94ID:???
ちょっと気づいたんだけど、
app_controller.phpに「var $autoLayout = false」を指定してないと、
エラーページにもレイアウトが使用されるんだな。

会員専用ページとか、レイアウトに「default.ctp」を使用してたら
これが読み込まれるから大変な事になる
0729nobodyさん2011/05/06(金) 20:26:56.51ID:aIuVNDEL
コントローラに変数を書くのは
$this->set('foo', 'bar');
ってやってビューで$fooでbarが出るようにできたんですけど、
このfooを配列にしたいんですけどどう入力したらいいんでしょうか
$this->set('foo', 'bar');
$this->set('foo', 'bar2');
とやったらただ$fooが上書きされただけで配列にはなりませんでした
0730nobodyさん2011/05/06(金) 20:30:43.07ID:???
$this->set('foo', array('bar', 'bar2'));
0731nobodyさん2011/05/06(金) 20:37:08.21ID:???
>>730
あ・・・
なるほどありがとうございます
助かりました
0732nobodyさん2011/05/08(日) 16:57:22.50ID:???
http://bakery.cakephp.org/jpn/articles/category/helpers
>PEARのののの
なんで、尻取りRock'n Rollみたいなタイトルになっとるんかね?
0733nobodyさん2011/05/10(火) 22:38:37.80ID:???
7PHPフレームワーク中ぶっちぎり最下位のCakePHPは終わコン
http://www.devshed.com/c/a/PHP/7-PHP-Frameworks-Tested-For-Speed/
0734nobodyさん2011/05/11(水) 17:51:03.34ID:???
ヒマだったんでローカル鯖にエロ動画データベースみたいなのを作ってみた。
今まで使った事無かった機能とかいろいろ使ってみて勉強になるわ。
やっぱ実益を兼ねると捗るな。
0735nobodyさん2011/05/11(水) 18:08:06.21ID:???
エロサイトは技術レベル高そうだね。
みんなのDMM様とかね。
0736nobodyさん2011/05/11(水) 18:13:22.71ID:???
>>734
どんな感じ?
ぜひ公開してよ。
0737nobodyさん2011/05/12(木) 00:21:57.52ID:RDtqq4sq
CakeでModelのfind・save・delete等のDBアクセスメソッドで
エラーハンドリングするのって

$res = $this->Model->save();
if ($res === false) {
  // エラー処理
}

って感じでいいですかね?
0738nobodyさん2011/05/12(木) 01:54:00.04ID:???
if(!$this->Model->save()){
// エラー処理
}

これじゃ駄目なのか?
0739 忍法帖【Lv=14,xxxPT】 2011/05/12(木) 04:21:23.48ID:???
save()ならいいけどfind()だと空arrayをどう扱うかにもよる。
delete()は場合によっちゃgetAffectedRows()がいる。
0740nobodyさん2011/05/12(木) 08:57:26.67ID:i1t11ChC
Cakeを何年か使ってきて、結局分かってないというか、初歩的なところを
何となくスルーしてきたんだけど、
例えば、
・コントローラ内からモデルの関連モデルをとり回す
・モデルから関連モデルをとり回す
時に、$this->Post->User とか、モデル内なら $this->User とかやるけど、
これって何が嬉しいの?
関連モデルも取ってくるだけなら、$recursiveとかunbindModel, bindModel やContainableビヘイビアとか
あるわけだし、直接関連しないモデルとの突き合わせや何かに使うならClassRegistry::init('Model')でいいわけじゃないすか

$this->Post->Comment とか、 $this->Post->User とか使って美味しい場面ってどこなんですか?

初心者のつもりじゃなかったけど、この部分だけ何年もスルーしてました。
0741nobodyさん2011/05/12(木) 14:23:52.63ID:???
ClassRegistryが登場するまでは、関連モデルをたどる事が基本だったんじゃないかな。
設計として関連モデルまでのアクセスを基本とすることを良しとすることもあるのかも。
他にもシュガーシンタックスとか色々推測はできるけど、コアチームに聞いたほうが早い
かもしらんね。

こういう話題はフォーラムとかに振ったほうがいいんじゃないかなぁ。
0742nobodyさん2011/05/13(金) 00:53:55.24ID:bOFdFGkg
CakePHPのバリデーションで
ある項目で半角英数のみを許可するというチェックで
入力がされなかった場合はスルーさせたいのですが、
以下のような感じでいいでしょうか?

var $validate = array(
  'id' => array(
    'alphaNumeric' => array(
      'rule' => 'alphaNumeric',
      'message' => '半角英数で入力して下さい'
    )
  ),
  'pass' => array(
    ・・・
  )
);
0743nobodyさん2011/05/13(金) 02:15:59.81ID:???
>>742
empty = true
0744nobodyさん2011/05/13(金) 11:43:27.73ID:???
>>742
'allowEmpty'=>true,
0745nobodyさん2011/05/13(金) 20:45:10.04ID:???
Authでログインし、print_r($_SESSION)を見ると
配列のConfigに”[timeout]=>10”とあります。
これってタイムアウトの秒数じゃないですよね?

あと、セッションタイムアウトになったら自動的にログインフォームに戻りますが、
またログインするとそれまで、↑になる前のページが表示されます。
これって単にリファラをチェックしているだけなのでしょうか?
0746nobodyさん2011/05/15(日) 03:29:24.39ID:???
CakePHP使ってみたけど駄目だわー。
あぁRoR系ってこの程度の物だったのねって感じ。
全然ダメダメで安心した。
俺の作ったフレームワークの方が万倍良いわw
0747nobodyさん2011/05/15(日) 09:56:30.32ID:???
比較対照も示さずに
0748nobodyさん2011/05/15(日) 11:33:35.65ID:???
CodeIgniter移行余裕
0749nobodyさん2011/05/15(日) 11:44:06.73ID:???
使いこなせるものを使えばいい
0750nobodyさん2011/05/15(日) 13:24:31.86ID:???
CodeIgniterからまたもどってきちゃった
0751nobodyさん2011/05/15(日) 22:23:01.76ID:???
Cakeの仕様に合わせたオレオレフレームワーク作ってるけど
746もそういうことかな?
0752nobodyさん2011/05/16(月) 01:58:31.58ID:???
自分の用途に過不足なく機能があり
自分で隅から隅までわかっているライブラリのほうが良いと感じる
当たり前といえば当たり前の話です
0753nobodyさん2011/05/16(月) 02:09:10.52ID:???
Cake(RoR)から学ぶことなんか何も無かったね。
あえて言えばアンチパターンを学んだね。
ActiveRecordなんか最悪だぜ。
0754nobodyさん2011/05/16(月) 03:59:25.37ID:???
じゃ、普段どういう書き方してるの?
0755nobodyさん2011/05/16(月) 13:05:48.45ID:Buwzzl2B
>>751
Cake真似てDispacherとかなんやらかんやら複雑に創り上げた黒歴史の俺俺フレームワーク思い出すからやめろ・・・
0756nobodyさん2011/05/16(月) 13:23:10.09ID:???
みんなやるんだよ
0757nobodyさん2011/05/16(月) 16:44:54.09ID:???
$this->dataで指定配列があるか無いか調べないとエラーになるから
ifやissetばかりのコードになるんだが、みんなはどうしてる?

if (isset($this->data['User']['name'])) {
 if ($this->data['User']['name'] <> "") {
  echo $this->data['User']['name'] . 'さん';
 }
}

みたいな。画像があるか無いかのチェックならもっと複雑になる。
俺の書き方が悪いかもしれないけど、良い書き方はないかな?
ちなみにめんどくさい時は@を付けてる。
0758nobodyさん2011/05/16(月) 18:26:56.20ID:???
(isset($this->data['User']['name']) ?: '')
PHP5.3以上限定だったっけな
0759nobodyさん2011/05/16(月) 18:47:35.88ID:???
ごめん、上のじゃダメだわw
0760nobodyさん2011/05/16(月) 19:26:31.02ID:???
>>757
何もしない。そのままエラーで例外発生させて、例外処理に飛ばしてる。
0761nobodyさん2011/05/16(月) 19:36:18.98ID:???
>>760
入力されてるか否かの、この程度の動作でも例外処理に飛ばすの?
確認画面を出力する時とか困らないか?
0762nobodyさん2011/05/16(月) 19:48:08.88ID:???
>>761
普通にCakeのコードを書けば、データの入力有無に関わらず
配列の要素だけは最低限存在するんじゃない?
もしも場合によって要素が無いというケースを作ったのであれば、
そこは例外にならないようチェックを入れれば良いし。
0763nobodyさん2011/05/16(月) 20:39:43.96ID:???
CakePHPのビヘイビアの仕様にいつも引っかかる($this->ビヘイビア名->関数と書いてしまう)
第一引数の&$modelにもよく引っかかるし
なんでこんな実装になってんのよ
0764nobodyさん2011/05/16(月) 23:05:12.61ID:???
それは単に悪い癖がついてるだけだろ
まさかいつも直接ビヘイビアのメソッド呼び出してるわけじゃないよな?
0765nobodyさん2011/05/17(火) 01:45:48.69ID:p7ZABAr6
cakeでDBのUPDATEをする場合でIDの値を持っていない場合は
Model::save()使えないんだけどその場合どうしたらいいですか?

1)他のメソッドを使う
2)Model::find()等でIDを取得した後Model::save()を使う
0766nobodyさん2011/05/17(火) 02:09:58.52ID:???
普通、IDを持って更新するんじゃないか?Cakeに限らないが。
0767nobodyさん2011/05/17(火) 02:25:59.11ID:???
>>757
trueであることと、空文字列でないことをチェックするなら
isset()じゃなくて、!empty()を使えば一行で済む

<?php
$str = '';
var_dump (isset($str)); // true
var_dump (!empty($str)); // false
0768nobodyさん2011/05/17(火) 08:21:09.15ID:???
一応updateAll()で素のUPDATEステートメントに近い形で更新はできる
基本はIDを元に更新するけど、フラグや日時一括更新の場合など、場合にも拠る。
07697652011/05/17(火) 08:31:56.73ID:???
>>768
つまり2)ってことですかね。
基本UPDATEはIDを元にするけどModel::updateAll()を使えば
ID以外でもUPDATEできるということですね。
ありがとうございます!
0770nobodyさん2011/05/17(火) 09:32:19.43ID:???
>>739
findって空の場合falseが返ってくるんじゃなかったっけ?
0771 忍法帖【Lv=18,xxxPT】 2011/05/17(火) 11:42:32.89ID:???
>>739
firstとかIDベースのじゃなくてallとかlistだとarray()が返るとおもた。
0772nobodyさん2011/05/17(火) 12:30:13.80ID:???
>>767
指定配列があるかどうかって書いてるから、isset使ってるんだろ?
お前さんのは$strを最初に書いてるじゃん。
0773nobodyさん2011/05/17(火) 12:47:52.65ID:???
>>772
isset と empty の挙動の違いは頻出ネタだと思うが。
つまり、こう書けるってこと。

if (!empty($this->data['User']['name'])) {
  echo $this->data['User']['name'] . 'さん';
}
0774nobodyさん2011/05/17(火) 13:19:33.25ID:???
POSTでUser.nameが送られてこなかったら?
0775nobodyさん2011/05/17(火) 13:21:09.79ID:???
あと、0を入れたらどうするの?ってのもあるな。
名前に0を入れる奴がいないとも限らないぞw
0776nobodyさん2011/05/17(火) 13:57:44.20ID:YbRN4g9b
めんどくせーからemptyで判断してるわ
でも判断してるのは$this->dataだけだし、emptyでもよさそうだな
0777nobodyさん2011/05/17(火) 14:19:22.66ID:???
関数作るのはどうなの?

if (checkData($this->data)) {
 echo $this->data['User']['name'] . 'さん';
}

みたいな。
0778nobodyさん2011/05/17(火) 14:20:22.87ID:???
いや、Cakeだからヘルパーにするべきだな・・・
0779nobodyさん2011/05/17(火) 14:29:36.21ID:???
validateしろよ
0780nobodyさん2011/05/17(火) 17:24:54.66ID:ceh4vxWU
empty(0)ってなんでtrueにしたんだろ
empty('0')はfalseなのに

たまわらんわ
0781nobodyさん2011/05/17(火) 18:03:41.28ID:???
>>780
0だと変数の型がintegerで'0'だとstringだから。
ちなみにfalseはbool型の0。
0782nobodyさん2011/05/18(水) 23:55:26.02ID:M1/yO2iL
findで以下のようにSQLの関数を使うと戻ってくる値がおかしくなります。
以下の例だとUser.sexの最初の値は$res[0]['DECODE(User']['sex']の中に入ってきたりします。
この現象を回避する手立てはあるのでしょうか?

$params = array(
  'fields' => array(
    'User.id',
    "DECODE(User.sex, 1, '男', 2, '女')"
  ),
  ・・・
)
$res = $this->User->find('all', $params);
0783nobodyさん2011/05/19(木) 00:00:58.47ID:???
virtualFieldsを使えば良い。
1.2とかだったらasで名前指定すればOK、ただしUserの配列の中に入れることはできない
0784nobodyさん2011/05/19(木) 13:25:40.80ID:hw1vryEv
class OrderDetail extends AppModel {
  var $hasMany = array('Stock');
}

これで注文テーブルから注文レコードとると、
注文詳細レコードも一緒にとってくるようになったんだけど、
注文詳細レコードから、商品レコードも一緒に自動で取りたい場合はどうしたらいいんだろう。
1階層?しか自動でとってこないのかな
0785nobodyさん2011/05/19(木) 14:05:27.71ID:???
>>784
他モデルの設定が分からんからなんとも言えないけど
マニュアルは読んでやってみたけどできなかったっつう話?
0786nobodyさん2011/05/19(木) 14:26:20.70ID:???
>>784
自前でjoin書かないと1階層までじゃないんだっけ?
0787nobodyさん2011/05/19(木) 18:32:06.41ID:???
>>784
テーブル設計が分かってないけど
recursive使えばいいんじゃない?
$this->Model->recursive = 2;
0788nobodyさん2011/05/19(木) 20:00:43.27ID:???
さんくすおまえら
0789nobodyさん2011/05/19(木) 23:51:36.35ID:???
>>786
recursiveを使えば取得できるけど、joinされたSQLが発行されるわけではない。
パフォーマンスを考えれば自前でjoinすべき。
0790nobodyさん2011/05/20(金) 00:27:57.20ID:???
joinとかサブクエリちょっと複雑なfind書こうとすると
とたんにSQL書き始めちゃうみたいになるよね。
コントローラでSQLって書いちゃ駄目だろとか思う。
0791nobodyさん2011/05/20(金) 00:29:29.63ID:???
>>783
1.3ですけどうまく行きませんでしたよ。
0792nobodyさん2011/05/20(金) 00:54:14.48ID:???
フォーム送信された電話番号に全角があったら半角に変更しようと、
beforeValidateに以下のように書きました。

function beforeValidate(){
if (isset($this->data[$this->name]['tel'])) {
$this->data[$this->name]['tel'] = mb_convert_kana($this->data[$this->name]['tel'], 'rnask', 'UTF-8');
}
return ;
}

しかし半角に変換されません。何か間違っているのでしょうか?
ちなみに、コントローラーでバリデーションを実行する前に
$this->Model->set($this->data);
こうしてます。
0793nobodyさん2011/05/20(金) 01:54:51.61ID:???
>>792
>この関数は true を返さなければなりません。
>そうでない場合、現在の save() の実行が中断されます。
でないの?
0794nobodyさん2011/05/20(金) 03:11:47.64ID:???
>>793
return ; にしているところを return true; にしても変化はありません。
全角が半角になりません。

また、確認画面を入れてますので、saveでの動作ではありません。
$this->Model->set($this->data);
if (!$this->Model->validates()) {
 $this->set('error', 'エラー');
}

みたいにしています。
0795nobodyさん2011/05/20(金) 08:35:02.16ID:???
>>789
これって2階層以上になるとjoinしなくなるってわけじゃないよな?
cakeのモデルの結びつけは全て単に個々のレコードをselectしてるんだよな?
0796nobodyさん2011/05/20(金) 08:51:23.08ID:???
っていうか、たとえば、「MySQLにとって最適なクエリはどう書くのか」っていう考えが出来てない奴大杉。
はじめからORマッピング使うからそうなる。

フレームワークのDBアダプター使えば全てのDBサーバに最適なクエリが発行できると
思ってる奴多いけど、最適なクエリはDBサーバによって書き方が異なるのだ。

って、ねーちゃんが言ってた。
0797nobodyさん2011/05/20(金) 09:52:43.86ID:???
>>795
1階層目まではjoinされる。
2階層目以降はjoinされない。1階層目のデータをキーに、複数のSQLが実行される。
0798nobodyさん2011/05/20(金) 10:10:25.55ID:???
アソシエーションで質問なんですけど、
FooとBarがそれぞれ3つのHogeを持たせるため、
Foo、Barそれぞれに hoge_id, hoge1_id, hoge2_id カラムを作成して関連づけました。
これでHogeをfindで取得した場合、
Array
(
  [0] => Array
  (
    [Hoge] => Array(~)
    [Foo] => Array(~)
    [Foo1] => Array(~)
    [Foo2] => Array(~)
    [Bar] => Array(~)
    [Bar1] => Array(~)
    [Bar2] => Array(~)
  )
)
こんなふうになるんですが、(foreignKeyごとにエイリアス名を変えています)
これを
    [Foo] => Array(
      [0] => Array(~)
      [2] => Array(~)
      [1] => Array(~)
    )
こんな感じに取って来れる方法はないでしょうか?
もしforeignKeyを分ける以外にいい方法があればそちらも教えて下さい。
0799nobodyさん2011/05/20(金) 10:37:34.40ID:???
そういう関数を作る
0800nobodyさん2011/05/20(金) 16:16:52.10ID:haTOk0oR
primary(文字列)に"0"設定したいんだけど、save()で登録できる方法ない?
0801nobodyさん2011/05/20(金) 19:43:16.98ID:???
$results = $Model->find('threaded',$options);

これでツリー式のデータを取得できますが、
それを出力する方法で悩んでます・・。
目的はセレクトメニューのoptionに入れたいのですが、
何か良い参考ページかやり方はないでしょうか?
0802nobodyさん2011/05/20(金) 21:52:34.07ID:???
>>801
セレクトに使う程度ならツリービヘイビアのgeneratetreelist使った方が楽だよ。
0803nobodyさん2011/05/21(土) 00:18:07.82ID:/xyh+Ud4
findでちょっと複雑なこと(と言ってもjoinとかサブクエリ程度)を
しようとすると本当に面倒くさい。
もう面倒だからquery()でSQL直着書きしちゃうんのってアリ?
0804nobodyさん2011/05/21(土) 00:27:59.30ID:???
どの程度の事なのかようわからんけど
ほとんどはcontainableビヘイビア使ってなんとかなってるけどなー
0805nobodyさん2011/05/21(土) 00:38:09.14ID:???
>>803
検索オンリーならDBにビュー作ったらいいよ
0806nobodyさん2011/05/21(土) 03:26:01.22ID:???
DBにビューってなんだ?
0807nobodyさん2011/05/21(土) 10:05:49.32ID:???
データが決まっているなら、CREATE VIEWしてそれをfindした方が早いと言っているのでは。
0808nobodyさん2011/05/21(土) 10:10:24.97ID:???
それすら知らなかったんだろ
0809nobodyさん2011/05/21(土) 10:54:51.77ID:???
cakephp2.0ってphp5.3にちゃんと対応してる?いつでんの?
0810nobodyさん2011/05/21(土) 11:27:17.26ID:/xyh+Ud4
CakePHP1.3.7使ってるんだけど
Model::execute()って無くなってない?
PDTの候補にも出てこないし実際に無いし。
0811nobodyさん2011/05/21(土) 15:28:04.45ID:???
>>810
executeは1.2で無くなったっぽいよ。
互換性のためにメソッドは最近まで残してあったのかも知れないけど。
0812nobodyさん2011/05/21(土) 15:29:00.87ID:???
CakePHPは終わコン
0813nobodyさん2011/05/21(土) 16:40:27.40ID:???
始じコンは何?
0814nobodyさん2011/05/21(土) 16:55:05.99ID:???
今後はなんでもJavaScriptで組まれるようになるよ
0815nobodyさん2011/05/21(土) 17:51:36.10ID:???
設計が良いCodeIgniterが始まってます数年立てば日本での立場は変わってくるよ
0816nobodyさん2011/05/21(土) 17:57:45.07ID:???
サーバサイドJSってやつか。面白そうだね。
0817nobodyさん2011/05/21(土) 18:01:52.25ID:???
CodeIgniterは情報が足りなすぎる。数年も待てない。
0818nobodyさん2011/05/21(土) 18:13:46.50ID:???
あれほど分かりやすいマニュアルはないない
0819nobodyさん2011/05/21(土) 20:14:04.70ID:???
Cakeのマニュアルよりマシなんじゃないの
Cakeのは簡潔すぎてマニュアルになってない
0820nobodyさん2011/05/21(土) 20:56:37.13ID:???
情報=マニュアルじゃなくて、使ってる人の事ね
0821nobodyさん2011/05/22(日) 01:47:54.93ID:???
なんか本とかWebも1.2の情報がベースで1.3の情報少ないよね。
非常に困る。で、1.3の本が出始める頃には2.0が出てると。
0822nobodyさん2011/05/22(日) 10:12:56.86ID:???
DooPHPはどうよ?
■ このスレッドは過去ログ倉庫に格納されています