【PHP】フレームワーク CakePHP 17ホール目【v2.4】
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2014/03/01(土) 17:03:24.57ID:8AJ9GD6ECakePHPから派生したLithium(li3)も専スレできるまではここでどうぞ
質問するときはCakePHPのバージョンを書きましょう
※他フレームワークとの比較等はスレ違いです
■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
github - cakephp
http://github.com/cakephp
the Bakery
http://bakery.cakephp.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
※前スレ
http://kohada.2ch.net/test/read.cgi/php/1378659370/
0554nobodyさん
2014/05/18(日) 12:23:32.63ID:???テストを先に書くということですが、
メソッドを先に書く場合もありますか?
0555nobodyさん
2014/05/18(日) 12:34:06.68ID:???記事を書く
記事を見る
記事を削除
の3つのケースを先に書いてテストし実装する
もしくは一つの機能ごとにテストを書く実装する、のどちらが良いのでしょうか。
0556nobodyさん
2014/05/18(日) 18:19:05.82ID:???テストを先に書くことがテスト駆動開発の必須条件の一つだと思うんだけど、
別に原理原則にこたわることもないと思われ。
ただ、教科書的にはまずテストを書いて赤色から発進するのが通則。
>>555
テスト駆動開発は、一般的にはアジャイル開発の一部とされている
(たぶん、そうじゃない場合もあるはずなんだけどあまり記憶に無い)ので
単純なテストからだんだん複雑にして行くことを前提に、
最初は簡単な「記事を書く」テストを書いて実装して
簡単な「記事を見る」テストを書いて実装して、
簡単な「記事を削除」テストを書いて実装して・・・ってことなんじゃないかな?
だけどそれも程度によるだろうから、最初はざっくりアウトライン的に
全体を作って、作りこむに従って単体テストを増やしていったりテスト自体を
詳細にコーディングするってことでいいんじゃないかな?
0558nobodyさん
2014/05/18(日) 23:31:40.02ID:???TDDに限らず、ここで聞くより専門の書籍を一冊買って
それを読んで体系から身につけたほうがいい。
0559nobodyさん
2014/05/19(月) 16:50:44.06ID:???バリデーション自体を中止したいのですが、良い方法はないでしょうか?
以下のようなルールをモデルに書いています。
'image' => array(
array(
'rule' => array('extension', array('jpg', 'jpeg', 'gif', 'png')),
'message' => '拡張子が違います',
'allowEmpty' => true,
)
)
0560nobodyさん
2014/05/20(火) 15:39:04.32ID:RIYxfxGy営業 1−多 顧客
というリレーションがあったとします。
営業 hasMany 顧客 と営業モデルに書いています。
そこで営業コントローラから 「顧客を一件ももっていない営業」をfindする方法がどうしても
思い浮かびません。
どうかヒントをいただけませんでしょうか。
0561nobodyさん
2014/05/20(火) 15:56:13.36ID:???検索条件を
'顧客.id' => null
とすれば行ける気がするのだがどうだろう。
あと、カウンターキャッシュという裏ワザもあるが、
アプリケーション依存になるんで一長一短。
0563nobodyさん
2014/05/21(水) 16:47:46.18ID:???なんかURLのルールが似てる気がする
0565nobodyさん
2014/05/21(水) 19:54:17.38ID:???0566nobodyさん
2014/05/25(日) 12:26:20.21ID:???PofEAAのActiveRecordと違うと思うんだけど。何を元にしてるの?
0567nobodyさん
2014/05/25(日) 13:21:00.24ID:???0568nobodyさん
2014/05/25(日) 14:22:54.54ID:???AppControllerに書かれた$uses、$componentsが使えない(マージされない)問題は
Cake2では直ってるんだっけ?
今確認できないのでどなたか教えてください
0569nobodyさん
2014/05/25(日) 16:32:17.75ID:???Dispatcher でリフレクション呼び出してあれこれゴニョゴニョしてるんで、
多分大丈夫。
正式なアナウンスは知らん。
0571nobodyさん
2014/05/26(月) 21:17:51.86ID:???0572nobodyさん
2014/05/26(月) 21:34:55.75ID:???0573nobodyさん
2014/05/28(水) 12:20:55.53ID:???ルーティングってどう書けばいいですかね?
/hoge/ →Categoryモデルのname「hoge」
/hoge/news/ →Newsモデルのcategory_nameが「hoge」
/hoge/news/detail/1 →Newsモデルのidが1でcategory_nameが「hoge」
こういう場合、hogeの箇所(カテゴリ名)が不特定文字列なので
どういう書き方をすればいいか悩んでいます。cake2系です。
0574nobodyさん
2014/05/28(水) 12:29:00.97ID:???Router::routes(array('/:category/:controller/'));
Router::routes(array('/:category/:controller/detail/:id'));
でどう?
0575nobodyさん
2014/05/28(水) 12:33:07.08ID:???3つ目のURLパターンにおいてIDは数値と決まっているなら
Router::routes(array('/:category/:controller/:id'), array(), array('id' => '[0-9]+'));
とすることで
/hoge/news/1
をマッチさせることが出来ると思う。
0576573
2014/05/28(水) 13:36:48.07ID:???ありがとうございます。この方法ですが、
他のコントローラーと共存させたい場合はどうなるのでしょうか?
/contacts/ お問い合せ用のコントローラー
/faqs/ FAQ用のコントローラー
などがサイトに存在する場合、おかしくなるような気が・・。
そういう場合は、固定のコントローラーを
ルーティングに書いていけばいいんですかね?
Router::routes(array('/contacts/:action'), array('controller' => 'contacts'));
0577nobodyさん
2014/05/28(水) 13:55:25.16ID:???ルーティングは単純な正規表現を先頭からマッチさせていくだけ。
で、最後の最後に通常のマッチングがコアの方に用意されている。
0578nobodyさん
2014/05/28(水) 13:56:01.83ID:???0579nobodyさん
2014/05/28(水) 13:56:49.69ID:???>ルーティングに書いていけばいいんですかね?
>Router::routes(array('/contacts/:action'), array('controller' => 'contacts'));
そうですね。
0580573
2014/05/28(水) 15:29:39.46ID:???ということは、固定のコントローラーは全てルーティングに書く必要があるんですね。
そうなるとあまり利便性が良くないですね。
0581nobodyさん
2014/05/28(水) 17:12:42.77ID:???http://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html
0582nobodyさん
2014/05/28(水) 20:12:28.98ID:???カテゴリ名を自由にするってことは、特定の文字を禁止にするんだろうから、
それを表現できるパターンを第3パラメータに書けば良いと思うよ。
たとえば ["member", "user"] というコントローラを作るんなら
$route = '/:controller/:action/*';
$default = array();
$options = array('controller' => '(member|user)');
Router::connect(compact('route', 'default', 'options'));
あと、アクションを設定しない場合に index を適用させるなら
$route = '/:controller';
$default = array('action' => 'index');
Router::connect(compact('route', 'default'));
を最初に加えておく。
あとすまん、
上で Router::routes() っていうのは Router::connect() の間違いだった。すまん。
0583nobodyさん
2014/05/28(水) 20:13:54.99ID:???lft, rght はIDじゃないよ。
TreeBehavior のアルゴリズムを理解するのにとっておきの記事
http://blog.xao.jp/blog/cakephp/understanding-of-nested-sets-model-for-treebehavior-of-cakeph/
0586nobodyさん
2014/05/29(木) 01:00:35.02ID:???テーブル関係ないビジネスロジックをどこに書くか迷って、コンポーネントに書いてたけど
モデルに書いた方がいいんだろうか?
0587nobodyさん
2014/05/29(木) 01:27:10.16ID:???ビジネスロジックをモデルに書くのは常識だ。
コンポーネントに書いたほうが良いなんて聞いたこと無い。
Rails も Cake もその点においては何も騙してねーと思うよ?
0588nobodyさん
2014/05/29(木) 08:11:31.86ID:???そういう場合にRailsの1モデル-1テーブル形式は破綻してるのは確か。
0589nobodyさん
2014/05/29(木) 08:25:24.09ID:???http://book.cakephp.org/2.0/ja/models.html
とあるせいで、モデル=テーブルに紐付く(原則として)と思ってたよ
市販の解説書も同じような感じで書いてる
0590nobodyさん
2014/05/29(木) 08:44:24.60ID:???モデルの中で他のモデルをClassRegistry::initとかやりたくないんだよ
コントローラに書きたくなければコンポーネントになる
0591nobodyさん
2014/05/29(木) 10:03:02.00ID:veg5U4SWModelじゃだめって理由でComponentに置く発想がおかしい
0592nobodyさん
2014/05/29(木) 10:04:39.91ID:???Controllerの冒頭で配列に入れるだけで$thisで使えるんだから
0593nobodyさん
2014/05/29(木) 10:18:58.89ID:???データベーステーブルと(さらにはコントローラとも)1対1対応しなきゃいけないように見えるから勘違いしやすいんだよな
Railsは1つのモデルに関するロジックは"モデル"クラスに書けるけど
Table Data GatewayのCakeはこれすらコントローラやヘルパーに溢れ出やすい印象
複数"モデル"が絡むときに簡易サービス層として利用されやすいのがコンポーネントなのかな
コントローラから呼びやすいしファットコントローラの一番楽な回避策だろうし
初心者でも(本来の広い意味での)モデルの中にサービス層を作りやすい実装や解説にしておいてくれるとありがたいんだけど
0594nobodyさん
2014/05/29(木) 10:27:52.09ID:veg5U4SWなんだその理由ww
0596nobodyさん
2014/05/29(木) 11:35:25.87ID:Kdl2SKiZ>似て非なるテーブルに同じ処理をしたい場合
これはビヘイビアがいい気がする。
0597nobodyさん
2014/05/29(木) 13:26:17.97ID:???結論は出なかった
0598nobodyさん
2014/05/29(木) 13:48:42.54ID:???>>593 のいうサービス層が必要になる規模は、CakePHPではちょっと対象外なんじゃないかと思ってる。
CakePHPの中の人がどう思って作ってるかはしらんけど。
0599nobodyさん
2014/05/29(木) 15:11:21.10ID:???$useTable = false の別のモデルを作った方がずっと楽だと思うんだが。
コントローラから直接参照できる点は一緒。
データのセット、バリデーション、フォーム値の復元。
使うモデルを $hasOne とか入れとけば ClassRegisry::init も呼ぶ必要ない。
0600nobodyさん
2014/05/29(木) 15:24:59.72ID:???0601nobodyさん
2014/05/29(木) 15:34:31.80ID:???Modelの下にサブディレクトリ切ってAppでパス通すのもありだと思う。
Lib は他で作ったライブラリを置く場所にしてる。
コンポーネントはコントローラの処理を助けることが限定されている場合しか書く意味ない。
もちろん、そういうロジックだけならコンポーネントはすれば良い。
0602nobodyさん
2014/05/29(木) 16:13:20.58ID:???会員制サイトだと、以下のような構成がよくあるが、
会員
└日記
└お気に入り
└掲示板の作成や投稿
会員を削除すると、その下の投稿内容も削除しないとおかしい(と俺は思う)
だから俺は、管理画面で会員を削除したら、user_idがあるモデルは全て削除している。
削除はコントローラーに書いてる。
0604nobodyさん
2014/05/29(木) 16:37:36.60ID:???hasManyでdependentをtrueだな。
俺も基本はそうしてるんだけど、>>602のに「画像」がある場合は困る。
各テーブルを参照して画像情報を取得し、削除していく必要がある。
0605nobodyさん
2014/05/29(木) 16:50:52.43ID:???0606nobodyさん
2014/05/29(木) 18:18:39.64ID:???0607nobodyさん
2014/05/29(木) 18:23:19.16ID:???画像に関して言ったんだけど
dependentで消せないものに関して、Userモデル内から他のモデル呼んでも問題ないと思うけどな
0608nobodyさん
2014/05/29(木) 20:03:02.45ID:???あれば Image モデルの afterDelete に
アセットを削除する処理を書いておけば良いのだろうけど。
saveMany や saveAll はコールバック効くのに
deleteAll は効かないってのもおかしな設計ではあるな。
0609nobodyさん
2014/05/29(木) 23:57:26.91ID:???ないのは updateAll
0610nobodyさん
2014/05/30(金) 01:36:47.29ID:???あ、そうなのか!
deleteAll の第3パラメータを true にするんだな。
今初めて気づいたわ。
じゃぁ、アセットの削除をそこに書けば良いわけか。
0611nobodyさん
2014/05/30(金) 10:22:00.45ID:???0612nobodyさん
2014/05/31(土) 17:06:44.83ID:???それともビヘイビアとかプラグインとかだけ?
教えてください。お願いします!
0613nobodyさん
2014/05/31(土) 18:14:11.40ID:???0614nobodyさん
2014/05/31(土) 18:28:27.72ID:???cakephp2でcakephp/appみたいなの探してるんだけどないかな?
0617nobodyさん
2014/05/31(土) 19:51:01.39ID:???include_path 通しておけばハードコーディングされなくなるけど。
0619nobodyさん
2014/05/31(土) 23:23:49.38ID:???何のことだかわかる?正式な名前とかある?
0620nobodyさん
2014/06/01(日) 12:20:08.01ID:???0621nobodyさん
2014/06/02(月) 00:43:40.92ID:???class Entity extends Model {
public $hasAndBelongsToMany = array(
'RelatedEntity' => array(
'className' => 'Entity',
'foreignKey' => 'relational_id',
),
);
}
こういうこと?
0622nobodyさん
2014/06/05(木) 11:57:49.53ID:+YUe8hGX「コマンド ラインが長すぎます」
というエラーが出るのですが、何かわかる方いらっしゃいますか?
環境は以下の通りです。
Windows 7
CakePHP 2.3.10
PHP 5.3.5
ファイル:app/Console/Command/ApprovalShell
<?php
App::uses('CakeEmail', 'Network/Email');
class ApprovalShell extends AppShell {
public function main() {
$Email = new CakeEmail();
$Email->config('default');
$Email->from(array('[email protected]' => 'ほげほげ'));
$Email->to('[email protected]');
$Email->subject('お願い');
$Email->send();
}
}
0623nobodyさん
2014/06/05(木) 14:05:40.48ID:???Windowsで開発するのやめれたらいいと思うよ。
よく知らんけど、Cakeのエラーメッセージは英語。
てことは、おそらくコマンドプロンプトか、代わりに使ってるターミナル系アプリの出してるエラー。
エラーメッセージから、cakeコマンドへのファイルパスや引数も含め、
実行しようとしたコマンドの文字数が多すぎた。
てことが予想出来る。
0624nobodyさん
2014/06/05(木) 16:25:42.75ID:+YUe8hGXありがとうございます。
おっしゃるとおりかもしれません。
0625nobodyさん
2014/06/05(木) 19:12:08.87ID:???「コマンド ラインが長すぎます」
なんてエラーは出たこと無いな。
原文はなんて書いてんの?
0626nobodyさん
2014/06/05(木) 19:12:52.47ID:???0627nobodyさん
2014/06/05(木) 20:29:33.26ID:???0628nobodyさん
2014/06/05(木) 22:14:09.51ID:???普段はwindowsで開発、最終的なテストだけ本番機で行っているわ
PHPはわりと環境依存大きいけどcake使ってると依存度がかなり軽減されると思う
0629nobodyさん
2014/06/05(木) 22:23:36.19ID:???その方がお手軽だし
0630nobodyさん
2014/06/05(木) 22:26:03.50ID:???phpとかmysqlはwindows上で動かすのは無駄だからやってない
vagrantで簡単に作れるしさ
0631nobodyさん
2014/06/05(木) 22:29:27.33ID:d26v3tZW開発用のサクラ鯖に直結して開発してるぞ。
リモートプロジェクト
0632622
2014/06/05(木) 23:27:51.32ID:+YUe8hGXおさわがせしました。
PHPのメール設定がおかしかったみたいです。
0633nobodyさん
2014/06/06(金) 00:56:33.55ID:???0634nobodyさん
2014/06/06(金) 01:07:28.95ID:???0635nobodyさん
2014/06/06(金) 01:37:12.74ID:???しなくていい苦労って多いもの。
0636nobodyさん
2014/06/06(金) 02:32:32.38ID:???画面系で動作が変わるとしたらソース自体に問題がありそう
0637nobodyさん
2014/06/06(金) 03:44:03.22ID:???0638nobodyさん
2014/06/06(金) 06:32:05.95ID:???0639nobodyさん
2014/06/06(金) 11:48:12.37ID:???Windows と Mac 混在して bake してて問題ないんだが、
気づいてないだけかな
0640nobodyさん
2014/06/06(金) 12:18:51.00ID:???0641nobodyさん
2014/06/06(金) 13:35:54.13ID:???今試しに同じデータベースを元にして Mac と Windows で bake したのを
git で比較したけど差分なかったぞ?
0643nobodyさん
2014/06/06(金) 15:39:44.51ID:???2.5.1
CAKE_CORE_INCLUDE_PATH はコアの Cake ディレクトリを格納している
ディレクトリのパス。
0645nobodyさん
2014/06/06(金) 17:22:45.98ID:???そりゃ絶対パスだから違うわけだけど、
bake して生成された結果には影響ないよ?
ちなみに今の論点はあくまでも
>bakeした時面倒なんだよ
に対する疑問ね。
0646nobodyさん
2014/06/07(土) 13:17:32.00ID:???これは、phpファイルのみしか管理できないのですか?
例えばjqueryとか、画像も管理できるのでしょうか?
教えてください。
よろしくお願いします。
0647nobodyさん
2014/06/07(土) 14:18:28.71ID:???composerは基本、外部のライブラリを管理したり
プロジェクトの作成に利用したりするもの
jqueryは
component/jquery
を使えば管理できる
画像は外部のものなのかい?
0648nobodyさん
2014/06/07(土) 14:22:04.06ID:???ありがとうございます。
画像やjqueryはプラグインに入れようと思って、それをbitbucketで管理します。
全てのサイトでそのプラグインをcomposerで管理できるのかなとおもいまして。
0649nobodyさん
2014/06/07(土) 14:26:11.05ID:???bitbucketで
各々サイトと、jqueryのプラグインを別に管理したとして
>全てのサイトでそのプラグインをcomposerで管理できる
ってのは可能だよ
0651nobodyさん
2014/06/10(火) 09:20:20.15ID:???これと同じ問題でハマってます
どうすればいい?
users/123 等の時は users/index/123にしたくて
users/read
users/edit
などアクション名を指定した時は、そのアクション実行したいのですが
0653nobodyさん
2014/06/10(火) 11:13:53.54ID:???どこかにサンプルはないでしょうか?
0654nobodyさん
2014/06/10(火) 13:57:21.11ID:???http://api.cakephp.org/2.5/class-Router.html#_connect
http://book.cakephp.org/2.0/en/development/routing.html#route-elements
■ このスレッドは過去ログ倉庫に格納されています