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

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

レス数が950を超えています。1000を超えると書き込みができなくなります。
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/
0874nobodyさん2014/07/06(日) 16:25:16.79ID:???
あとはクライアントサイドならレスポンスが早いというメリットもあるね

クライアントサイドのバリデーションはなくてもいいけど、あったらうれしい
そんな感じなのはみんな分かってると思うけど、そうじゃないのかなー?
0875nobodyさん2014/07/06(日) 16:31:12.33ID:???
>>874
俺は、あなたと同じ感じ。
あったら嬉しい♩
0876nobodyさん2014/07/06(日) 20:43:56.62ID:???
そう、レスポンス
それが分からない奴はその程度の品質の仕事しかしてないって事
0877nobodyさん2014/07/07(月) 00:35:24.40ID:???
うわあんあ!プログラム全部作り直してーって思った時どうする?
我慢して作り続けるか、一から作り直すか。
0878nobodyさん2014/07/07(月) 07:41:59.67ID:???
>>877
作ればいいじゃない
0879nobodyさん2014/07/07(月) 11:17:31.99ID:???
最近日本語が読めない人がレスを延ばしてるのな
0880nobodyさん2014/07/08(火) 18:18:22.90ID:???
テストケースで、今週の日付を返すメソッドをテストする時どうする?
テスト側でわざわざ今日の日付を取得してでもやるべきなのかな。
0881nobodyさん2014/07/08(火) 19:21:17.99ID:???
なんかそれ簡単にするPHPの追加機能なかったっけ
0882nobodyさん2014/07/08(火) 19:56:03.84ID:???
>>880
テストケースがあるならやらないとダメなのでは?
テストケース作った奴に聞け
0883nobodyさん2014/07/08(火) 20:34:19.53ID:???
>>882
テストケースを自分で作ってるんだけど、
テストするためにメソッド追加するのは本末転倒だし。
0884nobodyさん2014/07/08(火) 21:10:41.73ID:???
モック使うだろ普通
0885nobodyさん2014/07/08(火) 21:57:00.34ID:???
焦点は現在時刻を返す部分をいかに切り分けるかってとこじゃない

より汎用的に引数に指定した日時の週の日付を返すメソッドを予め作ってテストしておいて
本体はその汎用的なメソッドを現在時刻を引数に呼び出すだけのメソッドにして目視確認
ってのが驚きの少ない無難な方法だと思うけどそのメソッド自体にテストケース書けと言われると微妙か


2つ目は現在時刻を返すメソッドを実装したクラスのインスタンスを注入する仕様にする方法
テストの時は同じインターフェースで固定値を返すように実装したモックオブジェクトを代わりに注入
PHPUnitならgetMockつかえばモックオブジェクト作るのは簡単だね


もし他のライブラリ使ってもいいならメソッドの実装にCarbonを使う
DateTimeクラスを継承していて非常に使いやすいし
現在時刻を返すスタティックメソッド(Carbon::now)もモックできるので楽
https://github.com/briannesbitt/Carbon
0886nobodyさん2014/07/08(火) 22:07:18.39ID:???
ごめん正確には現在時刻じゃなくて現在日時だな
0887nobodyさん2014/07/08(火) 23:07:28.08ID:???
>>884
>>885
ありがとうございます!
やってみます。
0888nobodyさん2014/07/08(火) 23:27:31.87ID:???
githubで配布されてる、timecopってライブラリいいよ。コアの時刻系関数を全部上書きされ、モック日付を設定するAPIが追加されるので、今日があたかも昨日かのようにテストできる。結構な規模のシステムで1年くらい使ってるけど、特にハマりどころもなかったよ。
0889nobodyさん2014/07/08(火) 23:32:03.79ID:???
Rubyのあれの移植か
ライブラリじゃなくてエクステンションだね
0890nobodyさん2014/07/08(火) 23:43:10.63ID:???
そうだね。すまん。
0891nobodyさん2014/07/09(水) 02:01:00.01ID:???
pr関数を改造してbasics.phpに書いてたんだけど、composerでupdateすると上書きされちゃうのね。

