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

StackOverflow https://stackoverflow.com/questions/1626305

  •  06-07-2019
  •  | 
  •  

Вопрос

В моем каталоге 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 
{...}

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

Фатальная ошибка:Класс 'DD_Controller' нет найдено в C:\development\localhost\applications\inquiry\controllers\inquiry.php на линии 4

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

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

Есть идеи, чего мне не хватает?

ТИА

Это было полезно?

Решение

DD_Controller.php должен находиться в /system/application/libraries/

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

В system/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 {
    ....

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

Другие советы

Это лучший подход.Сделайте следующее:

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

    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");
        }
    
    }
    
  3. Создайте свои дочерние контроллеры в этом каталоге. your_ci_app/application/controllers/ .я позвоню этому adminchild.php

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

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

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

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

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

Что касается вашего личного вопроса...

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top