トップページ⇒php
1002コメント356KB

【PHP】フレームワーク CakePHP 17ホール目【v3α】

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2014/08/02(土) 21:57:41.01ID:LI0DdohH
CakePHPは、Ruby on Railsの概念の多くを取り入れた、高速開発とPHPの機動性を兼ね備えたフレームワーク
質問するときはCakePHPのバージョンを書きましょう

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

■本家
http://www.cakephp.org/
APIドキュメント
http://api.cakephp.org/
github - cakephp
http://github.com/cakephp
the Bakery
http://bakery.cakephp.org/
cookbook(マニュアル)
[3.x] http://book.cakephp.org/3.0/
[2.x] http://book.cakephp.org/2.0/ja/
[1.3] http://book.cakephp.org/1.3/ja/
Twitter
https://twitter.com/cakephp
Facebook
https://www.facebook.com/CakePHP

■日本語公式
http://cakephp.jp/
フォーラム
http://cakephp.jp/modules/newbb/


※前スレ
http://kanae.2ch.net/test/read.cgi/php/1393661004/
0136nobodyさん2014/12/02(火) 02:25:29.44ID:???
>>135
おっしゃる通り。確かに変わりませんね。
僕のミスです。失礼しました。

レスポンシブデザインって、ちゃんとしたサイトだとPCとスマホは分けるべきだと思うんだけどな。
0137nobodyさん2014/12/02(火) 06:43:53.62ID:???
Modelが変わるとか後出しだし。
Modelが変わるなら、Viewも応じて変えた方がいいに決まってる。
0138nobodyさん2014/12/04(木) 15:36:33.40ID:R0j+bkTk
ビューのコーディングについて相談です。

Cakeで出力されるHTMLのCSS部分はローワーキャメルケースですが、
HTMLヘルパーを使用しない箇所はどうしていますか?
同じようにローワーキャメルケースで書いてますか?
それとも独自の書き方を採用していますか?
0139nobodyさん2014/12/04(木) 16:07:23.93ID:???
>>138
独自だね
0140nobodyさん2014/12/05(金) 10:17:08.32ID:???
>>139
そうですか。特にこだわらないでも良いですね。ありがとうございます。
0141nobodyさん2014/12/10(水) 12:16:09.19ID:D9PtQRCX
Cake2.5.6でappをapp-adminのように変更しています。
サーバからコマンドでシェルを実行させる場合について質問です。

シェルを実行させるパスを
/usr/local/bin/php /home/hoge/public_html/app-admin/Console/cake.php Hello

みたいにすると、「Shell class Hello Shell could not be found」というエラーになります。
上記パスのapp-adminをappにすればエラーが出ないのですが、
appの名前を変えても実行するにはどうすれば良いのでしょうか?
0142nobodyさん2014/12/10(水) 14:34:35.99ID:???
>>141

コンソールから起動させるのは cake.php じゃなくて cake (bash) のほうな。
0143nobodyさん2014/12/10(水) 14:37:49.96ID:???
あぁ、悪いちゃんと読んでなかったわ。
app の名前を指定するパラメータは確か -app じゃなかったかな。
-app app-admin
みたいなのをくっつければいいかもしれない。

そもそも、そんな呼び出し方する理由が分からんがな。
普通は app-admin のディレクトリに移動して Console/cake を呼び出すんだぜ。
0144nobodyさん2014/12/10(水) 15:23:03.23ID:???
-app app-adminの変更で出来ました。ありがとうございました。
0145名無しさん@そうだ選挙に行こう2014/12/14(日) 19:10:29.85ID:R4VgTAzM
cakePHPでassociationを使うと
毎回結合が走っている様です。


この条件の時には結合を走らせるけれども
この場合には、結合せずにfindする


といった事をコントローラー側で制御する事は可能でしょうか?

毎回、結合してクエリ結果を返していると、テーブルのレコード件数が大きくなってきた場合に
パフォーマンスに影響が出る事が予想れます。
0146nobodyさん2014/12/14(日) 21:01:50.73ID:???
>>145
bindModel()やunbindModel()で動的に変更するか
検索時にjoinsを使えばいい
詳しい使い方は↓に載っている
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html