上書きされずpr関数を上書きしたい場合
どうすればいいかな?
0892nobodyさん2014/07/09(水) 08:16:02.07ID:OfaKG9nk
無理ちゃうか?
0893nobodyさん2014/07/09(水) 19:17:35.46ID:of68YZwX
すれ違いかもしれないですが


Windows 7 で一番最初に付けたPC名を変更する事は出来ますか?

例)

USER_A
↓
USER_B
0894nobodyさん2014/07/09(水) 21:25:01.58ID:???
PHPもフレームワークも関係ありませんよ?
Windows板に行きましょう
0895nobodyさん2014/07/09(水) 21:40:14.07ID:???
>>891
あえてやるなら composer のコマンドと basics.php の編集のバッチを
続けて記述したスクリプトを書くってことぐらいしか思いつかん。
具体的な書き方は分からん。
0896nobodyさん2014/07/10(木) 10:49:28.02ID:???
User(会員)→Photo(会員が投稿した写真)
というモデル構成の場合について質問です。
写真を置くディレクトリ構造ってどうしてますか?

http://example.com/images/users/(会員ID)/(画像ファイル名)
http://example.com/images/photos/(写真ID)/(画像ファイル名)
http://example.com/images/users/(会員ID)/photos/(写真ID)/(画像ファイル名)

という3パターンが思い浮かぶのですが、
どうした方が後々管理しやすいと思われるでしょうか?
皆さんがやっている方法を教えてください。
0897nobodyさん2014/07/10(木) 14:19:59.62ID:???
サービスの内容による。

少なくとも想定する会員数と画像の枚数、
会員毎の画像以外のアセットの有無、
あるなら何がどの程度か、などがないとなんとも言えない
0898nobodyさん2014/07/10(木) 21:45:46.46ID:???
サブドメイン http://img.example.com/
データベースにBLOB型でぶち込む

と言う手もあるぞよ
0899nobodyさん2014/07/10(木) 22:31:15.57ID:???
>>898
BLOB型でぶち込むって、ファイル自体をDBで保存するの?
0900nobodyさん2014/07/11(金) 10:54:21.57ID:???
そういうことでしょ。
メリットは、DBMSの一貫性保持の機構がそのまま利用できること。
デメリットは、ファイルシステムに保存する場合より、パフォーマンス面でかなーり不利。

SQLServerでいうところの、FileStreamみたいなのが欲しいところ。
0901nobodyさん2014/07/12(土) 05:21:43.91ID:eXF6HCkL
お前ら開発の時ローカルで開発して
コードをサーバにアップするっていう開発スタイル?


面倒なのでいつもサーバ直結してリモートプロジェクトで開発してるんだが。
これってあかんの?
0902nobodyさん2014/07/12(土) 07:03:18.07ID:???
>>901
いろいろおかしい
0903nobodyさん2014/07/12(土) 07:06:49.47ID:eXF6HCkL
>>902
クライアント環境とサーバ環境で差異が出るでしょ?
だったら直接リモート接続で開発した方が効率が良いと思うんだよね。
0904nobodyさん2014/07/12(土) 07:26:55.38ID:???
>>901
別におかしくない
0905nobodyさん2014/07/12(土) 08:23:55.68ID:Xst9czPt
あほか。Vagrantとgit使えよ!
0906nobodyさん2014/07/12(土) 09:07:45.94ID:???
>>901
それだとバグった状態のまま不特定多数の人間が使えることになる
画面表示がおかしいだけならまだしも、本番DBがぶっ壊れたり
セキュリティに大穴があいた状態になるかもしれない
0907nobodyさん2014/07/12(土) 09:12:03.92ID:???
変更中にアクセスされたときに
不具合が起きる可能性よりも
メリットを感じるなら
やればいいさ
0908nobodyさん2014/07/12(土) 09:25:16.62ID:???
>>906
本番につなぐなんて誰が言ったのか
0909nobodyさん2014/07/12(土) 10:53:52.48ID:???
釣りか
0910nobodyさん2014/07/12(土) 11:14:11.35ID:???
コードをサーバにアップ???
0911nobodyさん2014/07/12(土) 11:26:59.71ID:???
>>906
一瞬なら大丈夫
0912nobodyさん2014/07/12(土) 11:36:07.30ID:???
これって、一人だけでオレオレ開発してる人だよな
0913nobodyさん2014/07/12(土) 11:50:03.80ID:???
gitの使い方が全く分からん
リポジトリやコミットの意味はわかるんだが
0914nobodyさん2014/07/12(土) 11:50:20.97ID:???
サーバが自分用の開発サーバなんだろ

