トップページ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
0042nobodyさん2011/02/19(土) 16:18:50ID:???
>>35
例えば$js->linkとかでリンク先やパラメータに変数を渡したり
メッセージを国際化したいとかそういう時はJsHelper使ったら楽でしょ。

もちろんJsHelperだけでは足りない部分もあるから場面によって使い分ければいい。
0043nobodyさん2011/02/19(土) 16:19:05ID:???
>>41
まぁ、そういうな

>>40
通常は可逆式の暗号化をしておいて、
メール送信などで利用する時だけ
元のメアドに戻してメールするのが普通だよ。
0044nobodyさん2011/02/19(土) 16:59:48ID:???
>>35
JsHelperってjQueryなどの一部のメソッドをphpから呼べるみたいだけど、
正直jQuery書いたほうが書きやすいし、使う気にはなれないな。
普通にjQueryが書ける人ほど、あまり意味の無いヘルパーだと思ってる。

>>38
サイト運営者がユーザーのパスワード見れたらまずいだろう。
自分で運営してるほぼ個人サイトならともかく、
あまり信用できないバイトとかもスタッフに居るケースもあるんだぞ。
バイトが何かやらかしても、自分(自社)に責任が来るんだから、
パスワードの平文はやめとけ。

だから、パスワードはハッシュしか残さないのが普通だな。
非可逆なものだから、パスワードリマインダーは、
ユーザー登録と同様に、短時間有効なトークン付きの
パスワード再設定URLを、登録時のメールアドレスに送るのが良くある実装。
0045nobodyさん2011/02/19(土) 17:09:31ID:???
>>44
なるほど。勉強になるよ。
メアドとかはハッシュにするもんなの?
0046nobodyさん2011/02/19(土) 17:42:55ID:???
パスワードを完全ハッシュ化(難読化)する事って常識だと思うんだけどな・・・
会員制サイト作るならまずそこから勉強するだろ。
>>45は完全独学かよ。知識なさ過ぎる。
0047nobodyさん2011/02/19(土) 18:17:19ID:???
>>45
ヒント:ハッシュは非可逆暗号で作られている
0048nobodyさん2011/02/19(土) 18:21:28ID:???
>>46
会員制サイト作る際の、そういう細かい点まで教えてくれるサイトあったら教えて
0049nobodyさん2011/02/19(土) 18:25:35ID:???
cake使っていて知らないとは・・・?
0050nobodyさん2011/02/19(土) 19:55:20.04ID:???
CakePHPのctpを使いたくないです
テンプレートと入れ替える方法どこかに載ってないでしょうか
0051322011/02/19(土) 20:00:34.20ID:???
ありがとうございます。

>>33
なるほど、専用のクラスがあるんですね。
というか、Cookbookに載ってますね。勉強不足でした。

>>34
最初その方法を考えたんですが、前述のとおり違和感があったので悩んでました。
でも結構メジャーなWordPressがその方法を取っているってことは、パフォーマンス的には良い方法なんですかね?
0052nobodyさん2011/02/19(土) 21:05:10.89ID:???
WordPressの開発思想は独特だよ。
DRYを積極的に無視してクラスもなるべく作ってない。
メリットは、入り組んだクラス呼び出しや
汎化してぱっとみなんの処理か分かりにくいコードが少ない。
だからプログラミングが苦手な人でも、改造したいところを変えれば、
あまり他に影響させずに改造できる。
デザイナーなどの支持を得ての普及だね。
それもひとつのやり方だけど、
コードが読みにくいし俺はあまり好きじゃないな。

設定がDBにあるのは、そういった考えの下、
管理画面から変更できるようにするためだろうね。
WordPressは基本的に設定ファイルを変えて、アップロードとかする必要が無い。
0053342011/02/19(土) 22:02:05.74ID:???
>>51
パフォーマンス的にはSQLを一回投げる分悪くなりそうだけど、
>>52の言うように、管理画面からいろいろ設定を変えたりすることを考えると
DBで保持してた方が更新が楽な気がするなあ
「絶対固定!」って値ならファイルのどこかに書いちゃってもいいと思うけど
0054nobodyさん2011/02/19(土) 22:18:34.42ID:???
まったくお勧めはしないけどね。
WordPressはオープンソースで配布して使うから、
ブログ名の設定が管理画面から出来る必要があるだけだし。
そういう設定なんて早々変更はしないでしょ。
開発者が設定ファイルを変更するなんて簡単だし、
DBに入れるほうが余計なトラブルの元さね。
設定をDBに入れると、開発中のデバッグで泣きを見ると思うよ。
0055nobodyさん2011/02/20(日) 00:35:05.01ID:???
そうそう。外部ファイルにまとめられるならその方が良い。
0056nobodyさん2011/02/20(日) 02:37:47.09ID:???
俺は、サイト用の設定はDBでとアプリ用の設定はファイルでって言う風に分けてるよ。
使い回しする時に楽だからね。