このスレの質問のほとんどはこのドキュメントで解決できるので
開発者なら他のページも一通り読んでおくことを薦める
0147nobodyさん2014/12/14(日) 21:34:57.75ID:R4VgTAzM
>>146
thanks

見てみます!
0148nobodyさん2014/12/15(月) 10:55:13.83ID:???
bindModel/unbindModel 使うんだったら ContainableBehavior でも
対して変わらないような気がする。
どっちもとんでもないクエリ吐き出すんだけどね。

joins 使えばそこそこまとも。

CakePHP3 ではかなり改善される模様。
0149nobodyさん2014/12/15(月) 11:30:36.76ID:???
自分は Containable と Matchable 併用してる。
0150nobodyさん2014/12/15(月) 19:02:35.15ID:Hxt+g1uL
アソシエーションを使うより普通にSQL書いて実行
させた方が楽な気がするのだが俺だけ?
0151nobodyさん2014/12/15(月) 20:40:41.52ID:???
短かったら楽だけど、長いと間違いの元だよ
0152nobodyさん2014/12/15(月) 21:02:08.37ID:???
CakePHPの呪文を覚えない限り、複雑なのは直接書いたほうがむしろ間違わない。
0153nobodyさん2014/12/15(月) 22:12:11.75ID:UqCW5FKL
こっちは inner join したいのに left join しやがるので
アソシエーションは好かん
0154nobodyさん2014/12/16(火) 03:08:27.79ID:???
Cakeのアソシエーションって何?
SQLをPDOとかで直に書いた方がいいの?
それともZendとかで最小限のライブラリ読み込んだ方がいいの?
何で日本人はCake使いたがるの?
英文サイト解読してlaravelとか使えないの?
0155nobodyさん2014/12/16(火) 09:33:38.60ID:???
>>153
type指定でinnerに出来るよ
0156nobodyさん2014/12/16(火) 10:38:29.65ID:MEG1C3Vr
>>155
しらなんだ!!
0157nobodyさん2014/12/16(火) 17:04:45.60ID:???
なぜ、outerがデフォルトなんだ?w
0158nobodyさん2014/12/16(火) 18:15:37.65ID:???
>>157
innerだと?と思う人がいるからだよ
0159質問�@2014/12/18(木) 00:17:48.32ID:ZHBfn1LO
Console/UxnkoShell.php に対してTeraTermからシェルを実行しているのですが
原因不明のエラーが出ます。

以下のコードを実行したところ投入データに一意成約違反などない筈なのに
エラーが出てしまいます。

気になるのは、エラーメッセージに「'30-1-2014-12-17'」こんな文字列がどうやらSQLで
発行されている様です。

全く原因が分かりません。お助けくださいm(_)m


$insert_data = array(
'tableTests' => array (
'user_id' => $user_id,
'sequence_number' => $sequence_number,
'confirm_date' => $executed_date,
)
);

debugprint($insert_data);
0160質問�A2014/12/18(木) 00:19:48.09ID:ZHBfn1LO
デバッグ出力した結果です。

array(1) {
["tableTests"]=>
array(4) {
["user_id"]=>
string(2) "30"
["sequence_number"]=>
string(1) "1"
["confirm_date"]=>
string(10) "2014-12-17"
}
}



$this->tableTests->create();
$this->tableTests->save($insert_data);


なぜかエラーメッセージが出てしまいます。

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '30-1-2014-12-17' for key 'PRIMARY'
#0 /home/maxnko/cake/lib/Cake/Model/Datasource/DboSource.php(460): PDOStatement->execute(Array)
#1 /home/maxnko/cake/lib/Cake/Model/Datasource/DboSource.php(426): DboSource->_execute('UPDATE `uxnko...', Array)
0161質問�@�A2014/12/18(木) 00:39:30.54ID:ZHBfn1LO
原因が分かりました。
0162nobodyさん2014/12/18(木) 10:51:48.08ID:???
なんだったの?
0163nobodyさん2014/12/18(木) 16:27:33.17ID:IJydX9LX
>>162
アソシエーションのプライマリキーが邪魔してました。
アソシエーション使わない方が小回りが利いて良いですね。
0164nobodyさん2014/12/19(金) 19:52:59.80ID:BHq08Q5j
Ajaxで開発をこれまで行っていましたが
毎度、ブラウザのみならずJSデバッガーを開いてJSを毎度開いてデバッグする必要があり手間なので
全てpostを行い、サーバ側でバリデーションその他を行う様にしました。

