トップページ⇒php
981コメント296KB

【PHP】フレームワーク CakePHP 17ホール目【v2.4】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2014/03/01(土) 17:03:24.57ID:8AJ9GD6E
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/
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/
0773nobodyさん2014/06/24(火) 21:11:44.93ID:???
ネットワークの問題かApache benchの使い方間違えてるに1ペリカ
0774nobodyさん2014/06/24(火) 23:54:56.03ID:NjjfXiKQ
検索ボタンを押した際に
GETパラメータでcakeのコントローラにアクセスを掛けたいのですがどうすれば良いでしょうか?

本来は、検索ボタンを押した際に�@でコントローラのメソッドにアクセスを
したいのですが、�Aになってしまいます。

�@・・・期待しているGETアクセス
http://test.com/hoge/buta/123/tarou

�A・・・想定外に生成されるURL
http://test.com/hoge/buta?id=123&;name=tarou

コントローラ
HogeControler
{
  public function Buta($id , $name)
  {
    //ここで「/」区切りでアクセスされた値を取得する。
  }
}

HTML
<form name="name_form" action="/hoge/buta" method="get">
<input type="text" id="id_test" name="id" value="">
<input type="text" id="id_test" name="name" value="">
</form>
0775nobodyさん2014/06/25(水) 00:05:21.21ID:???
javascript
0776nobodyさん2014/06/25(水) 00:44:49.49ID:???
>>774
GETパラメータなら�Aで正しいだろ
0777nobodyさん2014/06/25(水) 00:53:52.36ID:???
>>774
HTTPのお勉強からやり直しましょう
07787742014/06/25(水) 01:07:07.36ID:1IpoS71w
>>776 >>775

やはり通常のFormではCakePHP用のURLを生成する事は出来ないみたいですね。
仕方無いので検索ボタンをクリック時に動的にURLを組み替えてリダイレクトする事により実装する事にします。
0779nobodyさん2014/06/25(水) 01:11:23.04ID:???
例に突っ込むのもアレだが
ID指定した時点で検索というよりただの詳細表示のような
0780nobodyさん2014/06/25(水) 01:50:00.94ID:???
javascriptでやるのが無難だな。俺もそうしてるし。
0781nobodyさん2014/06/25(水) 12:47:26.75ID:???
検索項目が増える時のことを考えると、
2の方がいいと思うんだが
0782nobodyさん2014/06/25(水) 13:46:34.28ID:cgps1MKk
>2の方がいいと思うんだが
どういうこと?
0783nobodyさん2014/06/25(水) 14:13:35.35ID:???
そのあたりはAPIの設計に関わることだからなんとも言えない
0784nobodyさん2014/06/25(水) 14:21:54.78ID:???
検索項目が増えるのにGETでやりたいってのは、設計ミスじゃね?
それならPOSTにしろよ
0785nobodyさん2014/06/25(水) 15:45:34.59ID:???
>>782
ルーティングや引数の設定が面倒。
ていうか大体の検索エンジンとかgetパラメータでやってね?
0786nobodyさん2014/06/25(水) 20:30:38.80ID:???
冪等かつ安全な処理はGETが普通っすね
POSTだとキャッシュもされないし
0787nobodyさん2014/06/25(水) 21:43:08.93ID:???
記事中の
hoge.com/app/webroot/media/tarot.jpg
が読まれた際、
hoge.com/media/tarot. jpg
が読まれるようにしいのですが、良い方法ないでしょうか?
nginxでやってます。

ちなみにhoge.comは自分のドメインです。
0788nobodyさん2014/06/25(水) 21:50:26.46ID:???
>>787
意味わからん
0789nobodyさん2014/06/25(水) 22:32:59.91ID:???
>>788
すいません。自己解決しました。
0790nobodyさん2014/06/26(木) 02:12:49.47ID:???
せっかくだから張っておけよ
http://www.matomater.com/16864/
0791nobodyさん2014/06/26(木) 21:12:17.80ID:ceT3Qpnq
linux のシェルについての話しはどこですれば良いですか?
ここだとすれ違いですよね?
0792nobodyさん2014/06/26(木) 21:39:46.70ID:???
php で日付の正規表現を行いたいのですが
以下の形式の日付型文字列であればOK、違っていればNGと厳密なバリデーションチェックを掛けたいのですが
どうすれば良いでしょうか?

