トップページ⇒php
985コメント270KB

【PHP】フレームワーク CakePHP 15ホール目【v2.2】

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん2012/12/04(火) 13:06:36.87ID:ExCLhBiP
CakePHPは、Ruby on Railsの概念の多くを取り入れた、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークです
CakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう

※他フレームワークとの比較等はスレ違いです

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

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/
cookbook(マニュアル)
[2.x] http://book.cakephp.org/2.0/ja/index.html
[1.3] http://book.cakephp.org/ja

前スレ
【PHP】フレームワーク CakePHP 14ホール目【v2.1】
http://kohada.2ch.net/test/read.cgi/php/1335859124/
0809nobodyさん2013/07/02(火) NY:AN:NY.ANID:???
>>808
私の間違いでした。ありがとうございます。
0810nobodyさん2013/07/02(火) NY:AN:NY.ANID:???
CakePHP 以前DBの正規化の話になるけど、
管理者と一般ユーザ(それぞれ admins, users として)を統合する
上位のテーブルをこれから作れないの?

全ユーザーテーブル all_users にして、
admins と users にそれぞれ all_user_id を追加するという具合に
0811nobodyさん2013/07/02(火) NY:AN:NY.ANID:???
>>810
すばらしい発想ですね。ありがとうございます。参考にさせていただきます。
0812nobodyさん2013/07/02(火) NY:AN:NY.ANID:???
>>804 の件ですが、一応解決策が見えてきましたので、ご報告させていただきます。

>>807様と>>810様のアドバイスの合わせ技で、以下のようにしました。

users テーブルを新たに作成
カラム id, username, password, role を設定
   ↓
admins テーブル、 customersテーブルに カラム user_id を追加
   ↓
モデル Admin,php に$belongsTo Userを設定
モデル Customer.php に$belongsTo Userを設定
   ↓
AppContorollerのbeforeFilter()でユーザのRoleを判定し
ログインリダイレクト先とログアウトリダイレクト先を設定。

あとは各コントローラのbeforeFilter()にRole判定を入れてしまえば
だいたい完成かなと思っております。

ありがとうございます。
0813nobodyさん2013/07/02(火) NY:AN:NY.ANID:???
良い感じだと思います。おつかれ
0814nobodyさん2013/07/02(火) NY:AN:NY.ANID:???
いやちょっと待て、role はひょっとして admin と customer が入るのか?
だとしたら冗長だな。

User hasOne Customer
User hasOne Admin

にした方がいいと思うが。
0815nobodyさん2013/07/05(金) NY:AN:NY.ANID:???
2.3.7と2.4β出たね
0816nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
モデルのコンストラクタ内でセッションデータを参照したいんですが、できますか?
Cake2です
0817nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>816
設計がまずい
0818nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>816
どうしても、ってことならConfigure::read/writeで代用かな。
0819nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
セッションの内容によって、接続するDBを変えたいのが理由ですが
設計まずい?
0820nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>819
引数とかで明示的に渡すべきだろうな
0821nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
多分そーすぐっちゃぐちゃなんだろうなぁ
0822nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>820
モデルのコンストラクタは引数決まってるしCakeが勝手に呼んでくれるけど
そこをオーバーライドして、引数を追加しろって事?
0823nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>818でよくね?
0824nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>822
コンストラクタ内で切り替えなければならない理由があるんだろうか。。。
0825nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>824
コンストラクタ以外で良い場所ありますか?
0826nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>825
お好きにとしか言えんよな
0827nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
>>819
それ、別モデルにすべきじゃね。
0828nobodyさん2013/07/11(木) NY:AN:NY.ANID:???
DBに接続する前にuseDbConfigを書き換えようとしてるから
やはりコンストラクタが確実なんじゃないですかね?
引き続きその線で考えてみます
0829nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
技術系の質問て、どこでしたらいいのかわからない

・stackoverflow
・2ちゃん
・質問対象のコミュニティ、フォーラム