ツマンネ
0915nobodyさん2014/07/12(土) 12:02:45.78ID:???
どうやったってデプロイの瞬間とか無防備なんだし
実稼働中の追加案件開発でそうなるのは仕方ない
09169012014/07/12(土) 12:03:22.96ID:eXF6HCkL
http://test.main_site.com/ ← こっちで開発(基本認証)
↓ テストOK 本番環境へのシェルの実行
http://main_site.com/ ← こっちが本番環境


こーいう感じで開発しています。
クライアントとサーバとの誤差もすくなくて生産効率は凄く良いのですが、、、


あかんの?
0917nobodyさん2014/07/12(土) 12:08:08.33ID:???
>>916
それは至って普通にある形

あかんのは>>901の書き方
0918nobodyさん2014/07/12(土) 12:18:20.16ID:???
916の言うクライアントとは?
http://test.main_site.com/のこと?

テストOK⇒本番デプロイ
その後、やっぱりまずかった元に戻そうって時にシェル1発で戻せるようにできてる?
0919nobodyさん2014/07/12(土) 12:29:59.91ID:???
>>915
追加案件とかブランチ切って開発してテストして問題なければマージじゃないの?
git 使わない開発とかもはや想像つかないけどな。
0920nobodyさん2014/07/12(土) 12:30:41.14ID:???
>>913
soursetree使うといいで
0921nobodyさん2014/07/12(土) 14:28:02.05ID:???
git使ったほうが良いサイトってどのくらいの規模?
テーブル数が50ぐらいなるサイトは使った方がいい?
0922nobodyさん2014/07/12(土) 14:30:31.69ID:???
小規模でも使った方がいいよ
別にそんな難しいもんじゃないし
0923nobodyさん2014/07/12(土) 14:40:57.65ID:???
>>918
シェルで環境戻すってどうやるの?
0924nobodyさん2014/07/12(土) 19:25:17.41ID:???
foreachで最初と最後の配列を特定するにはどうすればいいの?
PHPのreset、end関数みたいなのがあればいいんだけど。
0925nobodyさん2014/07/12(土) 20:05:27.81ID:???
>>911
ワロタ
0926nobodyさん2014/07/12(土) 20:43:33.58ID:???
>>924
お前、PHPじゃなくて何使ってんだよ
0927nobodyさん2014/07/12(土) 22:24:38.62ID:???
fizz buzzを勉強しろ
0928nobodyさん2014/07/13(日) 11:06:34.73ID:???
gitの話題で気になったが

本番環境でgit pullとかしてる奴いるの?
0929nobodyさん2014/07/13(日) 11:27:40.80ID:???
そりゃいるだろ
スレチだが
0930nobodyさん2014/07/13(日) 11:41:21.79ID:???
>>928
趣味では楽だからやってる
仕事では一切やらない
ファイルシステムとしての安全性が担保されてないはず
0931nobodyさん2014/07/13(日) 14:06:39.50ID:???
つまり、みんなはテスト環境・本番環境と2つ用意してるの?
ローカルでも用意している人もいるだろうし、場合によっては3つ?
0932nobodyさん2014/07/13(日) 14:34:23.28ID:???
開発環境
テスト環境
本番環境