サイト名とかサイト説明とかそういうのはDBで管理画面からいじれるように。
画像置き場のパス設定だとか外部APIのTokenみたいなのは設定ファイルに入れとくって感じで。
0057nobodyさん2011/02/20(日) 02:45:57.34ID:???
ん?Configure::write()を使えば設定ファイル書き換えできるんですよね?
それならDB使わなくても管理画面から弄れる様に出来ません?
0058nobodyさん2011/02/20(日) 03:08:54.00ID:???
>>57
違うよ。write()はConfigureクラスのインスタンスに書き込むんだよ。
0059nobodyさん2011/02/20(日) 03:24:35.31ID:???
>>58
Configure::storeを上手く使えばok?
0060592011/02/20(日) 03:31:43.25ID:???
ttp://logsoku.com/thread/pc11.2ch.net/php/1229669539/935-944
だめっぽいですね。結局DBか…。
0061nobodyさん2011/02/20(日) 11:43:48.57ID:???
セッションをDBに保存している場合、
定期的(?)に古いセッション情報を削除しているらしく、
そのタイミングでDB側が処理に詰まってしまう。
誰か解決方法教えてください。
0062nobodyさん2011/02/20(日) 16:20:03.81ID:???
通常のフォルダとSSL用のフォルダに分かれてるサーバーの場合、
どうやって配置すればいいんだろう?
0063nobodyさん2011/02/20(日) 16:31:12.20ID:???
http://hoge.com/username
へ行った時に

hoge.com/users/view/username
(usersがコントローラー、viewがアクション、usernameがパラメーター)

の内容を表示させるには
routes.phpをどのように表示させればいいでしょうか?

ここの部分以外は

http://hoge.com/controller/action/parameter

と通常の形にしたいです
0064nobodyさん2011/02/20(日) 18:00:18.41ID:???
これ使えないね、初心者用
0065nobodyさん2011/02/20(日) 19:54:03.09ID:???
>>63
usernameがパラメーターである条件が明確じゃないと
両方のパターンを共存させるのは無理くさいな
やるとしたらroutesじゃなくてrewriteの分岐だろうね
例えばusernameの先頭1文字が数値の場合はパラメータとして判別するとか
0066nobodyさん2011/02/20(日) 21:45:26.61ID:???
>>63
routesで先にユーザーページ以外のURLにマッチするパターンを羅列して振り分ければ?
あとはユーザーネームとしてあり得るパターンの正規表現を使うか
0067nobodyさん2011/02/21(月) 00:10:51.01ID:qx7ew/PU
フォームを全て空白で送信し、controller内で
if($this->User->validates()) {
echo "ok";
}else {
echo "ng";
}

だったときに必ずOKになってしまいます。
modelのvalidation定義で下記のようにしたらしたで、
条件を満たしてるのバリデーションエラーが出っ放しになります。
これって解決できますか?

public $validate = array(
'username'=>array(
array(
'rule' => 'alphaNumeric',
'required' => true,
'message'=>'Username has to be 10 to 20 alphaNumeric characters!'
),
array(
'rule' => 'isUnique',
'required' => true,
'message'=>'This username is already in use.'
),
array(
'rule' => array('between', 10, 20 ),
'required' => true,
'message'=>'Username has to be 10 to 20 alphaNumeric characters!'
)
),
)
0068nobodyさん2011/02/21(月) 00:24:48.77ID:qx7ew/PU
すみません、補足で質問させてください。

validationって基本的に if($this->User->save($this->data)){} と絡めて使いますよね。

他の判断条件も組み合わせた時、
入力フォームのバリデーションエラーも一緒に出力したい場合ってどうすればいいですか?

下記だと、まず他の条件を先に判定してしまうため、他の条件判断が満たされない場合は
$this->dataのバリデーションエラーが出力されません。何かスマートな方法をご教授くださいませ。