開発の生産性はAjaxと比べてどちらが早いですかね?
0165nobodyさん2014/12/19(金) 22:23:30.29ID:???
>>164
サーバー側のがいい
0166nobodyさん2014/12/19(金) 23:20:57.71ID:???
そもそもAjaxだかなんだか関係なく
サーバ側でバリデーションは必須じゃないのか……
0167nobodyさん2014/12/21(日) 15:17:01.54ID:kDlJPF64
>>165 >>166
そもそもだけど、Ajaxで is_post"ajax")って感じで
バリデーションをするとcrome上でデバッガーを開いてやらないといけないでしょ?
それが面倒なんです。


普通にPOSTで全てリクエストを行っていれば
簡単にデバッグ出来るけど、Ajaxにするとサーバからの戻り値をJavaScript側でもデバッグを
する必要があるでしょ?

それが本当に面倒に感じるんです。
0168nobodyさん2014/12/22(月) 22:18:50.23ID:???
>>167
クライアント側でのバリデーションはオマケ
クライアント側でバリデーションをやろうがやるまいが、サーバ側でのバリデーションは必須
0169nobodyさん2014/12/23(火) 21:07:58.32ID:???
composer ってさ、バージョン指定してないと全部アップデートされるじゃん。
バグの原因にならんの?不安で仕方ない。

アップデートしたくないのをjsonで削除するとファイルまで削除されるし。
0170nobodyさん2014/12/23(火) 21:31:44.30ID:???
指定しなよ
0171nobodyさん2014/12/24(水) 01:58:44.52ID:???
>>170
例えばcake2.4使ってて、中身を少し変えるとするじゃん。
で、2.4を指定してcomposerしたらどうなる?

1 同じ2.4なので何も起きない
2 同じ2.4だけどファイルが少し違うので新しい2.4を、上書きする

どっちなんでしょうか?
0172nobodyさん2014/12/24(水) 08:56:59.50ID:???
>>171
composer.jsonにcakephp/cakephpを2.4.*と指定したということでいいかな?
https://packagist.org/packages/cakephp/cakephp
基本的にリポジトリに登録されているバージョン情報を利用するわけなので
開発中のバージョンを指定しなければ問題無いだろう

●composer install
- composer.lockファイルがある → composer.lockファイルに記録されたものと同じバージョン
- composer.lockファイルがない → Packagistに登録されている2.4系の最新バージョン

●composer update
Packagistに登録されている2.4系の最新バージョン


自分で開発していてアップデートしたくないパッケージがあれば
composer.jsonに2.4.8などとバージョンを決め打ちで指定してupdateすれば影響はほぼない
ソースを配布するならcomposer.lockを残しておいてupdateは自己責任でやれよってことで良くないか?
0173nobodyさん2014/12/24(水) 11:20:42.46ID:???
>>172
ありがとうございます!
composer.lock初めて知りました。
見てみます。
0174nobodyさん2014/12/26(金) 14:52:05.09ID:y17exSu4
Cake2.x系でFormヘルパーを使用して以下のようなラジオボタンを出力しています。

<?php echo
  $this->Form->input(
    'Fuga.fuga_id',
       array(
           'label' => false,
           'legend' => false,
           'div' => false,
           'type' => 'radio',
           'options' => $hogeArray,
           'default' => $hogeDefault));
?>

optionsに指定している「$hogeArray」はコントローラ側からセットしている配列。
defaultに指定している「$hogeDefault」はデフォルト選択値。
やりたいことは「$hogeArrayがn個毎に改行を入れて表示」なのですが、上手くいきません。

