Почему в CodeIgniter вызываются два метода контроллера? - PullRequest
0 голосов
/ 08 августа 2011

Не следует ли использовать Index в качестве имени для класса контроллера в CodeIgniter? У меня есть контроллер индекса, и я вижу, как его методы вызываются несколько раз. Более конкретно, я всегда вижу, как его index метод вызывается первым, независимо от того, посещаю ли я путь, который должен быть направлен туда.

В приложении / контроллерах / index.php

class Index extends CI_Controller
{
    public function index()
    {
        echo "index";
    }
    public function blah()
    {
        echo "blah";
    }
}

Когда я захожу на index/blah, я вижу напечатанное indexblah. Когда я посещаю index/index, я вижу indexindex. Если я переименую контроллер на что-то другое (например, Foo), у него не будет проблем. Это очевидный обходной путь, но кто-нибудь может сказать мне, почему это происходит? Должен ли я сообщить об этом как об ошибке в CodeIgniter?

(Примечания: у меня нет настроенных маршрутов в configs/routes.php; мой index.php находится вне дерева CodeIgniter)

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Чтобы дополнительно уточнить, в чем проблема, в PHP4 Конструкторы были функцией с тем же именем, что и класс ...

пример

class MyClass
{
    public function MyClass()
    {
        // as a constructor, this function is called every 
        // time a new "MyClass" object is created
    }
}

Теперь для версии PHP5 (какой кодовый указатель теперь, начиная с 2.0.x, соответствует системному требованию)

class MyClass
{
    public function __construct()
    {
        // as a constructor, this function is called every 
        // time a new "MyClass" object is created
    }
}

Итак, чтобы ответить на вопрос, который решает проблему ...

Не следует ли мне использовать Index в качестве имени для класса контроллера в CodeIgniter?

Я считаю, что было бы лучше не выбирать Index в качестве имени контроллера, поскольку функция index() зарезервирована для использования в codeigniter. Это может вызвать проблемы в зависимости от конфигурации PHP.

2 голосов
/ 08 августа 2011

Может кто-нибудь сказать мне, почему это происходит?

Когда создается экземпляр вашего контроллера, index как вызывается конструктор.

Сравнить Конструкторы и деструкторы Документы :

Для обратной совместимости, если PHP 5 не может найти функцию __construct () для данного класса, он будетпоиск функции конструктора старого стиля, по имени класса .[выделение мной]

В вашем случае ваш контроллер не имеет никакой функции __construct(), но имеет функцию, имя которой совпадает с именем класса: index.Он вызывается в тот момент, когда Codeigniter разрешает и загружает, а затем создает экземпляр вашего Index контроллера.

Вы можете решить эту проблему, просто добавив конструктор в ваш контроллер:

class Index extends CI_Controller
{
    public function __construct() {}
    public function index()
    {
        echo "index";
    }
    public function blah()
    {
        echo "blah";
    }
}

После этогоизменить, это больше не повторится.

Должен ли я сообщить об этом как об ошибке CodeIgniter?

Нет, на самом деле нет необходимости сообщать об этом как об ошибкеЭто то, как работает язык, и поскольку Codeigniter поддерживает PHP 4, он должен оставаться обратно совместимым и должен предлагать конструкторы PHP 4.(Примечание: проектные документы Codeigniter нуждаются в поддержке сервера для версии PHP 5.1.6 или новее, но в настоящий код встроена совместимость с PHP 4, я имею в виду здесь кодовую базу, а не документацию.)

0 голосов
/ 06 сентября 2015

Вот еще одно решение с использованием Codeigniter3

require_once 'Base.php';
        class Index extends Base
    {
        public function __construct()
        {
        parent::index();
        $classname=$this->router->fetch_class();
    $actioname=$this->router->fetch_method();

    if($actioname=='index' || $actioname == '')
    {
        $this->viewall();
    }
}
}

И viewall () имел следующее

$this->siteinfo['site_title'].=' | Welcome';
$this->load->view('templates/header', $this->siteinfo);
$this->load->view('templates/menu', $this->siteinfo);
$this->load->view('index/viewall', $data);
$this->load->view('templates/footer', $this->siteinfo);

Базовый контроллер выполняет всю загрузку библиотеки и помощника для всего приложения, поэтому он требуется в классе по умолчанию

По сути, из моего короткого понимания CodeIgniter, использование действия по умолчанию в качестве индекса неверно. Я выяснил это с помощью печати результата $ this-> router-> fetch_method (); в конструкции () моего класса индекса. Действие по умолчанию CodeIgniter - это индекс, вы можете установить контроллер по умолчанию только в application / config / rout.php, а не действие по умолчанию.

Так что мой совет, никогда не используйте index () в качестве действия по умолчанию, особенно если вы используете index в качестве контроллера по умолчанию

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