Как мне расширить класс контроллера воспламенителя кода? - PullRequest
10 голосов
/ 26 октября 2009

В моей папке CI system \ library у меня есть новый класс с именем 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 отлично работает, когда я расширяю контроллер, но я получаю

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

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

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

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

ТИА

Ответы [ 3 ]

5 голосов
/ 05 февраля 2015

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

  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();
        }
    
    }
    
4 голосов
/ 07 мая 2010

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

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

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

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

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

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

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

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

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

С уважением, Anton

4 голосов
/ 26 октября 2009

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

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

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

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

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