separatorに例えば「<br />」などを指定すれば項目1つずつ改行されるのですが、
個数指定をしてseparatorを入れるようなことはできたりしないでしょうか?
0175nobodyさん2014/12/26(金) 22:05:31.40ID:???
ただの見た目の問題なんだしCSSでやればよくない?
IE8? 知らないブラウザですね
0176nobodyさん2014/12/26(金) 22:20:14.73ID:???
>>174
そういうのは出来ないと思う。
javascript で挿入するか >>175 の言うように CSS でやるか、
レンダリング結果をパースして変換。
今なら :n-th セレクタ使えるから CSS が一番手っ取り早いだろうね。
0177nobodyさん2014/12/27(土) 09:59:18.74ID:???
>>175-176
レスありがとうございます。
やっぱりできないんですね。

仰る通り、見た目の問題ですのでCSSで制御しようと思います。
ありがとうございました!
0178nobodyさん2014/12/30(火) 14:19:54.96ID:9yoyGP6/
cakePHPで入力フォームを用意して登録ボタン押下時に
サーバにポストした場合、サーバサイドでは

入力項目においてdisabled を付けている項目は $this->request->data で取得出来ない
のは仕様なのでしょうか?
0179nobodyさん2014/12/31(水) 10:07:14.07ID:???
>>178
cakeでなくhtmlの仕様
0180nobodyさん2015/01/01(木) 14:03:44.77ID:qSREffE+
>>179
ありがとうございます。解決しました。
0181nobodyさん2015/01/02(金) 09:29:55.89ID:jgbndoA2
cake2.5.8でfacebookをつかって認証してるのですが、
デバッグモードが2もしくは1の時は問題なくログイン・ログアウトできるのですが、
0にするとできなくなります。
http://www.msng.info/archives/2010/12/cakephp-error-only-when-debug-level-is-0.php
にある$this->autoRender = false;
は入れてあるのですが、他に解決策はありますか?
0182nobodyさん2015/01/06(火) 01:58:05.89ID:???
:n-th知らなかったから試しに使ってみたけど結構便利だね
けどIE8は効かないということなんで、
IE8を対象外にするわけにもいかず結局開発では使えなかった・・・
181はもうちょっと具体的にどんな実装をしたのかとか
どんなエラーが発生しているのかとか報告しないと答えようがないんじゃないかな
0183nobodyさん2015/01/06(火) 20:15:42.85ID:???
IE8早く爆発しろ
0184nobodyさん2015/01/06(火) 21:00:09.97ID:???
IE6はようやく考えなくても良くなったけどね…
IE8はまだ15〜20%ぐらいあるから、簡単には切れないよね
0185nobodyさん2015/01/06(火) 21:26:44.31ID:???
ご老体のIE8様は別枠でJavaScriptで介護して差し上げろ
0186nobodyさん2015/01/07(水) 14:32:26.18ID:???
嫌だ。もう無視する。
0187nobodyさん2015/01/07(水) 20:54:00.88ID:???
自社開発webアプリでもない限り
開発側にブラウザを選ぶ権利はなくて顧客側の要望次第だろう
今まで対応していたブラウザを切りたければうまく交渉するしかないね
IE8は全然許せるけどIE6はブラウザ界のガン細胞だと思う
0188nobodyさん2015/01/09(金) 12:45:51.25ID:NOQO6qeZ
Formでデータベースに保存した画像の表示が出来ないんだけどどうやるんだ・・・
保存した物をforeachで取り出したいけどエラー地獄だわ・・・
0189nobodyさん2015/01/11(日) 14:25:23.64ID:???
そもそも画像保存にDB使うなよ
0190nobodyさん2015/01/14(水) 16:05:28.03ID:FY0jfzBq
cakephp2を使っているのですが、URLを.htmlにすることは可能でしょうか?

http://www.hagehage.com/tururi/index.html

のような形にしたいのですが。
0191nobodyさん2015/01/15(木) 00:37:14.38ID:HkjxQN1G
>>190
多分この辺の情報が役に立つと思われ
http://stackoverflow.com/questions/3410611/how-can-i-append-html-to-all-my-urls-in-cakephp

昔調べたときは、あぁ簡単にできるんだな、ぐらいに思って一度も使ったことがないからよくわからないや。
0192nobodyさん2015/01/15(木) 00:39:51.88ID:???
読んでみたら一番上の答の人がドキュメントに詳しく載ってるって書いてたなw