if(他の条件判断){
 if($this->User->save($this->data)){
 echo "saved!";
 }
}else{
echo " ERROR!! 他の条件が満たされていません!"
}
}


0069nobodyさん2011/02/21(月) 00:38:18.41ID:qx7ew/PU
もしかして バリデーションエラーを出力するためだけに
saveをこういう使い方しますか?
結果としてはバリデーションも他の条件のエラーも一緒に表示されるようになりました。
ただsave関数なのにsaveしないところで記述するってのが少し解せないかんじもします。




if(他の条件判断){
 if($this->User->save($this->data)){
 echo "saved!";
 }
}else{
$this->User->save($this->data);<<<<<<<<<<<<<<<<<<<<<<<<<<<<
echo " ERROR!! 他の条件が満たされていません!"
}
}
0070nobodyさん2011/02/21(月) 00:46:05.47ID:qx7ew/PU
だめですね。
「他の条件以外」を完全に満たしていて、「他の条件」を満たしていない時にsaveされてしまいますね。。。(当たり前か・・・)

0071nobodyさん2011/02/21(月) 01:02:03.32ID:???
全然読んでないけど落ち着いてマニュアルじっくり読んでこいよ。
0072nobodyさん2011/02/21(月) 03:01:11.38ID:???
ちょっと疑問に思ったんだが

CakePHPであることを隠蔽するってあったけど、どうしてもコントローラ名(URLの一部)が複数形の単語だったりで、特徴あるからすぐバレるよね?

かといって命名規則を無視出来んし
0073nobodyさん2011/02/21(月) 04:13:38.11ID:???
それって特徴か?
0074nobodyさん2011/02/21(月) 04:29:12.00ID:???
アソシエーション組む時って
リレーション先のテーブルのモデルのphpファイルも用意してやらなきゃいけないの?
リレーション元のモデルからbelongsToとか使えば特に要らない?
0075nobodyさん2011/02/21(月) 04:46:55.30ID:???
なぁ、前から疑問に思ってたことなんだが、
なんでCakePHPはControllerにビジネスロジックを書いちゃうの?
MVCとかちゃんと理解して作ったとは思えないんだよね。
0076nobodyさん2011/02/21(月) 05:56:25.75ID:???
ちゃんとModelにロジックかいてる人も居るよ
0077nobodyさん2011/02/21(月) 08:20:26.21ID:???
マニュアル読んでると、

コントローラ名
モデル名(ただし単数系)
ビューのフォルダ名

DBのテーブル名

を統一しろ!的になってますが

UsersのDBテーブルに対して、同じ名前のコントローラー、モデル(単数系)、ビューのそれぞれを持っていたとします。

ただしhttp://www.hoge.com/registrations/として、

registrations_controller.phpとregistration.php上でメインでUsersテーブル(外部モデル)を扱うことって可能ですか?

もちろんregistrationsというテーブルは一切持たないものとして、usersテーブルのレコードを処理するためだけのコントローラーです。
0078nobodyさん2011/02/21(月) 10:51:44.25ID:???
俺も普通にModelにロジック書いてるけどな
ControlloerはあくまでModelを実行して結果をViewに渡す目的で使ってるけど。
0079nobodyさん2011/02/21(月) 11:22:15.22ID:???
>>77
> マニュアル読んでると、
ダウト!
0080nobodyさん2011/02/21(月) 11:23:25.80ID:???
逆にModelにロジック書かない人(というかContorllerに書いちゃう人)のソースは見たくない
0081nobodyさん2011/02/21(月) 13:16:29.48ID:???
CakePHPのctpを使いたくないです
テンプレートと入れ替える方法どこかに載ってないでしょうか
0082nobodyさん2011/02/21(月) 13:22:14.73ID:???
>>77
CakePHPの場合、どういうURLにしたいか考えずに、
テーブル/Modelから考えたほうがいいよ。
そうすると、良くある形として .com/users/registration みたいな感じになる。
で、こういう規約まんまのURLがまずいなら
routesで調節するんだ。
一応、これがセオリーだと思う。
まぁ、routesって使いこなすのに慣れが必要だから、
セオリーになりきれてないかも。
0083nobodyさん2011/02/21(月) 13:53:20.59ID:???
>>75
MVCに慣れていない最初はControllerに書いちゃいがち。Controllerは動きがわかりやすいからね。
そのうちああこんなのモデルに書いた方がいいだろ。って気がつく。
0084nobodyさん2011/02/21(月) 18:39:36.01ID:???
>>83
例えば、どんな例?
0085nobodyさん2011/02/21(月) 18:41:10.45ID:???
カテゴリとか設定ファイルをDBで作っている場合
0086nobodyさん2011/02/21(月) 19:09:17.15ID:???
誰かキャプチャを実装してる人いる?

