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

【PHP】フレームワーク CakePHP 12ホール目【笑】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2011/07/01(金) 16:33:46.28ID:???
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

前スレ
【PHP】フレームワーク CakePHP 11ホール目【v1.3】
http://hibari.2ch.net/test/read.cgi/php/1297860755/
0002nobodyさん2011/07/01(金) 17:48:14.76ID:???
>PEARとかのクラス名とCakeのコアクラスが衝突しちゃう場合
>どう対応してますか?

PHPてnamespaceないんだっけか?
なんちゅーダサい言語w
0003nobodyさん2011/07/01(金) 18:07:43.44ID:Hz/Fo+ud
>>2
あるよ
0004nobodyさん2011/07/01(金) 19:10:44.19ID:???
前スレ990からのやつ
Cake的にはConfigure::load()/read()じゃなくて?
0005nobodyさん2011/07/01(金) 19:38:21.72ID:???
携帯サイトとPCサイトをCakeで作るとき、
- routes.php
Router::connect('/m/', array('controller' => 'home', 'action' => 'index', 'prefix' => 'mobile'));
Router::connect('/m', array('controller' => 'home', 'action' => 'index', 'prefix' => 'mobile'));
Router::connect('/m/:controller/:action/*', array('prefix' => 'mobile'));

- app_controller.php
function afterFilter() {
  if (!preg_match("/^m(\/)?/", $this->params['url']['url'])) {
   $this->redirect('/m/' . $this->params['url']['url']);
  }
  if ($this->isMobile) {
    $this->output = mb_convert_kana($this->output, 'k');
    $this->output = mb_convert_encoding($this->output, 'SJIS', 'UTF-8');
  }
}
こんな感じで振り分けたりしてるんだけど、

function show() {
$this->set('abc', $this->Model->find('all'));
}

function mobile_show() {
$this->set('abc', $this->Model->find('all'));
}
上記のようにコントローラにPC用と携帯用で全く同じ処理なのに
別々のアクションを作らないといけない。
これはしょうがないのかな?
もっとナイスな実装方法があれば助言お願いします
0006nobodyさん2011/07/01(金) 23:15:29.99ID:???
>>5
beforeFilter()かそれ以前で携帯か判定して
beforeRender()でviewを切り替えるComponentをつくる。
Controllerのactionは基本共通で場合によって処理も分けられる。
0007nobodyさん2011/07/02(土) 00:23:23.70ID:???
コントラが同一にできないのであれば、設計がどこかおかしいと思うぞ。
0008nobodyさん2011/07/02(土) 00:36:56.30ID:???
>>6-7
サンクス
いや、多分コントローラのアクション同一のものを使えると思う

>beforeRender()でviewを切り替える
なるほど。
処理が全て終わったあとで、
$this->render('mobile_' . 現在のaction名);
みたいな感じかな。

>beforeFilter()かそれ以前で携帯か判定して
これがちょっとわからない
beforeRender()のview切り替え時に携帯かどうか判断したらだめなの?
0009nobodyさん2011/07/02(土) 00:52:56.31ID:???
>>8
> >beforeFilter()かそれ以前で携帯か判定して
> これがちょっとわからない
> beforeRender()のview切り替え時に携帯かどうか判断したらだめなの?
actionの中身が完全に同一ならいいんだけど
たまに場合分けしたい部分もあるかと思ってね。
利用するModelも変わるかもしれないし。
0010nobodyさん2011/07/02(土) 06:43:28.79ID:???
>$this->render('mobile_' . 現在のaction名);
切り替えにはテーマを使うほうがいいんじゃないかな?

http://book.cakephp.org/ja/view/1093/%E3%83%86%E3%83%BC%E3%83%9E
0011nobodyさん2011/07/03(日) 03:59:17.90ID:???
>>9
なるほど

>>10
おお、テーマ便利だわ
テーマ使ったら >>5 の方法みたいに
/m/ でアクセスする必要無くなったな