http://book.cakephp.org/2.0/en/development/routing.html#file-extensions
0193nobodyさん2015/01/15(木) 08:59:40.27ID:gSrUDeRO
>>191-192
ありがとうございます!
見てみます!
0194nobodyさん2015/01/15(木) 16:42:24.08ID:+TbruyRA
View側で hidden で隠し設定した値をコントローラ側で受け取る方法はありませんか?
0195nobodyさん2015/01/15(木) 17:10:54.40ID:???
>>194
あります
0196nobodyさん2015/01/16(金) 00:22:26.90ID:???
hidden てそもそも表示は隠しつつデータを受け取るためのものだろ。。。
意味不明
0197nobodyさん2015/01/16(金) 01:25:11.15ID:K/pOgg26
>>195
どうやってやるんですか?
Ajaxだと余裕ですがcakePHPでPOSTした場合にどうしても取得出来ません。

>>196
Viewのレンダリング時にhiddenに設定した内容を登録ボタンを
押した際にサーバ再度でhidde項目の値を取得したいのです。
0198nobodyさん2015/01/16(金) 04:52:36.72ID:???
>>197
普通に取得できるだろ。

おれの読解力に問題があるのだろうが、何いってるのかさっぱり分からん。
0199nobodyさん2015/01/16(金) 12:44:01.48ID:GWt4KHXH
>>198
≪View≫
<input type="hidden" name="name_hidden" value="komaneti">

≪Controller≫
$this->request->data["name_hidden"];
⇒issetで値があるかを判定するとfalse(つまり存在しない)となります。


はたして(PHP単独ではなく)本当にcakePHPでhidden項目の
値の取得をサーバ側(Controller)でする事は出来るのでしょうか?
0200nobodyさん2015/01/16(金) 13:29:28.04ID:???
hiddenまったく関係なくてnameが間違ってるだけじゃん
正しくはこう
<input type="hidden" name="data[name_hidden]" />

普通はフォームヘルパーで書くもんだよ
<?php echo $this->Form->hidden('name_hidden'); ?>

どうしてもnameを変えたくないなら$_POSTか$_REQUESTでどうぞ
あまりにも基本レベルで理解できてないようなんで、
まずはブログチュートリアルを実際にやってみたほうがいいよ
ブログチュートリアルって何?って人はそもそもマニュアル読んでない証拠なんで問題外
0201nobodyさん2015/01/16(金) 14:51:16.48ID:???
>>200
name="data[model_name][field_name]"
じゃないの?

どっちにしてもチュートリアルやってないような奴に何言っても時間の無駄だが
02022002015/01/16(金) 15:28:30.64ID:???
>201
199の例文に合わせただけだよ
モデル名も入れた君の例なら取得側が
$this->request->data['model_name']['field_name']
になるってだけ
0203nobodyさん2015/01/17(土) 19:58:26.44ID:???
なゆあかか
0204nobodyさん2015/01/18(日) 01:38:43.72ID:YMMCDK0S
すいませんが相談させてください。
wordpressでとあるポータルサイト(1日のPVは1,000程度)を運営しているのですが、
今後、数十万件以上(WPのカスタム投稿で)のデータを登録する予定となったので、
wordpressで構築するのは負荷的に耐えられないのかと思い、
CakePHPで構築しなおそうと思っています。

という状況なのですが、CakePHPにしたからwordpressよりも早くなるとは限らず、
むしろ遅くなる可能性もあるのでしょうか?
(フレームワークとしてCakeにこだわってはいないので、採用するのは他のフレームでも構いませんが)
ググってみたりはしたのですが、この比較対象がおかしいということもあるのか、
比較記事は見当たらず、私自身がCakeの事を本質的に理解出来ていないこともあり、困ってしまっています。
WPの中で生のSQL文を書いて、直接データ登録・取得・表示するのが良いのかなと
アホみたいな事も思い始めていますが・・・・

ちなみに私自身のスキルとしては、以下の感じです。
DB:基本的に大抵のことは出来て問題無い、テーブル結合とか検索とかの事は生のSQL文を書ける
PHP:wordpressのテーマを自分でガリガリとカスタマイズして外部からの入力フォーム・表示フォームとかは自分で作成しているが、難しい事は分からない
HTML・CSS:他サイトを見よう見まねで学んでいる状態で、ちゃんと理解出来ていない事が多い
0205nobodyさん2015/01/18(日) 01:53:17.52ID:???
>>204
お前は「そんな可能性はない」と言われたらCakePHPにするのか?
そうじゃないだろう?

