Я использую следующий сценарий, но это не обязательно относится только к CodeIgniter.
HMVC: https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc
Интернационализация (i18n): https://github.com/waqleh/codeigniter-language-in-url-internationalization
Оба HMVC & i18n работают, расширяя CI_Config
(и связанные CI_
классы).
Чтобы заставить i18n работать рядом HMVC, сначала я должен запросить соответствующий файл HMVC, а затем расширить этот класс.
Так, например, CI_Config
продлен HMVC MX_Config
а затем дополнительно требуется & продлен i18n MY_Config
,
Но теперь i18n работает только если HMVC уже на месте.
Что делать, если HMVC отсутствует (нет MX_Config
и связанные)
Я хочу, чтобы i18n работал как с / без HMVC.
Есть ли способ условно требовать & продлить один класс или другой? Или, скорее, продлить CI_Config
(и связанные) дважды без столкновения? Или есть другой способ сделать то, что я хочу?
HMVC MX_Config
частичный:
/**
* HMVC
*/
class MX_Config extends CI_Config
{
i18n MY_Config
частичный:
/* load HMVC's MX_Config class */
require APPPATH . "third_party/MX/Config.php";
/**
* Language
*/
class MY_Config extends MX_Config
{
Как насчет объявления класса MX_Config
динамически, если его не существует?
<?php
class CI_Config {}
if (!class_exists('MX_Config')) {
class MX_Config extends CI_Config {}
}
class MY_Config extends MX_Config {}
$config = new MY_Config();
var_dump(
$config instanceof MX_Config,
$config instanceof CI_Config
);
Например, смотрите:
Ответ localheinz действителен, но не учитывает:
CodeIgniter загружает файлы ядра CI_
& MY_
до HMVC MX_
, Так что нет возможности иметь MY_
проверить, если MX_
объявлен
Также я не хочу редактировать ядро CI_
файлы, так как они не предназначены для изменения.
Рабочий раствор:
Примечание: та же логика ниже может быть применена к другим MY_
классы.
MY_Config
частичный:
/* load HMVC's MX_Config class */
if ( file_exists(APPPATH . "third_party/MX/Config.php") ) {
require APPPATH . "third_party/MX/Config.php";
/* otherwise declare MX_Config class */
} else {
class MX_Config extends CI_Config {}
}/**
* Language
*/
class MY_Config extends MX_Config
{