2014-06-10


- で split してチェックを掛けるしかないのでしょうか?
0793nobodyさん2014/06/26(木) 22:09:00.35ID:???
$check = '2014-06-10';
$isValid = date('Y-m-d', strtotime($check)) === $check;
0794nobodyさん2014/06/26(木) 22:17:51.48ID:h6oXqOHu
>>793
サンクス!

ここまで短く判定出来るなんて、、、
驚きです。
0795nobodyさん2014/06/26(木) 22:29:39.04ID:???
PHPって質問スレないのか?
0796nobodyさん2014/06/26(木) 22:32:22.88ID:???
date関数って第二引数にfalse突っ込んでも0と同じ扱いで動くのか
きめえな
0797nobodyさん2014/06/26(木) 22:57:46.67ID:???
>>796

大丈夫だよ。あなたの顔に比べれば断然綺麗なものですよ^^b
0798nobodyさん2014/06/26(木) 23:04:09.80ID:???
これがPHPerです
0799nobodyさん2014/06/26(木) 23:54:58.72ID:???
キモくても何でも動けばいいんだよ。形にこだわり過ぎるのはよくない
0800nobodyさん2014/06/27(金) 11:40:50.24ID:???
デザインやHTMLコーディングもやっている人に聞きたいんだけど、
先にHTMLコーディングをしてある程度のファイルを作って、
その後にViewファイルを作る?それともいきなりViewから作る?

俺はトップページとか主要なページのHTMLコーディングを先にして
それからView化するだけど、後から変更する事が多くて二度手間になるのを感じる。
だから、先にデザインとかレイアウトとか全て完璧に決めて、
それからView化した方が良いのかな?とも思うんだけど、
すぐに動きを見たいから、Controllerと同時に作りたくなる。

結果、直してばかりで面倒になって投げ出したくなるw
そんなアプリばかり作ってるんだけど、何か良いやり方はないかな?
0801nobodyさん2014/06/27(金) 12:27:28.48ID:???
手書きラフ
  ↓
Photoshop
  ↓
マークアップ
  ↓
CSS
0802nobodyさん2014/06/27(金) 12:28:38.18ID:???
>>800
後からの変更を少なくする調整力があれば問題なし。
0803nobodyさん2014/06/27(金) 13:16:39.40ID:???
>>801
俺も同じやり方なんだが、後からマークアップを変えたくなる。

>>802
Cakeの場合、レイアウトやエレメントに分けるだろ?
その後にマークアップの変更やデザインの追加・変更などが入ると、
何度もやり直したりして、投げ出したくなる
0804nobodyさん2014/06/27(金) 16:32:32.36ID:???
たしかにビューは混沌とするからな
俺はややこしくなりそうな場合だけは
ビューには echo 以外は一切記述しないのを目標に、
専用のヘルパーを作って加工のロジックは隠ぺいするようにしてる。
それなりに扱い易くはなるが、万能ではない。
0805nobodyさん2014/06/29(日) 22:38:39.46ID:qTkMeLPd
JavaScriptを用途ごとにファイルに分けると、本番環境にアップする最に圧縮する手間が凄くかかります。
そこで、1ファイルにゴリゴリ共通関数も纏めて書いてますが、皆さんはどうしてますか?
0806nobodyさん2014/06/29(日) 22:52:42.19ID:???
>>805
gruntでまとめて処理
coffeescriptで用途ごとにファイル作成ってやってるよ
0807nobodyさん2014/06/30(月) 08:44:32.98ID:???
僕はgulpちゃん!
0808nobodyさん2014/06/30(月) 14:03:48.42ID:???
そもそも圧縮アップしない。ファイルサイズが少々減る程度で、大して変わらん
0809nobodyさん2014/06/30(月) 16:21:21.70ID:???
phpstormで自動圧縮できるんじゃないだろうか。
0810nobodyさん2014/06/30(月) 17:47:06.48ID:cdSjRfUN
>>808
圧縮しないとソースコード筒抜けじゃん。