エンプラだと、ミドルが面倒(特にライセンス)だから、開発環境を多人数で共用することが多いけど、
Web系は、そういう制限が少ないから、個人個人がローカルに開発環境作るのが当たり前なんじゃね?
0933nobodyさん2014/07/13(日) 15:38:00.75ID:???
>>931
俺の場合はプロジェクトの規模によって違うな
0934nobodyさん2014/07/13(日) 15:40:00.87ID:???
そういう場合はテスト環境はステージング環境と言うところもあるね
最近は開発PCのスペックも十分でローカルにVM立ててやることも多いね
0935nobodyさん2014/07/13(日) 17:11:27.37ID:???
ローカル→xampp
テスト環境→自分で契約しているサーバ
本番環境→クライアントが契約しているサーバ
0936nobodyさん2014/07/14(月) 19:33:26.67ID:???
SOHOでもやってるのか?
0937nobodyさん2014/07/15(火) 13:33:30.91ID:???
Paginator->optionsの設定で質問です。
URLが
http://example.com/posts/:category_id/?type=1&;area=2
だとして、Paginator->optionsを以下のように指定しました。
(:category_idはルーティング済みだとお考えください)

$this->Paginator->options(array('url' => array('controller' => 'posts', 'action' => 'index', 'category_id' => $category_id), 'convertKeys' => array('type', 'area')));

しかし、$this->Paginator->next()を表示した時のURLが
http://example.com/posts/:category_id/page:2
となっており、URLパラメータのtypeとareaが付いていません。

設定がおかしいのでしょうか?ご存知の方は教えてください。
Cake2.4.10を使用しています。
0938nobodyさん2014/07/15(火) 20:02:08.57ID:???
URL に page:2 がついているところを見ると、paramType を querystring にはしていないように思える。
convertKeys は paramType がデフォルトの named の時には何もしないよ。
つまり >>937 が想像している機能じゃない。
こうしたら動くのでは?

$this->Paginator->options(array('url' => array('controller' => 'posts', 'action' => 'index', 'category_id' => $category_id, '?' => $this->request->query)));
0939nobodyさん2014/07/15(火) 20:05:19.07ID:???
>>938
ありがとうございます!この方法で動きました
0940nobodyさん2014/07/15(火) 20:11:55.43ID:???
どういたしまして
0941nobodyさん2014/07/16(水) 01:11:04.31ID:???
HTMLヘルパーに関して教えて下さい。
以下のようにaタグ内にspanが2つ入ったHTMLを出力するには
HTMLヘルパーをどう書けば良いのでしょうか?

<a href ="http://hoge/controller/action/";>
<span class="fuga">ABC</span>
<span class="piyo">XYZ</span>
</a>

HTMLのままビューに書くのは無しの方向でお願いします。
0942nobodyさん2014/07/16(水) 01:38:20.50ID:???
第3パラメータ $options = array('escape' => false);
0943nobodyさん2014/07/16(水) 01:43:34.95ID:???
<?php
echo $this->Html->link(
$this->Html->tag('span', 'ABC', array('class' => 'fuga')) . PHP_EOL . $this->Html->tag('span', 'XYZ', array('class' => 'piyo'));
array('controller' => 'controller', 'action' => 'action', 'full_base' => true),
array('escape' => false)
);
?>

試してないけどこんな感じか

spanみたいな属性が環境に依存しないタグを複数入れ子にしてまでヘルパーに固執する意味があまりわからん
Well-Formattedなマークアップを確実に出力するメリットよりもHTMLの見通しが悪くなるデメリットが勝るように思える
このHTMLならURLの出力さえヘルパーに面倒見てもらえれば充分じゃね?
0944nobodyさん2014/07/16(水) 01:52:30.97ID:???
そうだな。aタグのhrefを<?php echo Router::url('/controller/action');?>
ってな感じにするだけで良いと思う。
0945nobodyさん2014/07/16(水) 02:18:18.31ID:???
>>942-944
どうも有り難うございます。
943さんの記述でいけました。
仰る通りここまで記述が長くなると
ヘルパーでの対応はやめた方が良さそうですね。
大変勉強になりました。
0946nobodyさん2014/07/16(水) 02:36:58.58ID:???
PHP 5.4でarray()の糖衣構文が使えればヘルパーまみれでも少しは読みやすくなるんじゃないかな