ReCaptchaは王道だけど会員にならないといかんし、
KCaptchaは地味過ぎる
Securimageが一番いいけど、他の人のブログ参考にしても、マトモに動かん
0087nobodyさん2011/02/21(月) 20:13:42.08ID:???
チェックボックスAとB、テキスト入力CとDがあって、
チェックボックスAが選択された場合テキストCが必須
チェックボックスBが選択された場合テキストDが必須

のようなvalidateはどうかけばええでしょう?
0088nobodyさん2011/02/21(月) 20:48:44.56ID:???
普通にbeforeValidateにifで書けば?
0089nobodyさん2011/02/21(月) 21:40:05.60ID:???
>>88
ありがとう
ちょっと試してみます
0090nobodyさん2011/02/21(月) 22:51:13.06ID:???
>>77と同じ疑問を持ってるんだけど
Controllerがテーブル名っておかしくね?
他のテーブル使う時どうすんのよ?
てゆーか、普通コントローラはユースケース毎に付けね?
0091nobodyさん2011/02/21(月) 23:03:58.43ID:???
別にControllerとModel(=DBテーブル)が一対一対応するとも何とも書いてないだろーよ
ドキュメント読め
0092nobodyさん2011/02/22(火) 01:12:43.84ID:???
>>91
ControllerとModelが一対一であるとは限らないのに
Modelの名前をControllerに付けるというのが意味不明だって言ってんだよ。
意味分かる?

0093nobodyさん2011/02/22(火) 01:56:19.29ID:???
推奨されているやり方であって、強制力はないわけだし、
自分のやりやすい形でやればいいじゃん。
ビジネスロジックもコントローラに書くことはできるわけだし。

少なからず、コントローラとモデルの名前が一緒だったら、
このコントローラは、このモデルに関する物だなと直感的にわかる
0094nobodyさん2011/02/22(火) 02:01:08.73ID:???
キャプチャとか使う方が面倒なもん入れないでくれ、読めねーんだよあれ
無能な技術者が思いついたとしか思えんアホみたいな仕様だよな、あれ
10年後は誰も使ってなくて「昔あんなんあったよねーキャハハ」って笑われてるよ
0095nobodyさん2011/02/22(火) 02:14:52.46ID:???
キャプチャは甘え
0096nobodyさん2011/02/22(火) 02:45:01.87ID:???
メール欄の確認があってしかもコピペ不可だとぶん殴りたくなるよね
0097nobodyさん2011/02/22(火) 02:49:34.76ID:???
Cakeの導入を検討してるのですが、一つ質問させて下さい。

select user_name from users;
から取得したデータをビューで出力する際、テンプレートで例えばですが、

<?php foreach (...): ?>
<?php echo h($data['user_name']) ?>
<?php endforeach; ?>

のような制御が必要ですよね。
Cakeって配列の命名はcamelCaps形式だと思うのですが、カラムがuser_name (アンダースコアを含む) の場合、
配列のキー名はsnakeCase形式になりますよね。
命名規則がバラけると思うのですが、その辺りどちらかに統一するとか指針はあるのでしょうか。
0098nobodyさん2011/02/22(火) 03:14:21.97ID:???
>>97
テーブル名をuser_nameじゃなくてusernameにするのがいいです。
HABTMの時に頭がごちゃごちゃになります。

無理ならInflectorを通してみて確認するといいよ。
どっかにそういうサイトもあったけど忘れた。
0099982011/02/22(火) 03:20:23.25ID:???
ああごめん。カラム名はなんでもいいです。


0100nobodyさん2011/02/22(火) 04:00:42.68ID:???
HogeUser,MogeUser,PogeUserというモデルがあって、
それぞれのユーザー同士で1対1の簡易メッセージの送受信をさせたい時、下記のような設計で問題無いでしょうか?

■モデルのアソシエーション
HogeUser hasOne Mailbox
MogeUser hasOne Mailbox
PogeUser hasOne Mailbox
Mailbox HATBM Message

