【PHP】フレームワーク CakePHP 19ホール目【v3.3】 [無断転載禁止]©2ch.net
>>213はまったく適切じゃないアドバイスだな。
Gitは最初から使った方がいい。何より便利。使わないと無駄に不便で学習効率も落ちるぞ。
GUIのアプリがあるからコマンド覚えなくても良い。
1人で使うなら全く難しいことはない。初心者こそ使うべき。
SVNでもいいが今はGitのほうが多そうだからGitでいい。 3.5.3で質問です。
3.5.3で「Directories created by FileCache are more atomic.」ということでCacheに手が入りました。
で、ここが原因でエラーが発生するようになってしましました。
@がついているので続行可能なエラーは無視されてよいものですが、下記のようなエラーが発生しています。
@がついてもエラーが拾われてしまうような要因とかあるのでしょうか?
該当ソース
/vendor/cakephp/cakephp/src/Cache/Engine/FileEngine.php(387)
Log::error($dir);//追加
sleep(5);//追加
@mkdir($dir, 0775, true);
出力されたログ
2017-09-28 01:26:17 Error: /var/www/html/****/tmp/cache/persistent/
2017-09-28 01:26:22 Error: /var/www/html/****/tmp/cache/persistent/
2017-09-28 01:26:27 Error: /var/www/html/****/tmp/cache/persistent/
2017-09-28 01:26:32 Error: [Cake\Core\Exception\Exception] mkdir(): File exists Cakeで気に入らないのは、毎回後方互換性を捨てるに値するほどのメリットを感じられない所
Cakeに限らないかもだが、気軽に判断していいことじゃないっつーの >>216
ならアプデしなけりゃいいんじゃね?
更新内容は毎回リストアップされてるし、それについていけないとなると開発者としての実力を疑うね 実力の問題なわけじゃ普通ないだろ…
お前みたいに無限に暇な人間は少ないぞ >>219
実力の問題だよ
プログラマの場合は実力が有れば有るほど時短に繋がるから
出来る人はすぐに理解してすぐに手を動かしてさっさとやっちゃうよ 手直しが早かろうが、コードを弄ったら単体テストをしなきゃならんのだが
面倒じゃないか?
自動化済みのオシャレ環境だったらごめん >>220
だめだこりゃ
実力がある人は他にいくらでもやる仕事があるっつーの 政治的な問題でやらない、予算的な問題でやらない、理由はたくさんありますがな。 >>214
gitがダメとか言ってる訳じゃねーぞ
便利だから普通に使いまくってる
GUIが揃ってるからー、みんなが使ってるからー、とかじゃなくて
平行開発したりマイルストーン立てたり説明書きつけたりと、使い勝手が良いから使うんだよ
ダイエットメソッドみたいな流行りモン扱いとか呆れるわ
gitの便利な機能を学習する期間、Cake3の学習はお留守になる、だからまだ早いって書かなきゃいかんのかねぇ
Cake3独学で、実践に似た構成ないですか?、と訊いてる人に、
技術文書を多人数で摺り合わせるツールとしても使えるほど多機能なgitを勧めるとか、混乱させるだけだよ >>216
ver.5.5以降からphp本体も、後方互換は捨てていってるしな
後方互換が大事なら、Struts2とかJ2EEとかで作り直せばいいんじゃね?
まあ、Cake3内のマイナーアップデートで、この記法は推奨されなくなります宣言は勘弁してほしいが スレどころかこの板史上ではじめて
育ちの良さや人格を賞賛された>>210を見習え。 >>226
webprogでFWの3つや4つ、使い分けられないヤツは不適合者だわ
フルスクラッチ()で独自仕様のアンケートフォームでも作ってろ 1人でオープンソースのFWを超えるのが作れる超天才でもない限り
オレオレで作れるもんしか作ってない時点で無能 >>215
まだいるかな?
最後の行、「もう同じ名前のディレクトリがあるよ。例外:レベルはErrorだよ」と書いてある。
でも、@mkdir()だから、通常はこの例外が拾われないように抑止されている。
で、Log:error()の記述式は、例外レベルが[Error]のものを全部書き出す
ものなので、この場合だと@が抑制している[レベル:Error]の例外を問答無用で書き出してる。
つまり、ログに出力されたエラーは「拾われてしまっている」のではなく、
「@をつけて拾われないように工夫されているものを無理やり拾っている」状態。
だから「この部分が原因で不具合が出ている」と決めるのはちょいと難しい。 >>233
ありがとうございます。
ヒントいただき、無事解決しました。
原因は独自のエラーハンドラの設定でした。
独自エラーハンドラの中で、エラー制御演算子起因のエラーは無視するように
本来は書かなければならなかったのですが、見事に漏れてました。 なぜ3.5.3まで気づかなかったかと言えば、そもそもフレームワーク中でこのエラー制御演算子があまり使われていなかったから。
3.5.3でキャッシュ作成で使われるようになったので、処理の最初でエラーになって初めて気づいたのでした。
ところでこのエラー制御演算子、コストが非常に高いとどこかで読みました。
そんなコストの高い処理が毎回冒頭で行われるというのは、そもそも良いものなんでしょうかね?
厳密にベンチマークを計ったわけでないので強くは言えませんが。 >>235
解決オメ
できだけtry-catchとかで書くはずだけど、
catchブロックで捕捉できなかった例外をfinalyで捕るのはPHP5.5以降
じゃないと出来ないからでは?
/vendor/cakephp/cakephp/src/Cache/Engine/FileEngine.phpの
384行の前後を挟むように「//@codingStandardsIgnoreStart」って
言い訳じみたコメントが書いてある
だったらset_exception_handler()書けば? てな考え方もあるけど、これまたPHP7.xから挙動が変わる
で、ここからは、中の人はこう考えたんじゃねーの? な感じの、
[風が吹かなきゃ桶屋は損する]風味の邪推
---邪推ここから--
RedHat7.xで延長サポート対象になるのはPHP5.4ということなので、CentOs7.xもこれに準拠する
で、5.5と5.6はもうすぐPHP本家のメンテがなくなる
そして、作成済みか今から作成するスクリプトを最小限のメンテで
運用したい人々はPHP5.4を選ぶだろう
だったら、PHP5.4に合わせてエラー制御演算子でしばらく様子を見よう
--邪推ここまで--
もしこれがあたってるなら、数ヶ月はこのままだろうね >>209
使えなくなるクラスが多過ぎて規模によってはほぼ無理レベルなんだよなぁ
どっちかというとPHP7のせいなんだけど 大抵予算的にムリだよね
1人日とかで終わるレベルじゃないからな >>237
クラスを上手く活用出来てるブツほどそうなるな
Javaもいろいろ変化してきたけど、カール・ルイスがウサイン・ボルトに
交代した程度の変わり具合
こっちは映画俳優のロナルド・レーガンが大統領スッ飛ばして空母ロナルド・レーガンになったぐらい驚いたわ >>240
String関連は全部使えなくなった気がする
アップデート必要になったプロジェクトは組み直したから正直覚えてないけど cake2→3って互換性切り捨てっていうかPHPの切り捨てがほとんど悪いんだよなぁ せめてちょっと直せば動く程度だったら良かったんだけどなあ cakephp3で質問です。
UrlHelperのbuildで、与えられた配列パラメータからurl文字列に変換できますが、
逆にurl文字列から配列パラメータに変換することはできますか? >>254
そう言われるとますます貼りたくなる
言われなくても貼るけど >>254
CakePHPのスレだぞ?
バカなの? >>252
例えばURLが
https://www.sample.com/app_name/plugin/controller/action/param1/param2?query=AAA
なんて場合、parse_urlを使うと、pathとして
/app_name/plugin/controller/action/param1/param2
が返ってきます。このpathの部分をさらに細かく取得したいのです(特にparam1、param2の部分を取得したい)。
pathをスラッシュで分割して、アプリのディレクトリ部分とplugin〜action部分を除けばいいといえばその通りなのですが、
なるべく簡単に済ませたいなあと。 FormHelperでチェックボックスを作ると配列になる
それをPOSTしたら、entityではチェックボックスの配列は空になる
なんでよ? >>261
2からの移行?新規?
bakeされるソースとの違いは? WEB系くわしい人に質問です。
アメリカの海外サーバで、1処理内ででメール送信プログラムをPHPで書きました。
Aにメール送信
↓
Bにメール送信
この時A宛のメールはすぐに届くのですが、
Bに送ったメールは毎度5〜10分経ってから届きます。
これって一体何が原因として考えられますか? >>261
まだ見てるかな?
debug($this->request->daea);
をController内に書いてから、チェック入れてPOSTして確認した?
チェックボックスではチェックが入ってなかったら無かったことに
されることもあるよ >>273
あああ、typoしてる
debug($this->request->data);
です おめーらには無理無理っすー
俺とちがってYou達ばかっしょ??? 3では、modelでVirtual fieldにSQL文が使えなくなったのが痛いねえ Cake2.xです
アソシエーションについて質問です
テーブルAに対してテーブルBがhasManyの関係で複数連結されている状態なんですが、
その時Bがヌルでない行のみ取得したいのですが
どのような条件で取得すればいいでしょうか?
Cake始めたばかりなので初歩的な質問で申し訳ありませんがどなたか教えてください >>277
cakephp2 inner join でググれ
あと、sqlかER図か、どっちかは知っとけ
少しは捗るから >>277
left join right join 共通クラスの追加方法について教えて下さい
普通の共通クラスはController/Componentsに追加すれば良さそうですが
こちらではComponentクラスを継承しなくてはいけないようなので
ちょっと都合が悪いです。
自由に別クラスが継承できて共通クラスを追加する方法を教えて下さい
バージョンはcake2です >>281
Compornentクラス継承が都合悪いなら、プラグインの自作だな
俺は解説出来ないけど、「cakephp2 プラグイン 作り方」で検索したら
日本語、かつソースコード付きのわかりやすい解説が山ほど出てくるから
適当に読んでコツコツ作ってみると良い いちいち貼るなよウザイ
その情報が必要な人は、ここ見なくても知るから大丈夫だよ >>284
いつもご苦労様です。すごく役に立ってます。これからもよろしくお願いします。 >>273
さらに今更だけど、modelが配列からオブジェクトになったから、formで
postされたmultipleなchekboxの中身がそのままmodelに渡すと空になる
ということでは? >>290
あー、確かに
今みたら、俺のコードだと配列に落としてむりくり表示してるわ
そーゆうやっつけ仕事はほめられたもんじゃないな
もっと便利の良い方法があるかもしれんね
ちとドキュメント読み直してみるか... あ、表示は[戻る]リンクの時ね
Modelにも配列でむりくり渡してるから同じ
事だけど 以下のような内容のデータをfind関数で取得したいんですが
どのように書けばいいですか?(直接SQLを実行する方式ではなく
クエリビルダで取る方法を教えてください)
select * from (
select * from TableA
)
※クエリ自体は無駄な部分を排除してシンプルにしているのでこのようになっております
実際に使用するときはこちらの形を応用して使用する予定です cake2で、PHP7.1.12の環境でI18n絡みのエラーが出る人います?
サーバ起動後、初回のアクセスでのみ発生するというわけのわからない状況、
うちだけでしょうか? もしも発生したら、opcache無効にしてみてください。 https://mallento.com
こういうの作るのにどんくらい時間かかるんや >>293
サブクエリー内外で カラムが「*」の上、WHEREもJOINも無い
エスパー推測で以下のよーなSQLを使いたい、と勝手に解釈する
SELECT col1,col2 FROM
(SELECT col1,col2,col3 FROM TableA WHERE col1=5);
これと似た構造をCakePHP3のクエリビルダで書けるには書けるが、
「遅延実行」という仕組みがある為、生成されるSQLは大体こうなる
SELECT col1,col2 FROM TableA WHERE col1=5;
あと、MySQLとMariaDBでは1回のSQLで使えるインデックスは1つだから
サブクエリーを多用すると遅くなる
メンテナンス性が高まる、とかいうメリットを考えてるかもしれんが、
速度を改善したくなったり、見やすいコードを書きたくなったりする時期が来た頃には手遅れやぞ? >>299
クエリが変わってるんですけど・・・
あとたったこれだけのサブクエリでレスポンスが遅くなるとは思えないんですけど・・・ >>302
「遅延実行の仕組みで」って書いてあるのは無視か?
SQLが短いのは、クエリビルダ使用前と使用後の違いを目立たせるため
実務なら普通に1行で書く
$hoge=$this->TableAs->find()->select(['col1','col2'])->where(['col1'=>5]);
(TableAがTableAs になってる、とか言い出すアホはいないと信じたい)
で、2重構造にするなら思いつくだけでも3つ以上ある
1 VIEW を使う
2 Modelにサブクエリ風のfunction書く
3 ModelにbyHoge(Query,$options=[])を用意してControllerからfindbyhogeで呼ぶ
4 Cpntroller内でクエリビルダを2回使う
TableAが定義されてないのに、これ全部例示する気にはならんわ ちんぺい @chinpei215
先日の RequestHandler に起因する脆弱性の公式アナウンスがありました。また非公式ですが私の方で翻訳を行っています。
https://mbstring.com/news/potential-information-disclosure-in-application-skeleton/
14:06 - 2017年12月10日 35で指摘した本人だけど、AppControllerのbeforeRenderから
$this->set('_serialize', true);
を削除する対応よりは、
_serialize変数が宣言されていなければ
$this->set('_serialize', []);
を設定するという対応のほうが良いと思うんだが。
RequestHandlerはviewの切り替え以外でも使われるわけで、RequestHandlerを
使うなという対応よりは、使われる前提での対応のほうが適切かと思う。
というか$this->set('_serialize', true)はクソ仕様。
public function beforeRender(Event $event)
{
$return = parent::beforeRender($event);
if (!array_key_exists('_serialize', $this->viewVars) &&
in_array($this->response->type(), ['application/json', 'application/xml'])
) {
$this->set('_serialize', []);
}
return $return;
} >>304
ありがとうございます
4番ってどうやるのか教えていただけると助かります バージョン1.3です
ページネーションのメタタグ作りたいんだけど、
ページネーションヘルパーから次のページのURLを絶対パスで引数付きで取得する方法ってありませんか?
コントローラーでベタ書きして渡せば出来ないことはないんだけど、スマートな書き方ってありませんか? >>308
よりによってそれかよ
まあ、需要があるなら書くが・・・
1つめのクエリー
$hoge=$this->TableAs->find()->select(['col1','col2','col3'])->where(['col1'=>5]);
2つめのクエリー
$fuge=$hoge->select(['col1','col2']);
controller内でデータとして使うときは、
全件取得:$koge=$fuge->all();
最初の一件だけ取得:$koge=$fuge->first();
で実体化する
あとは、debug($koge);
で中身を表示・確認しながら好きなように使う
それと、 debug($fuge);でどんなクエリーが出来るてるかみたほうが良い 何だかんだでアドベントカレンダー全部埋まってるよね