だったらなぜまず試さない?
試してみて遅かったら、その原因を聞きにくるというのがやり方じゃないか?
もちろん、聞きにくるときは、それなりの情報を出しながらだが
0206nobodyさん2015/01/18(日) 13:36:16.56ID:???
>>204
CMSとフレームワークの違いがわかってないのかな?
wordpressはCMSの部類でコンテンツ管理する仕組みが既に入っているけど
cakephpみたいなフレームワークは言ってみりゃ単なる便利ライブラリ集だから
コンテンツ管理する仕組みとかは全部自分で実装しなきゃいけないよ
0207nobodyさん2015/01/18(日) 17:42:38.18ID:???
脆弱性作り込んでそう

そんなあやふやな知識で博打を打つくらいなら
DBのチューニングやPHPアクセラレータの導入などしてWordPressの高速化をはかるほうがマシだと思う
翻訳止めるだけでも結構速くなるしな

DBからの読み出しメインのサイトなら、
前段にvarnishやnginxを置いてリバースプロキシキャッシュでも使えば?
0208nobodyさん2015/01/19(月) 00:27:11.87ID:???
>>204
そもそもPHPで作るのが間違い
0209nobodyさん2015/01/19(月) 18:10:55.81ID:oaFQh/MS
2015/02/02
⇒OK

cakePHPの正規表現でこの日付型文字列の入力のみOKとするには
どういうコードを書けば良いでしょうか?


2015/2/2
⇒NG
0210nobodyさん2015/01/19(月) 19:25:44.90ID:???
>>209
cake関係ないじゃん
0211nobodyさん2015/01/19(月) 19:59:44.14ID:oaFQh/MS
>>210
どうやって判定すれば良いのでしょうか?
0212nobodyさん2015/01/19(月) 20:18:16.07ID:???
>>211
validationの方法は一通り知った上での質問なんすか?
0213nobodyさん2015/01/19(月) 21:40:22.05ID:oaFQh/MS
>>212
はい、教えてください。
0214nobodyさん2015/01/19(月) 23:55:25.95ID:???
じゃあカスタムバリデーションルール作って
public $validate = array(
 'myDatetimeCheck' => array(
  'rule' => '^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$',
 )
);
みたいにすればいいのでは
このパターンはケタ数しかチェックしてないから日付には使えないけど
0215nobodyさん2015/01/20(火) 00:39:05.11ID:MQEJ/fBy
>>214
サンクス


正規表現が苦手なんだよね
0216nobodyさん2015/01/20(火) 00:56:53.90ID:???
>>215
俺も得意ではないけど頭の体操がてらやってみては

ただ実際には4/31は?とか閏年じゃ無い年の02/29は?とか言う問題が出てくるから
正規表現でもできるとは思うけど
cakePHPのVaridation::dateと二段構えにするとか
カスタムバリデーションでphpのcheckdateを通すとか工夫は必要になるかも
0217nobodyさん2015/01/20(火) 13:50:15.77ID:???
お、ひさしぶりにおもしろそうな質問発見!
Validation.php見ればわかるけど日付のチェックは閏年を考慮した正規表現一発でやってるよ
適当に改造してみるとこんな感じ

$separator = '(/)';
$regex['ymd'] = '%^(?:(?:(?:(?:(?:1[6-9]|[2-9]\\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))' .
$separator . '(?:02\\1(?:29)))|(?:(?:(?:1[6-9]|[2-9]\\d)\\d{2})' .
$separator . '(?:(?:(?:0[13578]|1[02])\\2(?:31))|(?:(?:0[1,3-9]|1[0-2])\\2(29|30))|(?:(?:0[1-9])|(?:1[0-2]))\\2(?:0[1-9]|1\\d|2[0-8]))))$%';

改造ポイント
・セパレータは/しか認めない
・西暦2桁表記をNGに変更
・月の1桁表記をNGに変更
・日の1桁表記をNGに変更