みなさんありがとう!
0012nobodyさん2011/07/03(日) 08:49:39.89ID:???
>>11
結局どうやったのかまとめて書いてくれるとありがたい。
0013nobodyさん2011/07/03(日) 11:43:28.90ID:???
>>12
- app_controller.php
  function beforeFilter() {
    $agent = Net_UserAgent_Mobile::factory();
    // 携帯
    if (!$agent->isNonMobile()) {
      if ($agent->isDoCoMo()) {
        ini_set('session.use_cookies', FALSE);
        ini_set('session.use_only_cookies', FALSE);
        ini_set('session.use_trans_sid', TRUE);
        session_start();
      }
      $this->isMobile = true;
      $this->layout = 'mobile';
      $this->theme = 'mobile';
    // PC
    } else {
       :
       :
    }
  }

routes.php の携帯関係(/m/)のマッピングと、
afterFilter() の redirect の記述は全て消した
携帯でアクセスすると、テーマがmobileになるので、
mobileテーマを用意すると、それをrenderしてくれる

結局テーマでほぼ解決できた感じ
0014nobodyさん2011/07/03(日) 19:14:04.25ID:???
Cakeって結構便利なんだね
0015nobodyさん2011/07/03(日) 19:44:35.63ID:???
$this->data の中にあるデータ全てに置換処理をしたい場合どうしたらいいですか
0016nobodyさん2011/07/03(日) 19:51:41.97ID:???
foreachで出力してstr_replaceすればいいじゃん
0017nobodyさん2011/07/03(日) 22:25:08.20ID:???
>>16
再帰的?にやらないとだめですよね?
0018nobodyさん2011/07/03(日) 23:13:54.05ID:???
再帰的っつーと、array_map_recursiveだかなんだかかな
0019nobodyさん2011/07/03(日) 23:53:57.75ID:???
置換するデータが決まってる場合は、再帰しなくても良いよ
0020nobodyさん2011/07/04(月) 14:06:30.67ID:???
>>19
どういうことですか?
mb関数を使って変換したいんですけど、できますか?
0021nobodyさん2011/07/04(月) 17:00:10.02ID:???
php5ならこれでどう?
array_walk_recursive
0022nobodyさん2011/07/05(火) 16:49:34.52ID:???
バリデーションで、
同じフォームのある特定のselectのある選択肢が選択された時のみ、
ある input をrequiredにする、
ってできる?
↓これでできそうな気がするけど、同じフォームの値は取ってこれないのかな
http://book.cakephp.org/ja/view/1179/%E7%8B%AC%E8%87%AA%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%AB%E3%83%BC%E3%83%AB
0023nobodyさん2011/07/05(火) 17:22:13.64ID:???
>>22
$this->data覗いてみればわかるんじゃないの?
0024nobodyさん2011/07/05(火) 22:01:52.46ID:???
>>23
いろいろ試しているけど、バリデーションの仕組みがややこしすぎる・・・
allowEmpty と required ってどう違うんだろw
requiredをtrueにしても、通ったりするし
0025nobodyさん2011/07/05(火) 23:00:47.78ID:???
そういう時は、やりたい処理をシコシコ書いた方が読みやすくて保守しやすいよ。
0026nobodyさん2011/07/06(水) 00:54:19.01ID:???
CakePHPってAppControllerやAppModelにかなり手を入れないと
使い物にならないよね。
あと、標準のコンポーネントやヘルパーはホント使い物にならない。
特にFormヘルパーは心の底から使えない。
こんな屑フレームワークが何故こんなに持てはやされているのか謎。
0027nobodyさん2011/07/06(水) 10:07:17.00ID:???
>>24
required は「その項目の存在を必須とするか?」の設定で、 allowEmpty は「空の値を許容するか?」

分かりやすく言うと、
パスワードとかで、
required = false
allowEmpty = false
にすれば、
フィールドがある場合は、必須入力。
フィールドがない場合は、保存可能。

0028nobodyさん2011/07/06(水) 10:19:27.84ID:???
>>26
「みんなが使ってるから」