あとは<?php ?>と$thisとechoを一々書かなくて済むと最高なんだが
0947nobodyさん2014/07/16(水) 02:41:15.08ID:???
echo はshort_open_tagのONでいけるけど$thisは難しいな
0948nobodyさん2014/07/16(水) 02:52:19.44ID:???
その条件をほぼ満たしてるTwigのプラグインなら見かけたことあるけど使ったことはない

https://github.com/WyriHaximus/TwigView
0949nobodyさん2014/07/16(水) 06:10:15.29ID:???
5.4 からは short_open_tag の設定に関わらず echo の短縮構文は常に有効。
$this はヘルパーを変数に入れ直せばほぼ消える。
0950nobodyさん2014/07/16(水) 08:31:58.76ID:???
HTMLヘルパーなんて使ったことないな。
何故わざわざ独特の書き方をして自分やHTMLコーダーに不便な思いを強いなくてはならないのか。
0951nobodyさん2014/07/16(水) 20:50:59.63ID:???
新手の質問だよなそれw
素直に聞けば良いものを。。。
0952nobodyさん2014/07/17(木) 01:55:57.38ID:4qeUm9n8
>>917
安心しました。外をあまり知らないのでイレギュラーな開発スタイルかと思ってましたw


>>918
本番でNGにならない様に開発環境でおもいっきりテストしています。
もしバグがあった場合には、開発環境で開発&修正をして再び本番環境にスクリプトを展開する様にしています。


>>935
xamp バグが多過ぎない?
0953nobodyさん2014/07/17(木) 12:22:59.07ID:???
>>952
Cakeで開発する点においては、バグは感じないよ。
ただし、古いxamppのバージョンなら動作が糞重くなる
0954nobodyさん2014/07/17(木) 13:12:27.85ID:???
xamppのバグで困ったことはないが
Windows用のAPCやmemcachedがうまく動かず困ったことはある
バージョンの相性が厳しい
0955nobodyさん2014/07/17(木) 14:51:38.30ID:???
xampp ってそんなにバグあるか?
0956nobodyさん2014/07/17(木) 20:48:19.93ID:???
xampp俺も好きじゃないな。
linux環境と少し違うから環境整えるのに一苦労。
0957nobodyさん2014/07/17(木) 23:21:39.62ID:???
個別に入れた方が後々いいしね。
どのみち、設定ファイルは触らないとダメなんだし。
0958nobodyさん2014/07/17(木) 23:23:50.62ID:???
シェルスクリプトとかcronとか動かねーしな。
もはやExcel開くときしかメリットを感じない。
0959nobodyさん2014/07/22(火) 11:17:54.78ID:???
新しいの来たね。またここの住人さんの指摘かな。感謝感謝。
0960nobodyさん2014/07/22(火) 23:52:59.82ID:???
どういたしまして
0961nobodyさん2014/07/25(金) 03:13:26.91ID:ZnC0S1uF
cakePHPを使って事前にSQLを実行して作成済みの
ビューを実行するにはどういうコードを書けば良いでしょうか?

例)

hoge_view as (
select test_name , test_id as hoge_table );


この事前作成済みの hoge_view をcakePHP経由で呼び出したいです。


>>955
多過ぎて地道にmysql / php とかインストールしてますよ。
0962nobodyさん2014/07/25(金) 03:55:22.05ID:???
>>961
Model::query()
0963nobodyさん2014/07/25(金) 10:12:13.66ID:???
ビューのModel作りゃいいだろ
0964nobodyさん2014/07/25(金) 11:13:14.28ID:???
それすらわからず、xamppをdisるわけか・・・
0965nobodyさん2014/07/25(金) 11:41:59.02ID:Q+uw5XLP
>>962