■DB
mailboxes:
id

mailboxes_messages:
mailbox_id
message_id
sended (true=送信側, false=受信側)
opened(true=開封済, false=未開封)

messages:
id
title(件名)
body(本文)
created

*_usersテーブルはそれぞれmailbox_idフィールドを持っています。
*_usersはそれぞれ構造が全く異なるのでusersとして統一させることはできません。
0101nobodyさん2011/02/22(火) 04:47:39.88ID:???
>>97
CakePHPでキャメルケースになるのは、配列のキーじゃなくって、
モデル名だよ。

usersテーブルはUserModelが担当するんだ。
UserModel->find()したら、データは

$this->data['User'] = カラム名をキーとした連想配列 //1件の時(ってこうなるよね?)
$this->data = array(['User'] = カラム名をキーとした連想配列, ... ) //複数件のとき

こんな感じだったはず。
UserModel部分がUserという配列のキーになってる。

98の言うとおり、HABTMの中間テーブルがアンダーバーで繋ぐから、
テーブル名にアンダーバーを、それ以外で使うのはお勧めしない。
カラムには全然おk
0102nobodyさん2011/02/22(火) 05:00:04.31ID:???
>>100
設計についてはスレチだし、めんどうだから考えないけど、CakePHPとして一言。

HABTMの中間テーブルには、プライマリキーと外部キー以外はもてない。
別にカラムがあっても動くけど、その情報はきえてしまうんだ。
だからsended openedがだめ。

消えてしまうというのは、mailbox_id = 1にmessage_id = 1と2の2通のメッセージがある状態で、
新たなメッセージ message_id = 3がきた場合、
DELETE FROM mailboxes_messages WHERE mailbox_id = 1 してから、
INSERT文でmessage_id = 1と2と3を発行するんだ。
だからmessage_id = 1と2のsended openedはきれいさっぱり。

中間テーブルに何か情報を持たせたいなら、HABTMじゃなくって
hasManyとbelongsToで作るべき。
当然、HABTMじゃないからfind()の仕方も変わってくるけどね。
0103nobodyさん2011/02/22(火) 07:55:59.50ID:???
>>97
基本はキャメライズするんだけどDBテーブルは慣習的にアンダースコアだからフィールド名を配列キーとして使うときだけはそのまま
0104nobodyさん2011/02/22(火) 12:23:15.78ID:???
Cakeの構成で違和感があるとすれば、app以下のディレクトリ構造だな。
Userと言うモデルがあったとして、それぞれmodels、controllers、views
に入れないと行けない。viewsに関してはディレクトリを作成して。

一つのディレクトリ内にまとめて
/app
/user
└controller.php
└model.php
└index.ctp
└form.ctp

でもいい気がする。ビューが増えるならviewディレクトリ作って入れるとか。
こうすればFTPで転送する時、userディレクトリだけで良いし。
0105nobodyさん2011/02/22(火) 13:15:54.00ID:???
Cakephpで作ってるサイトって
ドメイン下に/users/
ってつけたら、大抵ページが存在するから見破るのがラクすぎる
0106nobodyさん2011/02/22(火) 13:17:18.37ID:???
俺そんな構成のフレームワークやだなぁ。
てかMVC毎にフォルダ分けるのってCakeだけじゃないというか、
その構成の方が主流じゃないのか?
むしろ他にある?
0107nobodyさん2011/02/22(火) 13:21:44.92ID:???
>>106
主流なんだけどさ、ファイル編集する時、あっちこっち見に行かないと
いけないというのが作りづらさを感じるんだよね。
ま、>>104だとファイル名が全部同じになって分かりづらいってのもあるけど。
0108nobodyさん2011/02/22(火) 13:41:17.74ID:???
usersなんてディレクトリ普通あるか?
0109nobodyさん2011/02/22(火) 14:49:33.94ID:???
>>108
もしかしなくてもCakePHP使ってないだろ
0110nobodyさん2011/02/22(火) 16:02:30.52ID:???
>>104でも悪くない気がするけど、モデルを基準にしてディレクトリ分けるというのも微妙だな
モデルはないけどコントローラーだけ存在するとか、そういう場合にわかりづらくなる気がする