という日本人的な理由があるからです。
嫌なら自分でヘルパー作りましょう。
0029nobodyさん2011/07/06(水) 10:48:30.44ID:???
>>28
日本人的理由って言うか、
途中で誰もメンテしなくなったりプロジェクトが消えてしまったりするフレームワークをいろいろ見てると
やっぱ使ってる人数は多いほうが良いよ。
0030nobodyさん2011/07/06(水) 11:30:19.94ID:???
そもそもなんで使っている人が増えたかだよ。
最初から使用者が多かったわけではないのに
「みんなが使ってるから」は理由にならないと思う。

ちょっと、formヘルパーがなんで使えないか聞いてみたい。
0031nobodyさん2011/07/06(水) 11:57:44.55ID:???
それは「分かりやすいから」じゃないか?
俺はZendとかEthnaで挫折したけど、Cakeだと続けて来れた
0032nobodyさん2011/07/06(水) 16:07:34.79ID:???
>>27
なるほど。
わかりやすい説明ありがとうございました。
0033nobodyさん2011/07/06(水) 18:46:45.58ID:???
コントローラーやモデルは面倒だからそのまま使ってる
カスタマイズに本気になる時間があったら俺俺作るわ

ヘルパーが使えないには同意。使ったことない。
0034nobodyさん2011/07/06(水) 20:28:57.66ID:???
htmlヘルパーはほぼ使わないな
ビューでaddScript書く時だけ使う。
0035nobodyさん2011/07/06(水) 22:34:45.23ID:???
htmlとかばりばり使うでしょ。urlとか決め打ちしてんの?
0036nobodyさん2011/07/06(水) 23:33:25.75ID:???
???
普通に<a>タグ書けばいいじゃん
0037nobodyさん2011/07/06(水) 23:55:49.43ID:???
HTMLヘルパーで出力するHTMLをカスタマイズしようとすると
記述が煩雑になってありがたみが薄れるからなー。
簡単なelement書くか、変数展開だけで済ますかな。
0038nobodyさん2011/07/06(水) 23:55:53.23ID:???
routerでアドレス変更したときに、いちいち全ページ変更するんかい?
0039nobodyさん2011/07/07(木) 02:25:19.28ID:???
???
<?php echo Router::url('/') ?>
とかしらないのか?
0040nobodyさん2011/07/07(木) 12:07:41.48ID:???
formヘルパーなんかDBの設定読み込んで、
maxlength自動で設定してくれたりして、便利だと思うけどなぁ。
(保守が楽)

アソシエーションの設定をちゃんとしとけば
saveallで一発で保存できるし。

0041nobodyさん2011/07/07(木) 14:34:22.19ID:???
まぁ、唯一気になるのが「name="data['User']['name']"」
となってしまう事だけど、これは仕方ないよな
0042nobodyさん2011/07/07(木) 15:59:11.03ID:zfJE1aJ1
嫌なら変えればいいんじゃない?
0043nobodyさん2011/07/07(木) 17:34:23.24ID:???
変える方法あるの?
0044nobodyさん2011/07/07(木) 19:53:43.58ID:???
>>39
???
普通に<a>タグじゃないじゃん?
0045nobodyさん2011/07/07(木) 20:47:26.25ID:???
???
<a href="<?php echo Router::ulr('/')?>">URL</a>

htmlヘルパー使わないんだから、こうなるよな
0046nobodyさん2011/07/07(木) 21:46:25.25ID:???
???
ulrってなんぞ?
0047nobodyさん2011/07/07(木) 22:46:37.36ID:???
そこは看過してやれよ。
0048nobodyさん2011/07/08(金) 01:10:30.14ID:???
打ち間違いぐらい許してくれよ・・・
0049nobodyさん2011/07/08(金) 11:16:11.84ID:???
Jsヘルパーって使ってますか?
複雑になるだけな気がするんですが、メリットがあったら教えてもらいたいです。
0050nobodyさん2011/07/13(水) 05:52:56.24ID:???
$this->Model->getLastInsertID()
を使って他テーブルの外部IDを設定(ひもづけ)するのは危険かな?

