とある案件で大きめファイルのアップロードを実装しました。
手元の開発環境(Windows+XAMPP)では問題なく150MB越えのファイルをアップロードできたのに、検証環境ではエラーになるますがとのご連絡。
試してみたところ、以下のメッセージが確認できました。

Request Entity Too Large
The requested resource
/xxxxx/xxxxx/xxxxx/xxxxx
does not allow request data with POST requests, or the amount of data provided in the request exceeds the capacity limit.

Google先生に訊いたり、Webサーバのエラーログを確認したところApacheのModSecurityで128MBの制限が掛かっているようでした。
レンタルサーバではいかんともしがたい(と思う)ので、代替策で解決の方向です。(ちなみにサーバはエックスサーバーのプランX10。)
PHPなどの設定では問題が無いはずなのにエラーになる場合にチェックする時の備忘録として。

去年から今年に掛けてCakePHP3を使ってWebシステムをいくつか作っております。
Webシステムと言えば管理画面が必要になりますね。そこで主に自分のためにCakePHP3を使った実装手順を整理してみることにしました。
なお、文中、フロント側とは一般のサイト利用者が使う側、管理側はサイトの管理者が使う側を指しています。

CakePHPはフロント側と管理画面で同じものを使う

以前、CakePHP1.3を使って同様に独自CMSなWebシステムを構築したときには、フロント側と管理側、それぞれ用にCakePHPを用意して使いました。
ルーティングがうまく使いこなかったこと(調べたり試したりする時間も無かった)、フロント側と管理側で体制が分かれていたのが理由でした。今回は、それではあんまりにも格好悪いので1つのCakePHP3でフロント側、管理側で共有しようと思います。

プレフィックスルーティングで管理側をフロント側から分離する

1.3で使いこなせなかったプレフィクスルーティングを3.0のCookBookで見てみます。なんだか以前よりスッキリしている気がします。config/routes.phpに以下を追加すると/adminでアクセス出来るようになって、src/Controllers/Admin 以下のコントローラが呼び出されるらしい。そしてテンプレートはsrc/Template/Admin/に用意すればいいと書いてあります。

Router::prefix('admin', function ($routes) {
$routes->fallbacks('DashedRoute');
});

この記述だけを追記した状態で /admin/Admin/ にアクセスしようとすると、Missing Controllerのエラーが表示されます。(Adminテーブルを管理するイメージ)

Controller/Adminの下にAdminController.php を作ってAdminControllerクラスを定義せよとのことです。
bakeでさくっとコントローラを作成します。(Windows環境なので \ がディレクトリを指しています。)

※アプリケーションのディレクトリで実行
bin\cake bake controller --prefix admin admin

気をつけるのは –prefix admin を付けること。これでController/Admin以下にファイルが作られます。この状態でアクセスすると、エラーの内容がadminテーブルが無いに変わりました。

そりゃ当たり前だ。まだ作ってないんだから。

今回はここまで。次回は管理者の管理用のadminテーブルを追加して、編集画面を作っていきたいと思います。

CakePHP3の構造になれるためにサンプルコードを増やしています。

カレンダーがサイトにあるといろいろ重宝しそうですよね。もちろん、こういったものは先人が用意してくれているはずですので調べてみます。
すると、FullCalendar というJavascriptで出来たカレンダーをCakePHP3に組み込むプラグイン「CakePHP-Full-Calendar-Plugin」が見つかったので、そちらをを使わせてもらうことにしました。プラグインはこちらから入手できます。(CakePHP2用と間違えないように。)

READMEに「INSTALLED IN 6 SIMPLE STEPS」と書いてありますが、プラグインをロードするときにプラグインのroutes.php を読み込むよう指定しているので、実際は5ステップ目はいらないと思われます。さくっとインストールして指示の通り event_typeを登録してからeventを登録しますが、、、表示されない!

Chromeのデベロッパーツールなんかを見ながらソースを追ってみると、EventsControllerのfeedメソッドでJSON形式のデータを返すべきところで配列(というかArray()っていう素っ気ないアレ)が返されてしまっているっぽい。こういう時はGoogle先生に訊くか本家サイトでドキュメントをを見るべし、ということで見てみたら、CakePHPでJSONを扱うにはRequestHandlerをロードせよ、とのことだったのでAppControllerに追記。おー、表示された。あれ?終日の予定の表示がヘン、、、。

再びプラグインのソース追っかけてみたところ、同じくEventsControllerのfeedメソッドで終日の予定を判定する時に比較を「===」で行っているところで判定できていないっぽい。「==」に修正したら正しく表示されました(^_^)v。こんな修正でよかったかはあとできちんと調べよう。

 

CakePHPでPDFを出力するのにCakePDFというプラグインがいいらしいので試してみました。(近々使う予定あり)
CakePHP , CakdPDF
CakePHP2ではするっといったけど、CakePHP3で苦戦したのでメモ。
CakePHP2ではチュートリアル通りに設定して無事動作。うーん、これは便利。
(PDFの元がHTMLなので、デザイナさんとの協業にもよさそう。)

ところが、です。
CakePHP3では、サイトの通りにやってみてもいかんとも動かない、、。
なぜだー。そもそも、プラグインが動作している気配すらないぞー。

よくよく読んだら、ルーティングの設定はなるべく早くせよ的な記述がある!
すなわち、routes.php の24行目に以下を追加。無事動いた。やったー。

Router::extensions([‘pdf’]);

それにしても、まさかこの時代にファイルへの記述場所による読み込みタイミングの違いで動かないことがあるとは思わなかった。

あるお仕事でCakePHP(1.3)を使い倒しているのですが、そこで調べた結果を少しメモ。

ブラウザを終了したときにセッションを破棄したい場合には、app/config/core.php の以下の部分を修正。
201行目あたりです。

修正前 : Configure::write('Security.level', 'medium');
 ↓
修正後 : Configure::write('Security.level', 'high');
他にも色々あったので、後でまとめようかな。