>>108
userモデルを使った場合routesで/users/usernameみたいにする人が多いってことじゃね?
cakeに限らない気がするけど。
0111nobodyさん2011/02/22(火) 20:03:44.94ID:???
CakePHPって主テーブルしかレコードの編集できんの?
belongsToとかで繋がってる先のレコードを編集できんの?
0112nobodyさん2011/02/22(火) 20:15:38.73ID:???
>>111
出来る。
やり方は自分で調べてね
0113nobodyさん2011/02/22(火) 20:53:00.76ID:???
>>112
やり方を調べる方法おしえて!
Googleさんで、何て調べればいいのかわからない
0114nobodyさん2011/02/22(火) 21:05:25.69ID:???
>>113
http://book.cakephp.org/ja
ここを全部読んでください。
何度読んでもわからなかったら、あなたにはCakePHPに向いていません
0115nobodyさん2011/02/22(火) 21:06:17.50ID:???
>>114
時間かかりすぎるやん!!
せめて、どのページかだけでも教えてちょんまげ!
0116nobodyさん2011/02/22(火) 21:12:51.08ID:???
あなたには、CakePHPの知識が圧倒的に足りません
時間はかかりますが、全体を見ることをお勧めします
0117nobodyさん2011/02/22(火) 21:52:12.81ID:???
今日の住人はツンの日か
0118nobodyさん2011/02/22(火) 21:56:31.59ID:???
>>116
そこをなんとかお願いします
0119nobodyさん2011/02/22(火) 22:39:56.66ID:???
>>104
お前の稚拙な考えはmixiとかで発表してろ。
お前のようなど素人は秀丸とかでちまちまやってから
辛いかもしれんがプロはIDE使ってるんだよ。心配すんな。
0120nobodyさん2011/02/22(火) 22:41:35.07ID:???
>>119
お前、秀丸つかってんの?
俺はイクリプス一択なんだけど?w
0121nobodyさん2011/02/22(火) 22:44:08.89ID:???
なんか口の悪いおっさん多いなぁ
0122nobodyさん2011/02/22(火) 23:17:03.04ID:???
秀丸はダサイ
0123nobodyさん2011/02/22(火) 23:17:28.23ID:fDDX4hLa
すみません。素人ですが横から質問させてください。

モデルのuser.php(usersテーブルを呼び出し)と
コントローラのregisters_controllers.phpと
ビューのregistersフォルダがあります。

registers_controllers.phpを下記のようにしてモデルのuser.phpを呼び出し
usersテーブルを読み込もうとするのですが
Error: The view for UserController::add() was not found. が出ます。
viewsにはregistersフォルダを用意してあり、index.ctpも配備されているのですが
なぜエラーが出るのでしょうか?


