Контроллер по умолчанию 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-адрес.
вы можете расширить маршрутизатор системы согласно требованиям,
- Создать 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 не содержит данных.
$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.