Джентльмены, нужна ваша помощь в организации архитектуры.
Пишу небольшое PHP приложение использующие автозагрузку и namespaces.
В начале все шло хорошо: классы хранятся в каталоге
/classes/, трэйты в каталоге
/traits/. Корневой namespace указывает на принадлежность к тому или иному типу. С этим проблем не возникло.
Но вот очередь дошла до классов исключений... Понятное дело, что хранить их нужно как-то по особенному, потому как создавать для каждого исключения свой файл откровенно глупо. Но что делать?
Сейчас решил хранить исключения рядом с классом, которому они принадлежат. Корневым namespace для них будет Exceptions, дальше пойдет название холдер класса.
Реализация загрузчика должна послужить примером<?php
namespace Exceptions\Core\Autoloader;
class ErrorAutoload extends \Exception{}
class ErrorAutoloadRegistry extends ErrorAutoload{}
class ErrorAutoloadInclude extends ErrorAutoload{}
namespace Core;
use \Exceptions\Core\Autoloader\ErrorAutoloadRegistry;
use \Exceptions\Core\Autoloader\ErrorAutoloadInclude;
class Autoloader
{
use \Traits\Singleton;
protected function __construct()
{
if(!spl_autoload_register(array($this, 'autoload'), true))
{
throw new ErrorAutoloadRegistry();
}
}
public function autoload($object_name)
{
$path = str_replace('\\', DIRECTORY_SEPARATOR, $object_name);
$path = strtolower($path);
switch(substr($path, 0, strpos($path, DIRECTORY_SEPARATOR)))
{
case 'classes':
case 'traits':
break;
case 'exceptions':
$path = substr($path, strpos($path, DIRECTORY_SEPARATOR) + 1);
$path = dirname($path);
default:
$path = 'classes' . DIRECTORY_SEPARATOR . $path;
break;
}
$path = APPLICATION_ROOT . DIRECTORY_SEPARATOR . $path . '.php';
if(!file_exists($path))
{
throw new ErrorAutoloadInclude($object_name);
}
require_once($path);
}
}
?>
Но, что-то мне подсказывает, что это не правильно. Есть идее получше?