В любом случае, я предпочел использовать решение include_once, так как считаю, что лучше иметь один файл на класс, а My_app_controller находится в папке application / controllers / my_app. (так что application / controllers / other_apps будет существовать)

ого следовалстатья Фила Осетрины с практическими рекомендациями, чтобы расширить базовый контроллер. Но я получаю еще некоторые ошибки.

Мои 3 класса:

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

// application/libraries/Public_Controller.php
class Public_Controller extends MY_Controller{
    public function __construct(){
        parent::__construct();

    }    
}

// application/controllers/user.php
class User extends Public_Controller{
    public function __construct(){
        parent::__construct();
    }
}

Неустранимая ошибка: класс 'Public_Controller' не найден в /srv/www/xxx/application/controllers/user.php в строке 2

Любопытно, что следующий фрагмент работает, если я напрямую простираюсь отMY_Controller:

// application/controllers/user.php
class User extends MY_Controller{
    public function __construct(){
        parent::__construct();
    }
}

Я загрузил контроллеры через__autoload() или вручную. Контроллеры загружены успешно.

CI-версия: 1.7.3

 Chococroc31 июл. 2014 г., 17:33
В этом вопросе есть гораздо лучшие ответы:stackoverflow.com/questions/21663045/... даже если он помечен как дубликат этого
 Alisson05 янв. 2011 г., 23:03
Вы загружаете MY_Controller.php до загрузки Public_Controller.php?
 Phil Sturgeon07 янв. 2011 г., 11:31
Не могли бы вы опубликовать функцию __autoload в config.php?

Ответы на вопрос(5)

подобная этой, после некоторого поиска я обнаружил, что ошибка была сделана сама, потому что мое имя класса контроллера было MY_Controller, но имя файла было My_Controller [Случай не совпадает]. Примечание: - В localhost у меня не было никаких ошибок.

В расширенном контроллере я использую

class Home  extends MY_Controller{
   function __construct() {
   parent::__construct();
  }
}

даже я получил ошибку.

После изменения моего имени файла на MY_Controller он начал работать хорошо.

MY_Controller он расширяет CI_Controller и работает нормально. Он расположен в приложении / ядре и имеет пользовательские функции для загрузки просмотров на моем сайте.

Я использую абстрактный классMy_app_controller это расширяетMY_Controller для конкретного поведения my_app я хочу, чтобы каждый контроллер в my_app расширял этот абстрактный класс. (Я использую разные приложения на сайте, поэтому некоторые приложения будут расширятьсяMy_app_controller и другие приложения будут расширятьсяMy_other_apps_controllers)

Но когда я пытаюсь продлитьMy_app_controller с любого контроллера в моем приложении "Main_app_controller extends My_app_controller"генерируетКласс 'My_app_controller' не найден, исключение.

Я нашел два решения:

использованиеinclude_once в файле Main_app_controller.php.
include_once APPPATH.'controllers/path/to/My_app_controler.php';

нарушить правило "один класс на файл" воспламенителя кода и определить мойMy_app_controller просто в том же файлеMY_Controller есть (под приложение / ядро).

Руководство говорит:

Используйте отдельные файлы для каждого класса, если классы тесно связаны

Ну ... они есть.

В любом случае, я предпочел использовать решение include_once, так как считаю, что лучше иметь один файл на класс, а My_app_controller находится в папке application / controllers / my_app. (так что application / controllers / other_apps будет существовать)

Вы должны разместитьPublic_controller в сMY_Controller внутри MY_Controller.php

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

class Public_Controller extends MY_Controller{
    public function __construct(){
        parent::__construct();

    }    
}

Я использую __construct везде, и она отлично работает, я недавно написалстатья о том, как это сделать в связи с переносом вашей логики аутентификации в ваши расширенные контроллеры. Это примерно на полпути, когда я начинаю обсуждать конструирование ваших контроллеров.

Решение Вопроса

Вы должны требовать общественного контроллера в вашем MY_Controller

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

require(APPPATH.'libraries/Public_Controller.php');

Вы получаете ошибку, потому что Public_Controller никогда не загружался. Это позволит вам продлитьPublic_Controller

Мне нравится то, что ты делаешь, потому что я делаю это все время.

Вы можете сделать это также в вашем MY_Controller, когда вы хотите создать Admin_Controller

// application/libraries/MY_Controller.php
class MY_Controller extends Controller{
    public function __construct(){
        parent::__construct();
    }
}

require(APPPATH.'libraries/Public_Controller.php'); // contains some logic applicable only to `public` controllers
require(APPPATH.'libraries/Admin_Controller.php'); // contains some logic applicable only to `admin` controllers
 Ijas Ameenudeen02 мар. 2014 г., 09:32
@Phil А как насчет использования хуков? Я использовал этот метод,stackoverflow.com/a/22125436/567854
 Thorpe Obazee07 янв. 2011 г., 12:08
@Phil, он пропустил эту часть в вашем посте :)
 Hashem Qolami09 февр. 2014 г., 19:32
Для тех, кто хочет использовать этот фрагмент: начиная с версии 2Controller основной класс изменен наCI_Controller.
 Phil Sturgeon07 янв. 2011 г., 11:31
Это не должно происходить, если __autoload работает.
 Phil Sturgeon07 янв. 2011 г., 13:17
Ой. «Я загрузил контроллеры с помощью __autoload () или вручную». Кто знает :)

Ваш ответ на вопрос