難読化しないといけないんとちゃいまっか?
0811nobodyさん2014/06/30(月) 20:09:23.46ID:???
>>810
Javascriptだろ?筒抜けで困ることなんて無いと思うが
0812nobodyさん2014/06/30(月) 20:22:22.30ID:cdSjRfUN
>>811
我ながらコードセンスが良い
綺麗なコードなのでぱくられたくないなーとw
0813nobodyさん2014/07/01(火) 19:58:59.95ID:???
Cakeでtwigを使いたいんだが
TwigView以外で使えるのない?
0814nobodyさん2014/07/02(水) 17:32:38.36ID:???
Cake2系でhasManyの絞り込みってどうすれば良いのでしょうか?

$this->Model->hasMany['Hoge']['conditions'] = array('Hoge.type' => 1);
$data = $this->Model->find('all');

とすれば、hasMany先のテーブル内で絞り込みは出来るのですが、
絞り込みの結果、「一致するデータがない」場合でも、
Modelのデータは取得できてしまいます。

なにか良い書き方、方法は無いでしょうか?
0815nobodyさん2014/07/02(水) 23:13:55.69ID:???
cakeのmodelのリレーションってみんな使ってるのかな。
俺的には使わないほうが後々面倒がないという考えなんだが。
0816nobodyさん2014/07/03(木) 00:15:43.70ID:???
>>814

Hoge モデルを、hasMany とは別に存在チェック用に hasOne でアソシエーション張る

$hasOne = array('HogeOne' => array('className' => 'Hoge'));

で、検索条件に HogeOne.id != null を加える。
0817nobodyさん2014/07/03(木) 00:16:37.86ID:???
>>815

何のためにCake使ってんのか意味不明すぎる
0818nobodyさん2014/07/03(木) 00:28:54.40ID:Gi3lwfX6
仮に2chの様な規模の掲示板をcakeで構築しようとしたら
(寧ろ構築は出来るかもしれないけど)
パフォーマンス劣化が半端無い気がするのですが如何でしょうか?

2chがDBを使わずにログファイルで管理しているのは
やはりFW何かを使うと速度低下が否めないからでしょうね。
08198142014/07/03(木) 00:36:46.85ID:???
>>816
出来ました!!!こんな方法があったんですね。
大変勉強になりました。ありがとうございました。
0820nobodyさん2014/07/03(木) 00:56:55.55ID:???
2chのread.cgiってmod_cgidso使っててC言語製じゃなかった?
どの程度の性能なのかしらんけどFW以前にPHP使ってる時点ですでにサーバの数増やさざるを得なさそうな気が
ORMやFW使うとさらに遅くなるってのは間違いない
0821nobodyさん2014/07/03(木) 01:07:33.29ID:???
>>818
cakeが他のFWより極端に遅いってのがあるから
FW以前の話だな
0822nobodyさん2014/07/03(木) 01:11:12.39ID:???
http://www.techempower.com/benchmarks/#section=data-r9&;hw=peak&test=query

FacebookみたいにHHVM使うなら話は別かもな
Cakeがまともに動くのかしらんが
0823nobodyさん2014/07/03(木) 01:28:28.14ID:???
>>822
hhvmが早いといっても、php-raw(素のphp)の2倍しか速くない

cakeは遅すぎて計測不能
cakeよりちょっと速いといわれる
railsやsymfonyでphp-rawで書いたのの1/10の速さでしかない
cakeじゃ無理だな

fuelでphp-rawの半分、phalconでphp-rawと同じぐらいだからここら辺で書かないと
他はyafやphpixieな
0824nobodyさん2014/07/03(木) 01:37:08.52ID:???
Cakeで頑張るならPHPの中間コードキャッシュ入れて
DBスレーブサーバ(ないしAmazon RDS)とロードバランサ使って
ユーザが増えた時はサーバ台数多めで対応
徐々にコードやキャッシュを調整して台数や一台あたりに要求される性能を減らしていくって感じか
速度もある程度はスケールアウトでカバーできるいい時代になった