例えばショッピングサイトで注文テーブルの注文IDを、注文内容テーブルの外部IDに設定するような場合。

処理の途中で別のINSERTが入った場合はどうなるんだろう・・・?
0051nobodyさん2011/07/13(水) 09:01:50.59ID:???
saveAllでできる
トランザクション使うなら、InnoDBにしないといけないけど。
0052nobodyさん2011/07/14(木) 00:15:26.04ID:???
使い始めたばかりなのだけど、
ssh接続するサーバ上で開発する場合、開発環境はどんな選択肢があるんだろう?
0053nobodyさん2011/07/14(木) 00:56:03.07ID:???
うん?鯖上のエディタで直接コード書くんじゃないんだろ?
0054nobodyさん2011/07/14(木) 01:03:22.06ID:???
十分な速度があるなら、Eclipseでリモート・システム・エクスプローラーとか便利ですよ。
0055nobodyさん2011/07/14(木) 09:51:20.58ID:???
>>54
試してみます、ありがとうございました
0056nobodyさん2011/07/14(木) 22:23:54.50ID:???
Eclipse xDebug
このあたりの検索キーワードでリモートでデバッグ出来ますので、分かってしまえばかなり便利です。
0057nobodyさん2011/07/18(月) 05:28:44.18ID:???
>>51
奴らは街角で拉致られてタコ部屋に押し込められて強制労働させられてるのか?
自ら希望して派遣会社に登録したんじゃないのか?
まずそこをハッキリして貰いたいんだが。
0058nobodyさん2011/07/18(月) 06:38:04.14ID:???
なにそれこわい
0059nobodyさん2011/07/18(月) 11:02:32.30ID:???
saveAllでさぞ酷い目にあったのかな。。。
0060nobodyさん2011/07/18(月) 12:50:23.72ID:???
トランザクションの裏には凄い苦労が隠されているんだな・・・
0061nobodyさん2011/07/18(月) 17:26:31.69ID:???
軽々しくROLLBACKとかできない雰囲気だな。何人か犠牲になってるんだろ?
0062nobodyさん2011/07/19(火) 14:07:14.50ID:???
お前らってプログラミング初めて何年?
俺は勉強おろそかになってた時期も含むと、8,9年ぐらいになるんだけど
ロールバックとかトランザクションとかDBの知識全くないわ
0063nobodyさん2011/07/19(火) 19:02:12.16ID:???
それってWeb系のプログラミング始めて何年かで違うよな。
ここ10年の間なら、Webプログラミング+DBってパターンが王道だし、
PHPとMySQLは、もっとも利用されている組み合わせだ。

なのに、PHPのみで8〜9年というのはおかしいな。
今までCSVのみでデータの読み書きをしていたのか?
0064nobodyさん2011/07/19(火) 19:55:53.43ID:???
>>63
いや、ずっとDBだけど大規模なサイトの開発しなかったら正直
ロールバックとかトランザクションなんて使わなくてもいいからな
PHPから接続して、CRUDできたら大抵のシステムは組めるでしょ?
0065nobodyさん2011/07/19(火) 21:17:02.33ID:???
俺的にもMySQLでトランザクションができるようになったのは最近。って感覚だな。
デフォルトだと今でもMyISAMだろうし。
0066nobodyさん2011/07/19(火) 21:25:45.94ID:???
この前MAMPからセットアップした時はInnoDBだったけどなー
0067nobodyさん2011/07/19(火) 21:43:17.25ID:???
PHP歴20年だけど質問ある?
0068nobodyさん2011/07/19(火) 21:53:33.13ID:???
>>67
こんな糞言語をよくそんなに使っていられますね(^^)
0069nobodyさん2011/07/20(水) 07:14:48.59ID:???
まぁ、MyISAMで良い場面とInnoDBで良い場面の想定が難しいからな。