どれも試したが、stackoverflowは質問が大杉てすぐ流れちゃって閲覧されない
簡単な質問ならすぐレスが付く、ただし数分過ぎたらもうレスは付かない

質問対象のコミュニティ、フォーラムは過疎ってることが多い

2ちゃんはアホばかり
いちばんレスは得られるが煽りばかり

さあどれを選ぶ?他にある?
0830nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
誰か詳しそうな人のツイッターなりFacebookなりに質問すれば?
うざがられるの覚悟なw
0831nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
こいつ前からぐちぐち言うだけのやつか
いつまでたってもぜーんぶ他人だより
そろそろ自分でなんてかすることおぼえろよ
0832nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
コンポーネントからappcontrollerのメソッド呼びたいときってどうすればいい?
0833nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
んなこともわからんならやめちまえよカス
http://api.cakephp.org/2.3/class-Component.html
これ見てわかったら反省しろ
0834nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
componentを呼び出したcontrollerじゃなくてappcontrollerというのならClassRegistry::init()でもnewでも勝手にしてろクソ
0835nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
>>833
どうした嫌なことでもあったのか?

わからんしApp::usesするわ。
0836nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
マジでappcontroller呼び出すんだ
頭悪いにも程があるな
0837nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
classの概念もわかってない奴はcakeなんていじっちゃだめだよ
0838nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
>>836
そうね、あったねいやな事。
答えを書いたはずが理解されなかったことかな。
0839nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
最近2ちゃん民の質の低下が著しい
2年ぐらい前までは、まだたまに有益なレスが得られたものだが
0840nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
ネオ麦茶とかのころからみてるけど昔のほうがひどかったよ^^
0841nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
最近CakePHPを指定してくる案件の単価が下がりすぎてやばい。
俺の周りだけ?
0842nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
>>841
言語を指定してくる客とは関わらないようにしてる
0843nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
appcontrollerをApp::uses()ってまじでか?w
0844nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
なんで AppController のメソッドが必要なん?
Component を使ってる Controller じゃなんであかんのや?
0845nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
classとはなにか継承とはなにかすらわかってないんだよ
これ以上触れないほうが双方の利益
0846nobodyさん2013/07/12(金) NY:AN:NY.ANID:???
適切に書くべきところに処理を書けば、トリッキーなことしなくていいのに。
0847nobodyさん2013/07/19(金) NY:AN:NY.ANID:???
foreign keyが有効かどうかのチェックってモデルのバリデーションで行った方
がいいの?
ずっとコントローラーでやってたんだけど「isForeignKeyみたいな標準バリデーションを用意してくれ」っていう
提案が出されてるのを見つけて、バリデーションの方で実装しようかと心が揺れてる

https://cakephp.lighthouseapp.com/projects/42648/tickets/3213-suggestion-for-validating-foreign-keys
0848nobodyさん2013/07/19(金) NY:AN:NY.ANID:???
そりゃモデルでやるべきだろjk
ビヘイビアでも作っておけばいいんじゃないの?
0849nobodyさん2013/07/19(金) NY:AN:NY.ANID:???
回答ありがとう
その方向で直してみるわ
0850nobodyさん2013/07/24(水) NY:AN:NY.ANID:???
CakePHPのfindとsaveを普通に使っていればSQLインジェクションは起こり得ないと思っておk?
任せておけばプレースホルダ使ってくれるんだよね?
0851nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
>>850
なんか、一個だけだめなやつがあったって何かで読んだ
0852nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
updateallじゃね
0853nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
あぁ、そうだった。
find と save だけ使ってりゃ大丈夫だったか。
0854nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
そんなのあったのか
結構使ってるつもりだったが初めて知ったわ
0855nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
ああ、updateAllだけはサニタイズかましてるわ
正直面倒
0856nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
この問題まだ解消されてないんだね
何か難しい問題があるのかな