書いといてなんだけど、理解できないようなら素直に文字列分解して
4年は〜100年は〜400年は〜のロジック入れればいいよ
0218nobodyさん2015/01/20(火) 22:12:54.49ID:uK/q/RsU
管理画面を AdminController.php として定義してガリガリコードを
書いているのですが、ソースコードの行数が増えてきて
Eclipseで編集する際にフリーズを感じます。

この様にコードが増えて来た場合には
コントローラ名を分けるしかないのでしょうか?
0219nobodyさん2015/01/20(火) 22:23:48.18ID:???
アクションの数が増えたっていう話なら
機能ないし利用するモデルごとに分ける
プリフィックスルーティングでも使えばいい

メソッド一つ一つが長くなっているなら
コンポーネントやモデルや独自のサービスクラスに処理を移すことを考える
0220nobodyさん2015/01/20(火) 22:51:22.09ID:uK/q/RsU
>アクションの数が増えたっていう話なら
>機能ないし利用するモデルごとに分ける
>プリフィックスルーティングでも使えばいい
こっちの事象です。

プリフィックスルーティングとか初めて聞きました。
こちらを探して試してみます。
0221nobodyさん2015/01/25(日) 13:55:32.77ID:???
eclipseが重いところにルーティングいじっても何も解決しないと思うのは俺だけ?
URLが変わってもいいなら、普通にコントローラ分割すればいいし、
URL変えるわけにはいかないなら、"修正中だけ"別コントローラで作って
完成したら1つに戻せばいい
大きなライブラリを使ってるならeclipseから見えない場所に移動させるとか
コーディング以外にも工夫のしようはあるだろう
0222nobodyさん2015/01/25(日) 18:50:35.80ID:???
プリフィックスルーティングの話は
複数のコントローラに分割した上でhttp://example.com/admin/から始まるURLを使いたかったらってこと
AdminControllerなんて名前をつけてるのはURLの都合だろうと思ってね

eclipseが重くなるほど1つのファイルのソースコードが増えてるってのが本当なら
1つのコントローラに管理画面の全てを詰め込む設計はまずいだろうし
0223nobodyさん2015/01/26(月) 11:10:30.59ID:ZT64LJ1C
以下のページを参考に画像のアップロード機能を試しています。
なぜかファイルをアップロードしようとすると「save」ファンクション
が認識されずにエラーになってしまいます。

http://www.tailtension.com/cakephp/1512/

【エラーの出るコントローラの中のコード】
//画像の保存
if($this->Post->save($this->request->data))
⇒ここでエラー

【エラー内容】
Fatal error: Call to a member function save() on a non-object in

【捕捉】
コントローラ名は、 TestController.phpで
定義したアクション名は、 update_image です。
0224nobodyさん2015/01/26(月) 13:32:11.28ID:???
>>223
CakeというよりPHPのエラー通りだと思うけど

そのコントローラでPostモデル呼んでないだけじゃない?
0225nobodyさん2015/01/26(月) 18:47:51.81ID:/y+cf3Fd
cake2.5.8でプロシージャをコールし、out変数を受け取りたいんだけど、
query使ってバインド変数で受け取れますか?

Oracleでやったことのある方がいたら教えていただきたく……
Oracle以外でも、ヒントになるやもしれませんので、教えてくださったら助かります

なんでOracleなのにcakeにしてしまったのか……
0226nobodyさん2015/01/26(月) 20:09:16.40ID:OoDGdBhC
>>224
サンクス

結局プレーンなPHPを使ってアップローダを作る事にしました。
0227nobodyさん2015/01/29(木) 00:13:39.62ID:rYg0zKsM
設計について相談です。
会員登録ページやログインページのURLが
/users/add
/users/login
だとします。

会員情報の変更は、会員専用ページにログインして行えるとします。
その場合、会員情報の変更はどういうURLが適切なんでしょうか?

通常は/users/editだと思いますが、少し違和感があります。(ログイン中に操作するので)
mypagesを作ってプラグイン化して/mypages/users/editみたいにする事も出来るでしょうが、
その場合は、会員用のコントローラー(UsersController.php)がだぶる気がします。

