Библиотеки Codeigniter - Ошибка загрузки пользовательских классов - PullRequest
1 голос
/ 16 сентября 2011

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

Так вот моя структура папок

application
    |_ libraries
      |_ cgh
          |_ cgh_asset.php
          |_ cgh_article.php
          |_ cgh_asettype.php
    |_ controllers
      |_ welcome.php

Класс Cgh_article является подклассом Cgh_asset

Cgh_asset.php:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 
abstract class Cgh_asset
{
    public $id;
    public $type;
    public $title;
    public $content;
    public $user;

    abstract public function generate_url();
    function __construct()
    {
        $this->generate_url();
    }
}

?> 

Cgh_article.php:

<?php

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

class Cgh_article extends Cgh_asset
{
    function __construct()
    {
        parent::__construct();
        $this->type=Cgh_assettype::article;
    }
    function generate_url()
    {
        $this->url="Article_URL";
    }
}


?> 

Cgh_assettype.php:

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

class Cgh_assettype
{
    const type1="type1";
    const type2="type2";
    const article="article";
}

?> 

Контроллер welcome.php

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

class Welcome extends CI_Controller {

    public function index()
    {
        $this->load->library('cgh/Cgh_assettype','cgh/Cgh_asset','cgh/Cgh_article');

        $this->load->view('welcome_message');
    }
} 

Я получаю ошибку: Невозможно загрузить запрошенный класс: Cgh_assettype

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


Пройдя через некоторые ответы, я думаю, что, вероятно, мне следует добавить здесь один базовый вопрос - возможно ли вообще иметь свои собственные типы объектов внутри codeigniter ... типы, которые должны быть совершенно очевидны из моего вопроса?


Кажется, это работает для меня, вот что я буду делать ... по крайней мере, пока что-то не сломается:

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

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

class Welcome extends CI_Controller {


    public $cgh_assettype;
    public $cgh_asset;
    public $cgh_article;

    function __construct()
    {
        parent::__construct();
        //$this->load->library(array('cgh/cgh_assettype','cgh/cgh_asset','cgh/cgh_article'));
        echo "Including CGH<br />";
        echo "<p>Apppath is ". APPPATH. "</p>";
        require_once(APPPATH.'libraries/cgh/Cgh_assettype.php');
        require_once(APPPATH.'libraries/cgh/Cgh_asset.php');
        require_once(APPPATH.'libraries/cgh/Cgh_article.php');

    }

    public function index()
    {
        $iCgh_article=new Cgh_article();
        echo "<p>$iCgh_article->url</p>";
        $this->load->view('welcome_message');
    }
}

Ответы [ 3 ]

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

Названия файлов библиотеки пишутся с большой буквы? (В представленной структуре папок указано, что это не так).

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

http://codeigniter.com/user_guide/general/creating_libraries.html

Соглашения об именах

  • Имена файлов должны быть заглавными. Например: Myclass.php
  • Объявления класса должны быть написаны заглавными буквами. Например: класс Myclass
  • Имена классов и имена файлов должны совпадать.
1 голос
/ 16 сентября 2011

Вам необходимо вызвать $this->load->library для каждой библиотеки.

$this->load->library('cgh/Cgh_assettype');
$this->load->library('cgh/Cgh_asset');
$this->load->library('cgh/Cgh_article');

$this->load->library принимает 3 параметра.

  1. Файл для загрузки
  2. (необязательно) $config массив
  3. (необязательно) Строка для переименования библиотеки в ($this->Renamed_library)

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

$this->load->library(array('cgh/Cgh_assettype','cgh/Cgh_asset','cgh/Cgh_article'));
0 голосов
/ 03 декабря 2013

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

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