既に別のフレームワークへ移ってしまったが
0857nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
おれ852だけど、
これ問題じゃないだろ
カラム名+1とか出来るようにしてんじゃないの?
0858nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
なるほど
カウンター増減専用メソッドが存在しないための対処なんだな
0859nobodyさん2013/07/25(木) NY:AN:NY.ANID:???
>>856
難しい問題があるというよりも、生のSQLを用いた
更新ロジックを作りたかったんじゃないかな。

とは言え、他のは自動的にサニタイズされるのに
これだけ自前でやるだなんて、問題ないとは言えないと思うが。

オプションで "sanitize" => false とか
指定できるようにすればいいわけだから。
0860.net 992013/07/30(火) NY:AN:NY.ANID:li987LIG!
cakePHPのSessionのDBについて質問があります。
次のサイトでは、セッションのタイムアウト時間として

'timeout' => 259200,

と記載されていますが、timeoutに指定する時間単位は分ですよね?
259200分 = 4320時間 = 180日

の設定となり異常に長いのですがこれは開発用に敢えて長い
時間を設定しているという認識で良いでしょうか?

http://weble.org/2012/03/22/cakephp-session-database
0861nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
秒じゃないのか?
0862nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
分であってる
何でその長さにしたのかはブログの作者に直接聞くといい
0863.net 992013/07/30(火) NY:AN:NY.ANID:li987LIG!
>>862
ありがとうございます。うーん。
ブログで得意気に情報を公開するのは結構ですが間違った
情報を堂々と公開するのは勘弁してほしいですね。

ちょっと自分でブログにまとめます。
0864nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
間違ってはないだろ
お前の用途に合って無かっただけ
0865nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
180日のセッションのどこが間違いなんだ?
あとブログの情報なんてのは間違っていても全然おかしくないわ。公式のヘルプでも間違ってんのに。

問題はお前みたいに間違いに気づいたと思っても、
恥ずかしかったり面倒くさかったりでアクションを起こさないやつだ。
0866nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
いいから早くブログにまとめろよ
はよ
08678602013/07/30(火) NY:AN:NY.ANID:EA19wq1I
>>864
黙れ。アホブログ作者。

>>865
長すぎるだろ。

>>866
既に纏めた。
08688602013/07/30(火) NY:AN:NY.ANID:qDXmbOPS
>>867
騙るなクズ
0869nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
今でもマイナーチェンジ繰り返してるみたいだけど、
そんなに改良するところがあるもんなのかな

CakePHPにかぎらず、なかなか一つの定番に落ち着かないもんだな

ま、PHP 自体が変化しているから仕方ないのかな?
0870nobodyさん2013/07/30(火) NY:AN:NY.ANID:???
バグが多いイメージ
0871nobodyさん2013/07/31(水) NY:AN:NY.ANID:???
間違いくらい誰だってするだろうに
0872nobodyさん2013/08/03(土) NY:AN:NY.ANID:???
今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」 | つい全力ツッコミしてしまうエンジニアCEOのブログ | sumyapp
http://blog.sumyapp.com/2013/07/no-recommend-rails/
0873nobodyさん2013/08/03(土) NY:AN:NY.ANID:???
> CakePHPなんて2年ぐらいほとんど変わってないのに、Railsの変わり具合は半端ない。
0874nobodyさん2013/08/03(土) NY:AN:NY.ANID:???
PHPの基礎学んでからにしろよってことが言いたいのね
同意だわ
0875nobodyさん2013/08/03(土) NY:AN:NY.ANID:???
っていうか、そんなヤツおらんやろ?
0876nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
>`INTEGER PRIMARY KEY`, `AUTOINCREMENT`, `NOT NULL`, `varchar(255)`, `datetime`
>どれもプログラマにとっては当たり前のキーワードだが、オートインクリメントって何?って人がほとんどなのではないだろうか?

