Как расширить класс контроллера воспламенителя кода?

В моем каталоге CI system\libraries у меня есть новый класс с именем DD_Controller.php. Этот файл выглядит следующим образом:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class DD_Controller extends Controller 
{   
    protected $ddauthentication;


    function __construct()
    {           
        parent::Controller();
        $this->ddauthentication = "Authenticated";
    }
}
?>

Мой контроллер приложений определяется следующим образом:

class Inquiry extends DD_Controller 
{...}

Класс запроса отлично работает, когда я расширяю контроллер, но я получаю

Неустранимая ошибка: класс "DD_Controller" не найти в C:\развитие\\ локальных приложения\запрос\Контроллеры\inquiry.php в строке 4

Когда я расширяю DD_Controller. В файле конфигурации у меня есть префикс, определенный как таковой:

$config['subclass_prefix'] = 'DD_';

Любая идея о том, что мне не хватает?

ТИА

Ответ 1

DD_Controller.php должен быть в /system/application/libraries/

Если вы используете один и тот же CI для нескольких приложений и хотите, чтобы все они могли расширять свои контроллеры до вашего пользовательского, вы можете расширить базовый класс контроллера в том же файле.

В системе /libraries/Controller.php ниже класса Controller:

class Mega_Controller extends Controller {
    function Mega_Controller()
    {
        parent::Controller();
        // anything you want to do in every controller, ye shall perform here.
    }
}

Тогда вы сможете сделать это в своих контроллерах приложений:

class Home extends Mega_Controller {
    ....

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

Ответ 2

Это лучший подход. Выполните следующие действия:

  • Перейдите в следующий каталог: your_ci_app/application/core/ и создайте php файл с именем MY_Controller.php (этот файл будет содержать ваши основные родительские классы)
  • Откройте этот файл, который вы только что создали, и добавьте несколько классов, например:

    class Admin_Parent extends CI_Controller {
        public function __construct() {
            parent::__construct();
        }
    
        public function test() {
            var_dump("from Admin_Parent");
        }
    }
    
    class User_Parent extends CI_Controller {
    
        public function __construct() {
            parent::__construct();
        }
    
        public function test(){
            var_dump("from User_Parent");
        }
    
    }
    
  • Создайте дочерние контроллеры в этом каталоге your_ci_app/application/controllers/. Я назову его adminchild.php

  • Откройте adminchild.php и создайте свой код контроллера, убедитесь, что расширили имя родительского класса, например:

    class Adminchild extends Admin_Parent {
    
        function __construct() {
            parent::__construct();
        }
    
        function test() {
            parent::test();
        }
    
    }
    

Ответ 3

Я рекомендую избегать "взлома" основных файлов CodeIgniter. Лучше используйте собственные возможности расширения и попытайтесь вписаться в них.

То же правило, которое я бы рекомендовал для любой библиотеки PHP/CMS. Это правило имеет несколько причин: - возможность quiklky обновить без учета в тысячах заметок, где и как было взломано в основных файлах; - переносимость; - возможность поделиться своим кодом - например, это будет полезно вам и вашим друзьям в случае необходимости, и это поможет им обновить свою библиотеку так же, как и вы.

Другими словами, это гораздо более профессионально, и в будущем он платит вам за удобство использования, переносимость и возможность применения обновлений.

Относительно вашего личного вопроса...

Что касается меня, нет ничего плохого в создании собственной библиотеки со всем необходимым для расширения собственного CodeIgniter Controller, а затем загрузите эту библиотеку в конструктор контроллера, и все готово. Единственное, что можно улучшить, - это короткое имя вашей библиотеки.

Таким образом, вы можете даже разделить то, что вам нужно в разных частях, и поместить в отдельные библиотеки: WebFeatures AdminFeatures и др.

Затем вы просто загружаете необходимые библиотеки в свой конструктор контроллера, и все готово.

P.S. Я знаю, что предлагаемый способ не вписывается в "правильную" концепцию ООП, но в то же время вы никогда не должны забывать о целостности используемых библиотек.

Все вышеизложенное - это еще один взгляд на мой 7-летний опыт профессионального веб-разработки, поэтому я надеюсь, что это будет полезно, если не следовать, то, по крайней мере, принять во внимание.

С уважением, Антон