まず新サービスに大勢の人が来る保証もないし
動作速度より開発速度や書きやすさを優先するからこそのFWっしょ
そんなに速度が気になるなら最初からPhalconやJavaやJVM系言語やC#でも使うよろし
0825nobodyさん2014/07/03(木) 01:41:59.54ID:???
>>824
バランスじゃないのかな?
railsは突出して開発速度?が速いけど
cakeだとphalconと比べてもあまり大差ないみたいだしな

流石に10倍速度が違う≒アクセス10倍の差があるだからな

あくまで、速度が重要視される場合な。
cakeで捌ける人数しかこない前提なら問題ないし
元の話の2chなら話にならないよな
0826nobodyさん2014/07/03(木) 01:56:21.45ID:???
http://www.techempower.com/benchmarks/#section=data-r5&;hw=i7&test=query
http://www.techempower.com/benchmarks/#section=data-r7&;hw=i7&test=query
CakePHPが遅すぎて計測不能なんじゃなくてフレームワークが増えすぎて中の人が徐々に手が回らなくなっているのでは?
過去のを見るとちゃんと結果が載ってる回もある


ところでDartの結果良いな
いつの間にこんなに
0827nobodyさん2014/07/03(木) 02:01:52.84ID:???
>>826
githubでコード集めてるから
人気がなくなった(外部のコードを書く人がいなくなった)ってほうになるな
0828nobodyさん2014/07/03(木) 02:04:48.87ID:???
>>826
r7でrailsぐらいか
0829nobodyさん2014/07/03(木) 02:05:10.64ID:???
開発者がCakePHPから他に移ってるのもあるだろうし
Cakeでベンチ対決に参加しても悲しくなるだけだし
0830nobodyさん2014/07/03(木) 02:09:04.71ID:JnE+cuIZ
>>820 >>821 >>822 >823

そもそも2ch位のトラフィックを捌けるFWとかなさそうですね。
0831nobodyさん2014/07/03(木) 02:10:17.86ID:JnE+cuIZ
>>824
流石に2chクラスだとCakeじゃ無理でしょ。
0832nobodyさん2014/07/03(木) 02:11:15.57ID:JnE+cuIZ
cakeで作られている大規模サイトで有名なのはどこですか?
0833nobodyさん2014/07/03(木) 02:14:41.70ID:???
2chクラスの人が集まるコンテンツを作る方が大変なんですけど
0834nobodyさん2014/07/03(木) 02:33:52.59ID:???
>>830
'捌ける'の前提がよく分からんが
RDBとORMありのFW使った上で2chと同じサーバスペック同じ台数で捌けるかどうかってことか?
Cakeには無理だろうが全FWが駄目と判断するのは早計でしょ
2chのWebサーバって未だにEvent MPMがまともに使えないVer.のApacheだし
書き込みのほうのbbs.cgiは所詮Perlだしガチガチに高速化されてるとも思えないな

http://www.techempower.com/benchmarks/#section=data-r9&;hw=i7&test=json


>>833
まったくだ
0835nobodyさん2014/07/03(木) 02:34:55.37ID:???
>>832
nanapiとランサーズ
0836nobodyさん2014/07/03(木) 02:56:35.42ID:JxPD7Z4w
>>834 >>835

ランサーズの重たさを見てやはりcakeの底が見えました。

ところでなんで ランサーズ がcake使ってるってわかったの?
0837nobodyさん2014/07/03(木) 03:02:55.42ID:???
公式ブログで公表してるから。
0838nobodyさん2014/07/03(木) 14:01:04.31ID:???
>>826
やっぱJVM系優秀だなぁ。
0839nobodyさん2014/07/04(金) 07:21:47.42ID:???
これ実は深刻だな。

https://github.com/cakephp/cakephp/issues/3857

運が悪いと、ある日突然 DB が壊滅するかもしれん。
更新時に id も無駄にセットしていれば被害は(ほぼ)出ないわけだが、
常にトランザクションを張っておくのが正解かな?
0840nobodyさん2014/07/04(金) 23:56:36.75ID:SDFDitCY
PHPで先頭と末尾に全角・半角スペースが含まれているかを判定するにはどうすれば良いでしょうか?