どんな連中が回りにいるんだよwww
0877nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
いま妻に聞いたら知らないらしかった
0878nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
嫁さんcakeやってんの?w
てかcake触る人でもDB構築してるわけじゃん?autoincrement知らないわけないんじゃないのか
0879nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
Postgresメインなんだろうきっと
0880nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
フォームヘルパーにて入力された値をこねくり回してDBに入れてます
そのため架空のフィールド名'tmp.hoge.huga'みたいなのでタグを生成してるのですが、編集の際にまたこねくり回してフォームに値を戻したいです

その際にどこかに値をセットすれば値を戻してくれたりするのでしょうか?
コントローラでthis->dataに辺りに値を戻せば戻してくれると思ったのですが、上書きすんなってdata上書きすんなって怒られました
0881nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
モデルに設定すべきやろ
0882nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
双方向の変換ロジックをモデルに実装したらいいだけじゃ?
0883nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
なるほど、ありがとうございます
意図することはわかるのですが具体的にどんな感じで書けばいいのでしょうか??
0884nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
>>880
$this->dataなんてない。$this->request->dataだろ。
0885nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
cakeかmysqlかわからないのでこっちで質問させてもらいます
ファイルのアップロードを行っていて
mysqlのカラム名はfile_nameでtext型 not NULL で作っていて

コントローラーでfileの名前を変えた後
$this->request->data['Model']['file_name'] = $imageName;
$this->Model->save($this->request->data)
で保存しています
ほかのIDやbodyなどは正常に保存できていて
file_nameだけphpmyadminで見ると全部NULLになります

でもviewのほうで<?php echo $Item['Model']['file_name']; ?>
とするとしっかり保存されている名前がでてきます

ファイルもしっかり保存されています

mysqlとの食い違いがよくわかりません
原因とかえすぱーできませんか(´;ω;`)ブワッ
0886nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
よくわからんが、ひとついえることは、カラムはNOT NULLなんだろ?

> file_nameだけphpmyadminで見ると全部NULLになります
おかしくないか?
0887nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
んーww
phpmyadminのバグなのかもしれないけど

カラム名も表示されないんだよね
なんか違反してるのかなぁ

>>886
ちゃんとnot NULLで作ってるけど

表示はNULLで中身はしっかり入ってる状態っていうのかなぁ・・・
値は取れるから・・・


プログラミング自体初心者だから積んでる(´;ω;`)ブワッ
0888nobodyさん2013/08/04(日) NY:AN:NY.ANID:???
解決しました

バグでもなんでもなくてphpmyadminの仕様で表示が省略されるっていうのでした

すいませんでした
0889nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
>>883

class こねくるモデル extends AppModel {


 public function こねくる(元のデータ) {
  // こねくりまわす
  return こねくり回されました!
 }

 public function もどす(こねくり回されました!){
  // こねくりを元にもどす
  return 元のデータ
 }
}


場合によっては不可能だけど、事情が許せば
static にして、更に可能なら Utility とかのディレクトリに
別のクラスを作ってそこに実装する

そうするとテストや保守がしやすい。
0890nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
ちょっと>>880の質問自体が何言ってるかわかりにくいんだけど
beforeSaveで加工して
afterFindで戻せばいいだけじゃないの
0891nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
>>889
いやUtilityはねーよ
08928802013/08/05(月) NY:AN:NY.ANID:???
ありがとうございます!
あとは、返却された値を$this->request->dataに入れればスムーズに行きそうな感じですね
>884の通りrequestの方でした、this->dataもあって中身は同じでした

ちなみにやりたかったのは複数レコードの挿入で、

A. x
B. y
C.1
d.1 2 3
E. 9
f. 4 5 6

と入力された時に
[x y 1 - 1][x y 1 - 2][x y 1 - 3]
[x y 9 - 4][x y 9 - 5][x y 9 - 6]
みたいな6レコードを挿入するみたいな感じです
0893nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
客観的に何も知らない第三者が読んだ時に理解できる文章になてるか読みなおして十分な説明をしろ
>>892の最後の段落とかわけわからん
08948802013/08/05(月) NY:AN:NY.ANID:???
日本語もおかしかったですね、すみません!
0895nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
>>892
>ちなみにやりたかったのは複数レコードの挿入で、

