Codeigniter, расширяющий расширенный MY_Controller - PullRequest
9 голосов
/ 05 января 2011

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

Мои 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

Ответы [ 5 ]

7 голосов
/ 06 января 2011

Вам необходимо указать Public Controller в вашем 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
5 голосов
/ 06 января 2011

Вы должны поместить 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 везде, и она отлично работает. Недавно я написал статью о том, как это сделать в связи с переносом вашей логики аутентификации в ваши расширенные контроллеры. Это примерно на полпути, когда я начинаю обсуждать конструирование ваших контроллеров.

1 голос
/ 18 июля 2012

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

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

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

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

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

1 голос
/ 06 сентября 2011

Проблема была решена здесь: http://devcrap.net/pl/2011/09/04/codeigniter-dziedziczenie-z-my_controller-extends-my_controller/. На польском, но код хорош:]

0 голосов
/ 09 августа 2017

У меня есть собственный класс контроллера с именем 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' not found исключение .

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

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

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

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

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

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

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

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