月1000万PVあるポイントサイト運営してるけど、MyISAMだし、
それでデータが破壊されることは無い。
だから、この程度の規模だとトランザクションは必要ないのかもな。
0070nobodyさん2011/07/20(水) 11:19:20.67ID:???
昨日からCakePHPを勉強しようと思ってイロイロやってるんだけど
サンプルの中にある
cake\tests\lib\templates の
footer.php と header.php と menu.php から
ものすごい数のエラーが出てるんだけど

何か設定間違えたかな?

http://mergedoc.sourceforge.jp/
ここのEclipse3.6を一回更新して使ってるんだけど
0071nobodyさん2011/07/20(水) 12:27:08.82ID:???
>>69
トランザクションの有無は操作内容によるから規模関係ないかと。
あとInnoDBプラグイン以降はMyISAMの出番はないんじゃない?
小さめのDBならMyISAMのが良いこともあるけど、その規模なら誤差みたいなもんだし。
0072nobodyさん2011/07/20(水) 15:10:09.78ID:???
フルテキストインデックス使うならMyISAMだけどな。
0073nobodyさん2011/07/20(水) 16:08:47.61ID:???
>>71
ポイントサイトやってるから、毎秒100人ぐらいの
同時アクセスが発生するんだが、
DBの読み書きでトランザクションを使用してないので
どうなるかと運営当初は不安だったが、全然大したことなかったw

だから、どの程度の規模・アクセス・処理想定をすれば
InnoDBにしてトランザクションした方が良いかわからないんだよな。
0074nobodyさん2011/07/20(水) 16:58:32.13ID:???
同時アクセスとかあまり関係ない。

銀行口座AからBへ振り込み処理を行うとする。
1.UPDATEでAの残高を減らす
2.UPDATEでBの残高を増やす
もし1の処理の後、エラーが起きて2が実行されなかったとする。
するとAの残高だけ減っているというデータの不整合が起きてしまう。
こうならないために、1と2をトランザクションで囲って、
エラーが起きた場合はロールバックして1の処理をキャンセルする。
0075nobodyさん2011/07/20(水) 17:12:21.69ID:???
同じ編集画面多重で開かれて
内容が戻るのを防ぐのもトランザクションでやるの?
0076nobodyさん2011/07/20(水) 17:16:52.63ID:???
あれ、>>74ってトランザクションか?
上手く言えないが、そう言う場面で使うもんじゃない気が・・・
0077nobodyさん2011/07/20(水) 17:58:07.77ID:???
>>74はトランザクション処理だろ。

>>75はトランザクションじゃないね。
DBでやるなら行ロックとか。
0078nobodyさん2011/07/20(水) 18:11:06.81ID:???
>>74
これはCakePHPでできるの?
0079nobodyさん2011/07/20(水) 19:11:43.20ID:???
>>78
余裕でできる。
CakePHPでというよりMySQLで、だけど。
0080nobodyさん2011/07/20(水) 20:08:13.30ID:???
じゃ、コード書いてみて
0081nobodyさん2011/07/20(水) 20:08:31.53ID:???
>>77
行ロックってデッドロックの解決わからなくて実装してないなぁ
手動で解除できるようにしとくくらいなのか?
0082nobodyさん2011/07/20(水) 20:35:12.17ID:???
>>81
pconnect使わなければプログラム終了したらDB接続も勝手に切れる。
嫌ならロックやトランザクション使うときだけ明示的にconnectする。

>>80
AppModelかBehaviourに
$db =& ConnectionManager::getDataSource($this->useDbConfig);
return $db->begin($this);
こんなメソッド書くかんじ?
同じDB接続なら二回目以降は無視するとかcommit/rollbackをまとめて行うとかの工夫はほしいけど。
0083nobodyさん2011/07/20(水) 20:55:57.12ID:???
>>81
ロックする順番を銀行口座番号の昇順か降順にすれば
デットロックにはならないはず。
0084nobodyさん2011/07/20(水) 22:48:34.13ID:???
>>82
そのコード、もう標準で組み込んでくれよと思う
0085nobodyさん2011/07/21(木) 00:07:23.26ID:???
>>84
通常はsaveAllで事足りるはず。
MySQLならinnoDB使ってれば自動でトランザクションしてくれる。
0086nobodyさん2011/07/21(木) 07:30:42.02ID:???
2.0の正式版ていつごろなのかな?
alpha版ためしたらエラーでまくりだった;