ログイン前のページ・ログイン後のページと分ける設計の場合、
どういうコントローラーとアクション構成にすれば良いと思いますか?
0228nobodyさん2015/01/29(木) 20:58:50.89ID:???
2.xでSQLServerで使用している方いますか?

NULL許可、デフォルトNULLと設定したカラムでデータを省略してinsertした際の
挙動で困っております(当方2.6.1)。

CREATE TABLE [dbo].[items] (
[id] int NOT NULL IDENTITY(1,1) ,
[name] nvarchar(200) NOT NULL DEFAULT (N'') ,
[type1] int NOT DEFAULT ((0)) ,
[type2] int NULL DEFAULT NULL ,
PRIMARY KEY ([id])
)

こんな感じのテーブルがあったとして、
$data['Item']['name'] = 'test';
$this->create();
$this->save($data);
とした場合、MySQLだとtype1,type2ともにDBに設定したデフォルト値でInsertが行われます。
SQLServerの場合、「Conversion failed when converting the varchar value 'NULL' to data type int.」
という理由でエラーとなります。
発行されるSQL文で、SQLServerの場合はNULLをシングルコーテーションで囲む必要が無いのに
囲んでしまっているというのが原因のように見えますが、これを回避する方法はありますでしょうか?
0229nobodyさん2015/01/31(土) 21:52:23.62ID:r0T1vu8n
バリデーションについてです。
バリデーションエラー時のメッセージにフォーム入力の値を使いたいのでですが
以下$valueの部分はどのように書けばいいのでしょうか?

public $validate = array(
'name' => array(
'isUnique' => array(
'rule' => array('isUnique'),
'message' => $value . 'は挿入済みです。',
'required' => true,
)
)
);
0230nobodyさん2015/02/02(月) 22:50:58.85ID:???
>>229
そういうのは出来ない。view側で分岐すべし
0231nobodyさん2015/02/03(火) 15:50:31.15ID:???
>>229
コールバックbeforeValidateで処理するか、
独自のバリデーションメソッド作るか、お好きな方で。
02322292015/02/04(水) 18:25:08.07ID:???
>>230
>>231

ありがとう。
ビューで$this->validationErrors['モデル名']のループまわすことで対応しました。
0233nobodyさん2015/02/04(水) 22:31:45.65ID:HkYqZDdt
現在、cakePHPで入力内容を保存する際にどうすれば良いか悩んでいます。
普通の文字は問題無いのですが

「"」や「>」はサニタイズしてDBに保存するのか
それとも、エスケープしてDBに保存するのか


どちらが一般的なのでしょうか?
0234nobodyさん2015/02/04(水) 23:47:57.07ID:???
>>233
HTMLエスケープのことを言ってるなら
HTML出力時にエスケープするのが定石
DB保存時にHTMLエスケープしたりはしない
0235nobodyさん2015/02/04(水) 23:58:09.18ID:???
入力内容をHTMLタグを含まないテキストとして出力する場合はそのまま保存して出力時にエスケープするべき
入力時のチェック・処理だけだとその後の処理によってスクリプトの文字列が生成される可能性があるので根本的な対策にならない
入力値サニタイジング後の値を逆手に取るセカンドオーダー攻撃なんてものもある

HTMLタグを許可する場合に根本的な対策をするには構文解析して必要な要素を抜き出す必要がある

https://www.ipa.go.jp/security/vuln/websecurity.html
ここにIPAが出してる安全なウェブサイトの作り方というPDF資料がある
クロスサイトスクリプティングの項目が参考になる
0236nobodyさん2015/02/05(木) 00:01:18.00ID:???
cakeの作法通りにコーディングしているなら、
そういった処理は特に意識しなくても勝手にやってくれる
嘘だと思うなら、ブログチュートリアルの記事追加で
君の思いつく限りの変な文字を入力して保存、表示をしてみるといい
どんな入力をしようと問題なく動作するはず

自動でやってくれないのは
・DBがEUC-JPなのに入力に�@を使うとかの特殊なケース
・SQLを文字列で直接書いている
・ヘルパーを使わずに変数を出力
こういったときは自分でサニタイズ、エスケープ等が必要になる
■ このスレッドは過去ログ倉庫に格納されています