" aaa bbb "
→ 含まれている

"aaa bbb"
→ 含まれていない

※ワードの真ん中にスペースがあってもOKですが
文字列の前後に全角・半角スペースが含まれている場合にはバリデーションでエラーを通知したいです。
0841nobodyさん2014/07/05(土) 00:14:24.58ID:???
/^[  ]|[  ]$/
0842nobodyさん2014/07/05(土) 00:26:41.66ID:???
u が抜けてるぞ

/^[  ]|[  ]$/u
0843nobodyさん2014/07/05(土) 00:26:45.58ID:bSC+q1kt
>>841
サンキュー
0844nobodyさん2014/07/05(土) 00:45:30.65ID:aE3ig5ya
>>841 >>842
さんくす

やりた関数が作れました。
0845nobodyさん2014/07/05(土) 00:49:59.15ID:???
>>839
トランザクションしか手の打ちようがないと思うけど、
これってどんな ORM でも同じ問題おこるんじゃないの?
0846nobodyさん2014/07/05(土) 01:06:28.71ID:???
うげえ、まだこんな問題あるのかよ。
以前WHERE 1=1で運用中のテーブル全消しされた悪夢が蘇る。
0847nobodyさん2014/07/05(土) 01:35:04.96ID:3rDWh52g
バリデーションはAjax使って全部サーバサイドだけで行っています。

JavaScriptでやるよりセキュリティー的にも開発工数の短縮化対策にも良いよね?
0848nobodyさん2014/07/05(土) 01:38:16.33ID:???
レスポンスが若干もっさりする、というデメリットに目をつむれるならそれでもいいんじゃね?
0849nobodyさん2014/07/05(土) 03:11:16.29ID:???
>>844
trim使った方がいいよ。
スペースあったら自動削除して登録みたいな。
0850nobodyさん2014/07/05(土) 03:35:07.33ID:???
>>847
エラーがなければ送信ボタン押すってやつ?
入力項目が多いと重くなりそうだし、汎用性も低いんじゃないか?
0851nobodyさん2014/07/05(土) 07:31:42.75ID:???
>>845
指定したレコードだけでなく全てが破壊されるFWは他に見たことないな…
0852nobodyさん2014/07/05(土) 11:32:54.03ID:???
>>847
requiredとかありふれた形式チェックくらいは、クライアントでやってもいいんじゃね。
開発工数ったって、そんなのほとんどないに等しいだろ。
0853nobodyさん2014/07/05(土) 20:25:37.65ID:???
双方に同じチェック実装するのがなんかだかなあ
0854nobodyさん2014/07/05(土) 21:59:45.13ID:???
>>853
俺も思う。
0855nobodyさん2014/07/05(土) 22:18:10.80ID:???
AjaxでCakeのバリデーション呼び出せばいいやん
0856nobodyさん2014/07/05(土) 23:28:29.38ID:???
twitterのようにフォローボタンをAjaxで処理するにはどうしたらいいの?
画面遷移なしで"フォロー"と"フォロー解除"を行いたいです。
AjaxとjQuery初心者でググってもイマイチよく分からない...
0857nobodyさん2014/07/06(日) 00:29:47.41ID:???
856ですが、内容がアレだったのでこう少し詳しく。
Jsヘルパーのrequestメソッドを使用しようと思ってます。