Viewのモデル作成とかもあるんですね。
0966nobodyさん2014/07/27(日) 14:03:04.17ID:akY7lnX2
Cakeのバージョン:2.3だと思います。
2点質問があります。

(1)Authコンポーネントに関して
既存システムで「hoge_users」テーブルに対してauth認証を通す処理があります。
こちらに「fuga_users」テーブルに対してauth認証を通す処理を作成したいです。
ログインページは双方で別にしたいため、コントローラーも別になります。

既存処理はAppControllerでauth認証の設定をしているため、そこで分岐させれば
うまくいくのかと思ったのですがどうも上手くいきません。
上記のようなことを実現させるためには、どのような方法を取ればいいのでしょうか?

(2)webroot配下の静的ページに関して
例えばTestコントローラのresultアクションとしてあるURLの配下に

http://www.sample.com/Test/result/hoge.html

このように静的ページを配置したいと考えています。
URLも変更したくないため、極端な話 webroot/Test/result/ ディレクトリが
作成できればいいのですが、Cakeのルール?に即していないからか

http://www.sample.com/Test/result/hoge.html→表示される
http://www.sample.com/Test/result/→表示されなくなる

という状況になってしまいます。
こちらを上手く解決する方法があれば教えて頂けないでしょうか?

宜しくお願い致します。
0967nobodyさん2014/07/27(日) 15:18:41.97ID:???
composer使う場合、update時に対象外ファイルとか設定出来ませんか?
configファイルまでupdateされて困ってます。
0968nobodyさん2014/07/27(日) 18:07:31.12ID:???
>>967
saveの時に第三パラメーターで更新するカラムを指定すればいいよ
0969nobodyさん2014/07/29(火) 23:52:01.63ID:???
cakephp2.5.1をnginxの環境で試運転してるんだけど、
トップページをToppagescontrollerで運用していて、
routes.phpでRouter::connect('', array('controller' => 'Toppages', 'action' => 'index', 'home'));
とやっています。
FirefoxやIEでは正常に動作しますが、Chromeだけはなぜか
トップページが表示されず、https://github.com/cakephp/cakephp/blob/17ae40f0ce616edbbaa4f9b2381988f508b7cbfd/lib/Cake/Console/Templates/skel/webroot/index.php
と同じ内容の生PHPファイルがダウンロードされます。

誰か解決方法分かる人いますか?
0970nobodyさん2014/07/30(水) 00:39:00.62ID:???
リダイレクトキャッシュが働いてるだけじゃねぇ?
別環境の Chrome はどうなん?
09719692014/07/30(水) 20:23:16.04ID:???
>>970
ありがとうございました。
リダイレクトキャッシュが働いてたみたいです。
chromeの履歴削除と、再発防止に該当コントローラーに
$this->response->cache('-1 minute', '10 minutes');
を追加しました。
0972nobodyさん2014/08/01(金) 01:47:52.34ID:IViy/2On
スレ違いかもしれませんが、JavaScriptスレが過疎っているのでここで質問させてください。

textareaの中が次の様な値が入っているとします。

AAA{改行}
BBB{改行}
CCC{改行}
{改行}

↓ となっているのを、末尾の改行だけを削除する

AAA{改行}
BBB{改行}
CCC{改行}

にはどういうコードを記述すれば良いでしょうか?
0973nobodyさん2014/08/01(金) 02:11:43.96ID:???
CakePHP関係あるの?
PHPの質問なのかJavaScriptの質問なのかすらわからない。
それはそれとして考え方としては、文字列の最後に改行コードが2つ連続してるか
どうかを判定して、それが真なら文字列末尾を削ればいいんじゃない?
レス数が950を超えています。1000を超えると書き込みができなくなります。