質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

1回答

5104閲覧

Codeigniter3.0.1 default_controller の指定について

yanagiyanmal

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2015/10/01 05:29

Codeigniter2.X系で作成したサイトをCodeigniter3.0.1に移行したいと思っているのですが、
$route['default_controller'] を上手く扱えずに困っております。

application -controler -home -Welcome.php -Hello.php

上記のような構成になっており

$route['default_controller'] = 'home/welcome';

このようにコントローラーを指定した際に、404が表示されてしまいます。
アドレスバーに[http://www.xxx.jp/home/welcome]と直接入力すると表示されます

$route['default_controller'] = 'hello'; $route['home'] = 'home/welcome';

のように設定すると、デフォルトでHello.phpが呼び出され、
アドレスバーに[http://www.xxx.jp/home/]と入力するとWelcome.phpが呼び出されます。

どのようにすれば、サブディレクトリーのコントローラーを呼び出せるようになりますでしょうか?

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

すでに解決済みかもしれませんが、Routerコア機能の拡張によって実現する事ができます。
残念ながらデフォルトではサブディレクトリをdefault_controllerで指定する事はできません。

海外サイトですが下記が参考になります。
default controller inside subfolder codeigniter 3 not working

なお、上記のサイトではコアクラスを直接編集していますがそれは望ましくないので「application/core/」ディレクトリ内に置き換えたい機能のプログラムファイルを配置してコアクラスを拡張しましょう。

コアクラスを拡張する際には拡張したい機能をextendsする必要があります。
また、クラス名のプリフィックスに「MY_」を付けるのを忘れないでください(プリフィックスはconfigで変更可能)

今回はRouterクラスの_set_default_controller関数を拡張するので、下記のようなプログラムを「application/core/MY_Router.php」として配置します。

<?php defined('BASEPATH') OR exit('No direct script access allowed'); /** * Extending Router Class */ class MY_Router extends CI_Router { function __construct() { parent::__construct(); } /** * Set default controller * * @return void */ protected function _set_default_controller() { if (empty($this->default_controller)) { show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.'); } // Is the method being specified? if (!sscanf($this->default_controller, '%[^/]/%[^/]/%s', $directory, $class, $method) !== 2) { $method = 'index'; } if ( ! file_exists(APPPATH.'controllers'.DIRECTORY_SEPARATOR.$directory.DIRECTORY_SEPARATOR.ucfirst($class).'.php')) { // This will trigger 404 later return; } $this->set_directory($directory); $this->set_class($class); $this->set_method($method); // Assign routed segments, index starting from 1 $this->uri->rsegments = array( 1 => $class, 2 => $method ); log_message('debug', 'No URI present. Default controller set.'); } }

あとは「config/routes.php」でサブディレクトリを指定すれば完了です。

$route['default_controller'] = 'home/welcome';

最後に、コアクラスの変更はバージョンアップ時に動かなく危険性や他の機能へ影響を与える可能性があるので十分な注意が必要です。

今回であれば、default_controllerを「hello」にした状態でも、コントローラ「Hello.php」のindexにて「home/welcome」へリダイレクトさせる事で解決できるかと思いますので、最適な方法を選んでいただければと思います。

public function index() { redirect('/home/welcome'); }

投稿2016/04/04 04:27

fakefur

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yanagiyanmal

2016/04/04 04:55

fakefurさん ソースつきの丁寧な回答ありがとうございます。 やはりデフォルトではできないのですね。 現在はリダイレクトで対応していますが、クラス編集にもチャレンジしてみます! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問