�@『フォロー』ボタンを押す(ボタンはdiv #follow)
�AAjaxでpost送信
�B「フォローした相手」のデータをsaveする
�C画面遷移なしで『フォロー解除』ボタン(ボタンはdiv #unfollow)に切り替え

�Cのボタンの切り替え方法が分かりません。
よろしくお願います。
0858nobodyさん2014/07/06(日) 05:13:50.01ID:ayo5h1or
>>852 >>853
JavaScript でチェックなんかしなくてもサーバサイド一本にすると
凄く開発効率があがるよ。マジオススメ。

両方チェックとか馬鹿の極みだろ。
0859nobodyさん2014/07/06(日) 05:31:33.41ID:???
>>858
それ、開発効率が上がるって言わねえよ
単に要件を下げてるだけだ
0860nobodyさん2014/07/06(日) 06:18:30.25ID:ayo5h1or
>>859
じゃー、お前はクライアントとサーバサイドで同じ処理をガリガリかいてろ
0861nobodyさん2014/07/06(日) 10:04:46.22ID:???
そこでnode.jsっすよ(棒
0862nobodyさん2014/07/06(日) 11:47:11.80ID:???
サーバサイド一本って、それ普通じゃないの?
普通というか正当なCakeのバリデーションというか。
そこから凝るとAjaxを使ったクライアントサイドになるわけで。
0863nobodyさん2014/07/06(日) 11:53:03.79ID:???
そもそもサーバサイドのバリデーションを省略することがありえないからな
0864nobodyさん2014/07/06(日) 12:19:46.52ID:???
>>857
ajaxの成功時のコールバックに書けばいいよ
jqueryのpostメソッドなら3番目のcallback引数、ajaxメソッドならoptionsのsuccessプロパティ
0865nobodyさん2014/07/06(日) 12:21:22.39ID:???
サーバサイドは必須
クライアントサイドは要件次第
0866nobodyさん2014/07/06(日) 13:35:04.95ID:ayo5h1or
サーバサイドは必須
クライアントサイドは暇人のみ必須
0867nobodyさん2014/07/06(日) 13:50:27.42ID:???
とりあえず、HTML5だけでやれるものでもやったらいいじゃん。
0868nobodyさん2014/07/06(日) 14:01:42.86ID:???
クライアントでのバリデーションが要件次第って理解できない奴はそういう仕事をやった事ないだけか、もしくは普段低品質な物を納品してるだけなんじゃね?ほっとけよ
0869nobodyさん2014/07/06(日) 15:40:52.42ID:ayo5h1or
クライアントでバリデーションを幾ら入れたって
サーバサイドに入れなくちゃ意味ねーだろ。
0870nobodyさん2014/07/06(日) 15:44:02.56ID:???
噛み合ってないなあ

サーバサイドに入れるのは大前提で
UIの質の向上のためにクライアントサイドにも実装するかどうかってことでしょ?
入力時にリアルタイムでバリデーションするとかそんな感じの

その上で実装方法としてAjaxでサーバサイドのバリデーションを使いまわす方法と
クライアントでJavaScriptで同じバリデーションを書く方法があるって話
0871nobodyさん2014/07/06(日) 15:51:05.55ID:???
requiredとかtype属性つけるだけで、暇人とか工数とか言ってるの笑えるわw
HTML5が対応していないブラウザなら当然スルーされるから、サーバサイドでのVaildationになるのは自明だろ。
いまどき最低限それくらい書いといて当たり前。
0872nobodyさん2014/07/06(日) 15:58:05.81ID:???
>requiredとかtype属性つけるだけで
見たところその前提で話してるのは少数派
簡単なチェックだけクライアントサイドでも実装すればいいという意見はもっともだけど

他はJSで書かないといけないような
もっと複雑なチェックも含めて話してるんじゃないのか?
0873nobodyさん2014/07/06(日) 16:20:06.81ID:???
根本的にクライアント側からのHTTPリクエストなんていくらでも変えられるから
クライアント側のチェックを信用せずサーバ側の実装が必須ってのは前提としてOKなんだよな?
これは仮にHTML5に対応しないブラウザがこの世から消滅したところで変わらない

だからクライアントのバリデーションを実装する主な目的は
セキュリティやデータの正確さの保証ではなくUI・UXもしくはサーバ負荷の低減
早い段階で(サーバを煩わせずに)ユーザが正しくない入力に気付くことは必須ではないが有用だってこと


仕事なら要件次第というのもその通りだろうし
HTML5の属性で実現できる程度なら常に書いておけというのもわかる


各自のイメージしている仕様や前提が違うだけだよな
■ このスレッドは過去ログ倉庫に格納されています