なんでそれを解決してから書くの?
なんで先に書かないの?
08968802013/08/05(月) NY:AN:NY.ANID:???
質問の仕方もおかしかったみたいですね、すみません!

仕切りなおしで意見を聞きたいんですけど、formヘルパーのinputメソッドを使う時、typeやoptionとかの指定ってviewに直接書いてますか??
自分はmodelのメンバ変数にカラム名=type等を設定しておき、コントローラでそれを$this->set('options',$this->model->hoge)として
、viewで$this->Form->input('hoge',$options)としています

どこかでまとめて設定しておければ後々便利だと思うのですが、みなさんはどうしているのでしょう?
inputDefaultもありかと思うのですが、修正の際に該当箇所が複数あった場合、直すのがめんどいですよね
0897nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
うっせーよ消えろ
0898nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
バリューで自動判別させるhelper
08998802013/08/05(月) NY:AN:NY.ANID:???
>898
なるほど、helperを自分で作るか改造するかってことですね
ありがとうございます

>897
いろいろと参考になったので消えときます!
0900nobodyさん2013/08/05(月) NY:AN:NY.ANID:n+BD/Kj+
cakePHP2の最新版でのバリデーションの
不可解な動きに困っています。ユーザ認証用に作成した user モデルの
中に email 入力エリアがあり、次の様な画面フォーマットになっています。

バリデーションとして
メールアドレスかIDを入力する為、メールアドレス形式では無い
値を�@に入力される場合もあります。

その場合には、当然メールアドレス形式として打倒か否かのバリデーション
を無効化したいのですが、コメントアウトしてもバリデーションがどうやら
掛かってしまっています。何が原因なのでしょうか?


�@ID(メールアドレス) ■■■■
�Aパスワード ■■■

[ログイン]


public $validate = Array(
'email' => Array(
/*
'required' => Array(
//'rule' => Array('notEmpty'), // 空でないか
'rule' => Array('date'),
'message' => 'メールアドレスを入力してくださいね!。'
)
*/
),
0901nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
え?
登録時じゃなくてログインのこと?
09029002013/08/05(月) NY:AN:NY.ANID:???
ログイン時の認証についてです。
emailのバリデーションをどうしても外す事が出来ません。
0903nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
emailのバリデーション部分をコメントアウトしてみたのですが
それでもやはりバリデーションが掛かっている様です。。。

public $validate = Array(
/*
'email' => Array(
'required' => Array(
//'rule' => Array('notEmpty'), // 空でないか
'rule' => Array('date'),
'message' => 'メールアドレスを入力してくださいね!。'
)
),
*/
0904nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
っていうことはログインのコンポーネントで弾いてるんでしょ?
それモデルのバリデーション全く関係ないから。

たぶん Auth コンポーネント使ってるんだろうけど、

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1128&;forum=8
http://d.hatena.ne.jp/lagos_on/20090803/1249292495
http://blog.xao.jp/blog/cakephp/customize-authorization-for-login-using-dual-fields/

あたりを参考にすれば良いと思う。
0905nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
$this->Form->input('email', Array('label' => false,'style' => 'width:150px;'));
・・・�@

を実行すると

type="email" の属性がなぜか自動で出力されている事が原因でした。

そこで�@を実行した時に type="email" が自動で吐き出されない様にするにはどうすれば良いでしょうか?
0906nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
>>904
サンクス

取り敢えず type="email" の属性をブラウザがどうやら自動で判定し
余計なバリデーションを行っていた様です。
※最近のブラウザは結構おせっかいな事をしてくれますね。
0907nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
第二引数に "type" => "text" を入れて、型を明示したらいいんじゃね?
0908nobodyさん2013/08/05(月) NY:AN:NY.ANID:???
>>907
ありがとうございます。
そんな指定方法もあったのですね。
勉強になります。
レス数が900を超えています。1000を超えると表示できなくなるよ。