Контроллер по умолчанию CodeIgniter в подкаталоге не работает

мой default_controller в конфигурации маршрутов установлен как " home.РНР."

У меня есть подкаталог для моих контроллеров, давайте назовем его "папка". Так что, если я посещу http://mysite.com/folder/, контроллер по умолчанию " папка / home.php " следует называть правильно?

однако по какой-то причине это не работает, я получаю 404. Посещение http://mysite.com/folder/home или http://mysite.com/folder/home/index работает как ожидалось. В кроме того, контроллер по умолчанию работает в корневом каталоге (http://mysite.com грузы домой.РНР.)

есть идеи, кто-нибудь еще испытал это? Я не могу понять это-это похоже на проблему CI, но я не могу найти никого, у кого была бы такая же проблема.

документацию, как я понимаю, по крайней мере, предполагает, что это должно работать нормально: http://codeigniter.com/user_guide/general/controllers.html#subfolders

установка контроллера по умолчанию в " folder / home.php " означает, чтоhttp://mysite.com/folder/ работает отлично, как и ожидалось. За исключением того, что я хочу, чтобы контроллер по умолчанию был просто " home.php " - будь то в корне или в подкаталоге, home.php в этом каталоге должен быть загружен, как предполагает документация.

Ура

5 ответов


для каждой подпапки в папке контроллеров необходимо указать контроллер по умолчанию в routes.php. Встроенный $route['default_controller'] не будет работать для вложенных папок.

e.g: для установки контроллера по умолчанию для вас folder суб-папке home добавьте в свой :

$route['folder'] = "folder/home";

что означает http://mysite.com/folder/ это то же самое, что http://mysite.com/folder/home как URL-адрес.


вы можете расширить маршрутизатор системы согласно требованиям,

  1. Создать My_Router.php в application/core/ каталог

/* * Чтобы изменить этот заголовок лицензии, выберите заголовки лицензий в свойствах проекта. * Чтобы изменить этот файл шаблона, выберите сервис / Шаблоны * и откройте шаблон в Редакторе. */

/**
 * Description of My_Router
 *
 * @author girish
 */
class My_Router extends CI_Router {

    //put your code here
    public function __construct($routing = NULL) {
        parent::__construct($routing);
    }

    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) !== 3) {
        $method = 'index';
    }
    if (is_dir(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory) === true) {

        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);
    } else {
        if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) {
            $method = 'index';
        }
        if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
            // This will trigger 404 later
            return;
        }
        $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.');
   }

}

и заменить _set_default_controller() из пользовательского метода он будет работать с контроллером подкаталога, а также корневым каталогом контроллер.

и application/config/routes.php

если вам нужен контроллер подкаталога по умолчанию, то

 $route['default_controller'] = "admin/admins/login";
  • admin -- папка
  • администраторы -- контроллер
  • login -- method

если вам нужен контроллер по умолчанию корневого каталога, то

 $route['default_controller'] = "welcome/index";
  • добро пожаловать -- controller
  • index -- method

не уверен, что он будет работать во всех версиях, но протестирован в CI3.0.6


Если вы хотите оставаться гибким, вам нужно передать все после начальной папки (в application/config/config.php):

$route['home'] = "home/whatever";
$route['home/(:any)'] = "home/whatever/";

маршрут по умолчанию используется для указания CI, какой класс контроллера должен быть загружен, если URI не содержит данных.

enter image description here

$route['default_controller'] = "unicorn/best";

Итак, когда я загружаю

http://example.com/index.php/unicorn/

будет загружен лучший контроллер.

также при загрузке

http://example.com/

или

http://example.com/index.php/horse/

будет загружен лучший контроллер.


МОЯ СТРУКТУРА ПАПОК

--controllers
  --backend
  --frontend
    --home.php
    --products.php
    --productDetail.php
--homeIndex.php

в config/маршруты.в PHP

$route['default_controller'] = 'homeIndex';
$route['frontend'] = 'frontend/home';
$route['backend'] = 'backend/home';

в контроллерах / homeIndex.в PHP

<?php    
defined('BASEPATH') OR exit('No direct script access allowed');
require_once(APPPATH.'controllers/frontend/Home.php');    
class homeIndex extends home {    
    public function index() {
        $this->action();
    }    
}

по умолчанию homeIndex будет загружен, и из homeIndex я вызываю функцию frontend/home / action.