Контроллер CodeIgniter по умолчанию в подкаталоге не работает - PullRequest
9 голосов
/ 30 июня 2011

Мой default_controller в конфигурации маршрутов установлен как «home.php».

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

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

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

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

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

Cheers

Ответы [ 6 ]

23 голосов
/ 30 июня 2011

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

Например: для установки контроллера по умолчанию для вашей подпапки folder на home добавьте в файл /application/config/routes.php следующее:

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

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

13 голосов
/ 26 июня 2016

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

  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 - папка
  • admins - контроллер
  • login - метод

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

 $route['default_controller'] = "welcome/index";
  • welcome - контроллер
  • index - метод

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

4 голосов
/ 07 августа 2012

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

$route['home'] = "home/whatever";
$route['home/(:any)'] = "home/whatever/$1";
1 голос
/ 30 июня 2011

Маршрут по умолчанию используется для указания 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/

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

0 голосов
/ 24 мая 2019

Добавьте эту строку в application / config / rout.php

$this->set_directory( "yourfoldername" );
$route['default_controller'] = 'controller name';
0 голосов
/ 16 мая 2017

СТРУКТУРА МОЕЙ ПАПЫ

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

В config / rout.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...