

フロントサイトと管理サイトがありControllerディレクトリを分けておきたいのですが、  
URLと実行するコントローラのマッピングを下記のようにしたいところ上手くいきません。  
どのように解決できるでしょうか。

フロントサイトのディレクトリは「front」、管理サイトのディレクトリは「admin」の場合

ttp://example.com/ → controllers/front/Welcome  
ttp://example.com/regist/ → controllers/front/Regist  
ttp://example.com/admin/ → controllers/admin/Welcome  
ttp://example.com/admin/members/ → controllers/admin/Members

routes.phpは下記のように定義していますが、「ttp://example.com/」でアクセスされた場合にControllerクラス部分がからになってしまい解決できません。

[code]

    $route['default_controller'] = 'front/welcome';
    $route['admin/(:any)'] = 'admin/$1';
    $route['admin'] = "admin/welcome";
    $route['(:any)'] = "front/$1";
    
[/code]

CI_VERSIONは3.0.3です。

アドバイス頂けると幸いです。


CC BY-SA 3.0
2015-12-23T14:24:48.817
20317
2016-04-21T18:40:40.443
2015-12-23T15:59:22.947
8000
13779
question
php codeigniter
サブディレクトリに配置したコントローラーをdefault_controllerにしたい


`$route['default_controller']` に指定できるのは `controller` か `controller/method`
だけなので、ディレクトリ名を含めることはできません。CodeIgniter 2.x ではこれができてしまっていたのですが、これは意図しなかった挙動とのことで
3.0 から廃止されました。

> サブフォルダには、サブフォルダだけを指定した URL のときに呼び出される、 デフォルトコントローラをそれぞれ置くことができます。
> デフォルトコントローラの名前は、application/config/routes.php ファイルで指定した名前です。  
>  \--- 2.x のドキュメント
> <http://codeigniter.jp/user_guide_ja/general/controllers.html#subfolders>
> より引用

つまり、`$route['default_controller'] = "welcome";` としておくことで
`http://example.com/front/` を `front/Welcome.php` にルーティングできる、というのが正しい挙動になります。

ではルート定義を書けばいいのかというと、現在のルーティング処理では、 `/` へのアクセスに関しては `default_controller`
以外のルート定義を参照していません。そのため `/ -> front/welcome` といったルーティングを行うには、`CI_Router`
クラスに手を加える必要が出てきます。

で、この件について現在のメンテナである Andrey Andreev 氏がこんなコメントを残しています。

> You're looking at controller directories the wrong way - they are not just
> tools to organize your code, a request's path is supposed to match a real
> file path.  
>  If you consider a route to be a "redirect", it might make sense to
> "redirect" a user's request, but it doesn't make sense to redirect in your
> index page.  
>  \--- <https://github.com/bcit-
> ci/CodeIgniter/issues/2849#issuecomment-37272429> より引用

今回の場合、URLに合わせたディレクトリ構造にすると以下のようになるでしょうか。

  * controller/Welcome.php
  * controller/Regist.php
  * controller/admin/Welcome.php
  * controller/admin/Members.php

これなら `routes.php` は簡単です。

[code]

    // 各ディレクトリに適用される： /->/welcome, /admin->/admin/welcome
    $route['default_controller'] = 'welcome';
    
    // $route['admin/(:any)']  = 'admin/$1'; も不要
    
[/code]


CC BY-SA 3.0
2015-12-23T15:57:13.257
20319
2015-12-23T15:57:13.257
8000
20317
answer