#環境
・Windows
・xampp
・Apache
・PHP7
・Cakephp3.9
#ディレクトリ
以下のようなディレクトリ構造です。
ドキュメントルート以下に複数のディレクトリがあり、それぞれにindex.phpを配置されています。
Apacheで設定しているDocumentrootと、CakePHPのwebrootの場所が違います。
Documentroot:/mysite/public_html
CakePHPのwebroot:/mysite/public_html/contact
CakePHPのwebroot:/mysite/public_html/mypage
CakePHPのソース:/mysite/src
/mysite ∟config(CakePHP) ∟src(CakePHP) ∟Controller ∟ContactsController.php ∟MypagesController.php ∟vendor(CakePHP) ∟public_html ∟contact ∟index.php ∟.htaccess ∟mypage ∟index.php ∟.htaccess
#起こっていること
http://example.com/contact/index
にアクセスした場合にMissing Controllerになります。
Error: Create the class IndexController below in file: src\Controller\IndexController.php
ContactsControllerではなく、URLで言うアクション部分がコントローラーと認識されてしまっています。
http://example.com/contact/contact/index
にアクセスした場合は正常にページが表示されます。
Apacheで設定しているDocumentrootと、CakePHPのwebrootの場所が違うのが原因だと思っています。
ルーティングは以下に設定されています。
php
1$routes->connect('/contact', ['controller' => 'contacts', 'action' => 'index']); 2$routes->connect('/contact/:action', ['controller' => 'contact']);
CakePHP2のときは、index.phpで以下のようにしていました。
・CakeRequestクラスに$_SERVER['REQUEST_URI']
を渡してインスタンスを作成し、
・それをDispatcher::dispatchメソッドに渡す
php
1// CakePHP2.xのindex.php 2App::uses('Dispatcher', 'Routing'); 3 4$Dispatcher = new Dispatcher(); 5$Dispatcher->dispatch( 6 new CakeRequest($_SERVER['REQUEST_URI']), 7 new CakeResponse() 8);
CakePHP3になり、上記部分の仕様が変わってどのように指定すればよいか分かりません。
Serverクラスを見て、何かしらのrequestを渡しているのは分かるのですが・・・
php
1// CakePHP3.xのindex.php 2$server->emit($server->run()); 3 4//********************************************************** 5 6// Serverクラスでは以下が渡されている 7$request = $request ?: ServerRequestFactory::fromGlobals();
もし、分かる方がいらっしゃいましたら、ご教授頂けると幸いです。
よろしくお願い致します。
#【追記】
修正依頼をいただきましたので、以下補足を追記いたします。
##何のためにContactsとMypageでwebrootを分けているのか?
これは静的ページとCakePHPのページを混在させているためです。
/mysite/public_html/以下
にCakePHP以外の静的ページを公開しており、そことディレクトリ構造を合わせています。
CakePHP以外の静的ページを表示するため、ドキュメントルートが/mysite/public_html/
になっています。
下記のツリーで言うと、★で追加したgalleryやdownloadのように、CakePHPではないディレクトリがあります。
さらに、mypageの下にさらに別のwebrootがあるパターンも存在します。
とはいえ、この構造を作ったのが私自身ではないため、その真意は私も理解しきれていません。申し訳ありません。
mysite/ ∟config/ ∟src/ ∟Controller/ ∟ContactsController.php ∟MypagesController.php ∟vendor/ ∟public_html/ ∟contact/(CakePHPのwebroot) ∟index.php ∟.htaccess ∟mypage/(CakePHPのwebroot) ∟index.php ∟.htaccess ∟setting/(★さらに深い階層のwebroot) ∟index.php ∟.htaccess ∟gallery/(★静的ページ) ∟about.html ∟list.html ∟download/(★静的ページ) ∟index.html
補足ファイル
各index.phpでWWW_ROOT
を定義しています。
php
1// /mysite/public_html/contact/index.php 2if (!defined('DS')) { 3 define('DS', DIRECTORY_SEPARATOR); 4} 5define('WWW_ROOT', __DIR__ . DS); 6 7// 以下はデフォルトの記述 8// Bind your application to the server. 9$server = new Server(new Application(dirname(dirname(__DIR__)) . '/config')); 10 11// Run the request/response through the application and emit the response. 12$server->emit($server->run());
index.phpでWWW_ROOT
を定義しているので、paths.php
は以下のようにしています。
php
1// /mysite/config/paths.php 2if (!defined('WWW_ROOT')) { 3 define('WWW_ROOT', ROOT . DS . 'webroot' . DS); 4}
app.php
についてはデフォルトのままです。
'webroot' => 'webroot'
←がそのままなのでそこがだめなのでしょうか・・・
⇒試しに'webroot' => 'contact'
にしてみたところ、/contact/indexでアクセスできました。
(ここに各webrootの値をどう設定するかはまだ分かっていません。)
以下、app.php
php
1// /mysite/config/app.php 2'App' => [ 3 'namespace' => 'App', 4 'encoding' => env('APP_ENCODING', 'UTF-8'), 5 'defaultLocale' => env('APP_DEFAULT_LOCALE', 'en_US'), 6 'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'UTC'), 7 'base' => false, 8 'dir' => 'src', 9 'webroot' => 'webroot', 10 'wwwRoot' => WWW_ROOT, 11 //'baseUrl' => env('SCRIPT_NAME'), 12 'fullBaseUrl' => false, 13 'imageBaseUrl' => 'img/', 14 'cssBaseUrl' => 'css/', 15 'jsBaseUrl' => 'js/', 16 'paths' => [ 17 'plugins' => [ROOT . DS . 'plugins' . DS], 18 'templates' => [APP . 'Template' . DS], 19 'locales' => [APP . 'Locale' . DS], 20 ], 21], 22 23
回答1件
あなたの回答
tips
プレビュー