勉強の一環としてcakePHP5をインストールして簡単なデータシステムを構築していたときのこと
あるテーブルにデータを入力するフォームページを構築し、フォームからDBに情報が登録完了すると一覧ページに戻るという流れの動きまでは確認できた。
次にそのデータの詳細を閲覧し、再度一覧ページに移動しようとリンクをクリックするとコントローラーエラーが表示された。
さっき登録したら一覧表示のページに遷移したんだけど・・・
そこでURLを確認すると、なぜか「webroot」という文字が勝手についかされていた。
例えばexamplesというテーブルを用意するとする。
そして、これらはドメインの後に以下のようなURLでデータの一覧、詳細、登録のページが表示される。
ドメイン/examples/index → 一覧
ドメイン/examples/view → 詳細
ドメイン/examples/add → 登録
問題が起きるのは詳細、登録の画面から一覧ページに戻るリンクから移動するとき。
http://ドメイン/examples/add
↓
一覧ページのリンクをクリック
↓
http://ドメイン/webroot/examples/add
↓
エラー
しかし、ブラウザのURL枠に直接同じURLを入力すると普通に一覧が表示された。
そこでまず検証として二つ、リンクのURL生成のヘルパーを編集、ルーティングの編集を行ってみた。
デフォルトでは一覧に戻るリンクは以下のようになっているのでControllerをつけてみた
<?= $this->Html->link(__('List Examples'), ['action' => 'index']) ?>
↓
<?= $this->Html->link(__('List Types'), ['controller'=> 'exmaples', 'action' => 'index']) ?>
しかし、リンクにカーソルを重ねたときにブラウザ下部に表示するURL表記は変わらず、移動するときもコントローラーエラーが表示された。
次にroutes.phpで以下のように指定のコントローラーのURLだった場合の設定をしてみた
$builder->connect('/examples/', ['controller' => 'Examples', 'action' => 'index']);
結果は変わらずだった。
悩んでいるときにちょっとした思い付きがあった。
これはローカル環境でサブディレクトリ型でやっているからダメなのかな?
実際xamppにいれて開発していたため、何か問題が起きているのかもしれない。
そこで、cakePHPに入っている簡易サーバーを起動させてみることにした。
bin/cake server
そして以下のURLで確認
http://localhost:8765/
そうすると、なんと一覧表示ページ遷移できた!
これは環境の問題か?
そういえば、開発環境はサブディレクトリ型で開発をしていた。
それならもしかすると、サブディレクトリの問題か?
よくサブディレクトリ名をみると、以下の名前をつけていた。
xampp\htdocs\example\cakePHPファイル群
もしかしてサブディレクトリ名が似ているからか?
そこで一度cakePHPを削除し、ディレクトリ名変更してインストールしなおしてみた。
xampp\htdocs\proto\cakePHPファイル群
テーブルは削除してなかったのでそのまま利用し、テンプレートファイルを生成してブラウザ表示してみると一応確認はできた。
その後、詳細ページ、登録ページから一覧ページへ移動するリンクをクリックするとコントローラーエラーは起きなかった。
これはディレクトリやパスやURLがややこしくしてしまったのが原因という勝手に認識した。(合っているかは分からない)
つまり以下のようなことで問題だったのかなと。
http://localhost/example/examples/index ← サブディレクトリ名「example」がコントローラー名と重なり問題
http://localhost/proto/examples/index ← サブディレクトリ名変更してエラーなし
開発環境はディレクトリ名にも気を付けよう