---registers_controller.php----------------------------------
<?php
class RegistersController extends AppController {

var $name = 'User';
以下略
------------------------------------------------------------



---user.php-------------------------------------------------
<?php
class User extends AppModel {
var $name = 'User';

以下略
0124nobodyさん2011/02/22(火) 23:31:02.14ID:???
class RegistersController extends AppController {
var $name = 'Registers';
var $uses = array('User');
0125nobodyさん2011/02/22(火) 23:32:12.94ID:???
>>123
エラーメッセージ読めよ。
UserControllerはあるのか?
CakePHPはUserControllerがあるという認識で動いてるぞ。
0126nobodyさん2011/02/22(火) 23:35:19.01ID:fDDX4hLa
>>124, >>125
ありがとうございました。おかげさまで出来るようになりました。
0127nobodyさん2011/02/22(火) 23:47:54.53ID:fDDX4hLa
ごめんなさい、初心者ごとで申し訳ないのですがもう1つだけ質問させてください。

コントローラ(registers)で他モデル(user)を呼び出した後、
コントローラ内に他モデル(user)を扱う場合は
$this->User->ほにゃらら で使えますよね?

では、viewから下記のようにデータを受け取ったときはどのように
すればいいのでしょうか?純粋に
$this->register-> でOKですか?

echo $this->Form->create('Register');
echo $this->Form->input('email');
echo $this->Form->submit();
echo $this->Form->end();
0128nobodyさん2011/02/22(火) 23:51:58.04ID:???
>>127
いくら分かりにくくて間違いも多いといわれるCookbookとはいえ、
それくらいはちゃんと書いてあるぞ。

そのレベルの質問をするなら、
せめて
http://book.cakephp.org/ja/view/1528/CakePHP%E3%83%96%E3%83%AD%E3%82%B0%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB
この実務で使いそうなちょっと込み入った使い方には一切触れてないチュートリアルで
ブログ(笑 を作ってみれ
0129nobodyさん2011/02/22(火) 23:55:07.65ID:fDDX4hLa
>>127
すみません。一応このチュートリアルもACLもやったんですが、
いまだに理解できていないのが現状です。。。
0130nobodyさん2011/02/23(水) 00:03:55.10ID:gK6lHkB0
>>128さん

>>127でviewのForm->create()で実質ユーザーテーブルへ登録することになるけど
飛び先はそのままのページ(register.add)へ遷移させたいので
echo $this->Form->create('User',array('url'=>'.'))
としていますが、おかしいようです・・・・
0131nobodyさん2011/02/23(水) 00:09:28.68ID:gK6lHkB0
hoge.com/registers/addに飛ばしたいのですが、
formで別モデル(User)を指定しているのでジャンプ先が必ず
hoge.com/users/registers/add になってしまいますねorz
0132nobodyさん2011/02/23(水) 00:25:23.06ID:???
>>129
うーん、やったとは思えんのだがなぁ。

> では、viewから下記のようにデータを受け取ったときはどのように
> すればいいのでしょうか?純粋に
> $this->register-> でOKですか?

http://book.cakephp.org/ja/view/1537/%E8%A8%98%E4%BA%8B%E3%81%AE%E8%BF%BD%E5%8A%A0

流石にチュートリアルやっといて$this->dataを忘れるとは思えぬ・・・

俺モデル名とコントローラー名は規約どおりにしかやったこと無いからなぁ。
初心者ならあまりトリッキーな事はしないほうが、無用なトラブルを避けられると思うよ。
0133nobodyさん2011/02/23(水) 00:41:36.70ID:gK6lHkB0
>>132
すみません。チュートリアルもやるにはやって本も400ページほど読んだのですが、
完全に把握できず、どういうものか良く分からないで何となくやってるのが現状です。

こういう理解でよいものでしょうか?

1.フォーム入力から受け取ったデータは、取り扱っているモデル名に関わらず
$this->dataという変数に連想配列形式で格納される

2.DBからのデータは $this->(モデル名)->(様々な関数コマンド)を利用して
必要な分だけを呼び出す。
もし、Modelでアソシエーションを組んでいた場合、その呼び出した際の
メインテーブルの対象レコードに紐づくアソシエーション先も自動的に呼び出される。
すなわち モデルTable1にTables2をアソシエーションで設定していたら
$str = $this->Table1->find('all');

この時点で$str[0][Table2][任意フィールド]の中に
Table1で絞られたレコードのTable2の関連レコードが格納されている

という認識でいいんですよね?

あと良く分からないのがアソシエーションを組んでるときに
$this->Table1->Table2->save()
みたいに複数のテーブルを跨いでいってる場合です。
普通に
$this->Table2->save()
じゃ駄目なのでしょうか?
0134nobodyさん2011/02/23(水) 00:46:24.44ID:gK6lHkB0
>>132
これもコントローラ名(URL)を複数形やテーブル名と同じにしなければいけないという
基本規約のせいなんです。

たとえば皆さんは会員登録もメンバーリスト参照も同じusersコントローラでするのですか?
http://hoge.com/users/register
http://hoge.com/users/view
のように

この場合、cakephpで作っているのがミエミエで攻撃されやすくなりません?
皆様のご意見も聞かせていただければ幸いです。
0135nobodyさん2011/02/23(水) 01:09:41.82ID:???
>>133
ふーむ、しょうがないのう。
> 1.
POSTに限りyes。モデルがどうなってるかは、コントローラーでdebug($this->data)とかして、
自分で見てみると良い。
あと、CakePHPでGETメソッドは上級者向けなのでなるべく使わないほうが良い。
> 2.
大体そんな感じ。このあたりは奥が深いので、
とても1レスで全てを伝えるのは無理、というか俺も把握しきれてない。
$this->Model->Model->save()はあまりしないな。
トリッキーな事をしてなければ、UsersコントローラーではUserモデルへのデータと、
アソシエーションで紐ついてるデータを保存するわけだからな。
$this->User->save()か$this->User->saveAll()で基本的には十分。
Userモデルに紐付く何かも、ViewをFormHelper使って無難に作っていれば、
$this->dataをsave()かsaveAll()すれば問題なく保存されるはず。
ただ、どういう場合にsave()かsaveAll()は俺もちょっと語れるほどじゃない。たまに試行錯誤する。
0136nobodyさん2011/02/23(水) 01:20:15.27ID:???
>>134
CakePHPではURLの見栄えはroutesで調節するのがセオリー。
ただ、これはちょっと難易度が高いのが難点。
ここでのやり取りから察するに、質問者はroutesにかなり時間をかけて取り組むことになるとは思う。

一応Cookbookはこのページだけど、なんかだらだらと書いてあって要点を得ない。
とても分かりにくい。が、しかたがない。

http://book.cakephp.org/ja/view/945/%E3%83%AB%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A

> 一般的な Router の他の使い方は、コントローラの別名(alias)を定義することです。通常の /users/someAction/5 という URL の代わりに、/cooks/someAction/5 でアクセスさせたいとしましょう。このようなルートの設定は、次のようにすることで簡単に実現できます。
> Router::connect(
'/cooks/:action/*', array('controller' => 'users', 'action' => 'index')
);


一応この方法でUserControllerのまま、URLを変える事が出来る。
ただ、これだと/cools/add みたいなのもUsersController->index()に行っちゃいそうな気がするけど・・・
Cookbookが間違ってるのか俺が間違ってるのか。面倒だから確認はしない。
0137nobodyさん2011/02/23(水) 01:35:30.01ID:gK6lHkB0
>>135さん,>>136さん
ありがとうございます!!!感謝感激です。

>>127の件は下記で解決できました!!!
echo $this->Form->create('Register');
echo $this->Form->input('User.email');←モデル名. をフィールド名の前へ追加
echo $this->Form->submit();
echo $this->Form->end();


>>134についてですが、皆さんは規約どおり
usersテーブルに関連するものであれば全てURLを
hoge.com/users/○○○○○
としてるのですか?
CakePHPで作ってるのを隠蔽したいのであれば、工夫などされていませんか?
0138nobodyさん2011/02/23(水) 01:40:49.20ID:gK6lHkB0
それと例えば hoge.com/register/でアクセスさせたいのに規約のせいで
hoge.com/registers/と複数形になるのは諦めてますか?
それとも>>136さんが言うようにroutesで調整してます?

そうなれば、そもそもusersコントローラとregistersコントローラに分ける
必要はなくて最後にroutesで全て設定すればいいんでしょうか?
どういうやり方が標準なのか分からず、ごめんなさい。
0139nobodyさん2011/02/23(水) 01:52:29.68ID:???
これソース読めん。
0140nobodyさん2011/02/23(水) 01:56:59.29ID:???
>>137
そりゃたまにはコントローラーとモデルの規約に沿わない名前にすることもあるよ。
1モデルに大して2コントローラーなケースとか、その逆とかな。
ただ、それなりにCakePHPの中身を分かってるから出来るだけで、
初心者がURLに見栄え目的に規約に沿わない名前にすると、
今見たくトラブるだけさね。

CakePHPは規約に沿う事で色々と工数を省略できるようになってるわけで、なるべく沿ったほうが良い。
ただ、コントローラー名=URLだと困る事も想定はされる。
でも規約に沿わないとめんどくさくなる。
だからroutesで設定できるようになってるんだ。

別に規約に沿わなくても開発は出来るよ。
ただ、CakePHPの利点を使わないで作るから、めんどうになるし、
/register/addに遷移したいのに/users/addに遷移したりとトラブルになりやすいだけ。
FormHelperでいちいちModel.fieldにしないといけなくなったのも、規約に沿ってない弊害だな。
0141nobodyさん2011/02/23(水) 02:06:04.37ID:gK6lHkB0
>>140
懇切丁寧な解説ありがとうございます。
非常に説得力があります。
確かにこれではCakePHPのメリット(省略による開発速度)が損なわれてしまいますね

やはり、基本的には
関連するテーブルは一つのコントローラ、モデル、ビューに収めていく形式がいいのですね。

そうすると、一つのコントローラの中に多くメソッド(アクション)が入りすぎてゴチャゴチャになるという理由からもコントローラを二つにして、メソッドを分けようと思っていたのですが、そのやり方は一般的ではないんですね?

一つのコントローラ内にアクションが30個入るとか普通なのかなぁー(^_^;)

URLの見栄えの件はroutes設定で了解です。


ただ全てのコントローラ(URL)が複数形になっていますが、これを全部単数系にroutes内で弄っていくのが一般的なのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています