Чтобы глубже понять парадигму MVC, я экспериментирую с созданием собственной структуры.
Вместо того, чтобы полагаться на некрасивую ошибку / предупреждение PHP, возникающую в результате неудачного включения, я настроил общий класс исключений, который представляет данные в более удобочитаемом формате, а также трассировку стека.
Вот код, который у меня есть ...
spl_autoload_register(__NAMESPACE__.'\Autoloader::coreLoader');
spl_autoload_register(__NAMESPACE__.'\Autoloader::appLoader');
spl_autoload_register(__NAMESPACE__.'\Autoloader::throwException');
class Autoloader
{
private static $isError = false;
private static function loadHelper($className)
{
//Relevant code here
}
public static function coreLoader($className)
{
$classPath = static::loadHelper($className);
if (!@include PRIVATE_ROOT.DIRECTORY_SEPARATOR.$classPath.PHPEXT)
{
static::$isError = true;
}
else
{
static::$isError = false;
}
}
public static function appLoader($className)
{
$classPath = static::loadHelper($className);
if (!@include SYSTEM_PATH.DIRECTORY_SEPARATOR.$classPath.PHPEXT)
{
static::$isError = true;
}
else
{
static::$isError = false;
}
}
public static function throwException($className)
{
if (static::$isError)
{
throw new Exception_General('Attempted to load file: '.$className);
}
}
}
Учитывая тот факт, что include
не генерирует исключение, когда файл не найден, я не могу использовать блок try / catch.
Вместо блока try / catch я обнаружил, что можно использовать if statement
, как в коде выше, чтобы проверить, успешно ли оператор include
загрузил требуемый файл.
Мой класс Exception_General
отвечает за генерацию и отображение удобных для разработчиков сообщений об ошибках. Однако проблема, с которой я здесь сталкиваюсь, заключается в том, что если я добавлю исключение в допустимый метод автозагрузки, сценарий будет по праву остановлен.
Это, конечно, не идеально, поскольку первый метод автозагрузки может не найти запрошенный класс, а второй или третий метод автозагрузки в очереди spl_autoload МОЖЕТ найти запрошенный файл / класс.
Чтобы приспособиться к такому поведению, я обнаружил, что мне пришлось создать 3-й «поддельный» метод автозагрузки, который будет вызываться последним в очереди - этот метод проверяет флаг ошибки и, если установлен, выбрасывает исключение.
В небольшом запутанном вопросе я действительно спрашиваю: есть ли лучший способ перехвата неудачных включений, и как только все функции автозагрузки закончили свою работу, действуйте соответствующим образом?