Lithiumとどっちが先か・・・
0087nobodyさん2011/07/21(木) 14:11:40.28ID:???
>>85
通常の範囲せますぎやない?
クエリの間に判定や分岐をいれたいことって多々あるとおもう。
MySQLのストアドは弱いしね。
0088nobodyさん2011/07/21(木) 16:19:08.49ID:???
>>87
どんな時に使うの?
cakeではやった事無いよ。
0089nobodyさん2011/07/21(木) 16:40:06.60ID:???
更新って1つのテーブルだけじゃないからな。
例えば、会員情報を更新しようとして、一緒に
プロフィールテーブルやポイントテーブルを更新する事は想定できるだろ。
0090nobodyさん2011/07/21(木) 16:50:57.97ID:???
>>89は誰に対してのレス?
0091nobodyさん2011/07/21(木) 18:32:52.63ID:???
流れ見てたら解るだろ
0092nobodyさん2011/07/21(木) 19:02:21.63ID:???
>>91
流れ見ててるからわからん。

>>87
saveallじゃ足らんって言ってて

>>88
具体的にどんな時に必要?


>>89
プロフィールテーブルやポイントテーブルを更新する事は想定できるだろ。
↑これはsaveallで足りるから、まさか>>88へのレスでは無いとは思うけど、
どうなんだろうって思ったから。
0093922011/07/21(木) 19:15:12.79ID:???
ポイントのプレゼント機能があったとして、
会員AからBにポイントを振る場合は、
トランザクション処理になるだろうけど、

cakePHPの場合、model->saveに渡す配列に
ちゃんとデータを入れれば、
saveAll一発で済むし。

0094nobodyさん2011/07/21(木) 19:18:17.61ID:n5p3Ei1e
・ポイントが100以下のユーザーを抽出する
・ポイントをプラスする
・ポイントが500以上になったユーザーのプロフィールを更新する

こういうのはSaveAllじゃダメだろ。
どんだけ単純なアプリ作ってるんだよ。
0095nobodyさん2011/07/21(木) 20:01:13.12ID:???
92よ・・・お前もう一度一からDB設計の勉強してこいよ
単純思考過ぎる。saveAll一発でいけたら苦労しない
0096nobodyさん2011/07/22(金) 17:29:49.62ID:???
tinyint(2)
int(2)
これって同じことなの?
0097nobodyさん2011/07/22(金) 18:25:40.59ID:8Fm0K952
>>96
ちがうよ
0098nobodyさん2011/07/22(金) 18:31:43.01ID:???
>>96
MySQLでのテーブル定義時の話だよね?

TINYINTは-128から127 (符号無しの場合0から255)が保持可能
INTは-2147483648から2147483647 (符号無しの場合0から4294967295)が保持可能。

型の後ろのカッコは表示幅。(2)は2桁に満たない場合に0フィルしてくれるけど3桁だと
幅指定無視して3桁表示される。切り捨てたりするわけではない。INTだと4桁、5桁も
ありえるので、そういう値を扱うとき同じとはいえない
0099nobodyさん2011/07/22(金) 20:18:54.31ID:???
パスワードの入力エリア2つにして、一方を確認用にするって
仕様が良くあると思いますが、この場合のバリデーションってどうしてます?
0100nobodyさん2011/07/22(金) 20:32:49.17ID:???
ふつうに二つエリア有るだけだろ?
0101nobodyさん2011/07/22(金) 20:54:14.56ID:???
controller側で、パスワードA==パスワードBの場合true、そうでなければfalse
で作ればいいだけでは?
■ このスレッドは過去ログ倉庫に格納されています