如何协调 SplClassLoader 的命名空间要求与自定义目录布局?



我最近开始用PHP编写自定义MVC框架。这基本上是一个学习练习。

我的类位于以下目录中:

  • 系统/库/
  • 系统/控制器/
  • 系统/型号
  • 应用程序/库/
  • 应用程序/控制器/
  • 应用程序/模型

我不使用名称空间,因为我不知道如何使用名称空间和Apache2处理程序风格的URL(controller/action/id)实例化控制器。我创建了一个Bootstrap类来自动加载我的其他类:

class Bootstrap
{
public function autoloadClasses($class)<br/>
{
$class .= '.php';
$classDirectories = array(
SYSTEM_LIBS_DIR,
SYSTEM_CONTROLLERS_DIR,
SYSTEM_MODELS_DIR,
APPLICATION_LIBS_DIR,
APPLICATION_CONTROLLERS_DIR,
APPLICATION_MODELS_DIR
);
foreach ($classDirectories as $classDirectory) {
$directoryIterator = new DirectoryIterator($classDirectory);
foreach($directoryIterator as $file) {
if ($file == $class) {
include $classDirectory . $class;
break 2;
}
}
}
}

public function register()
{
spl_autoload_register(array($this, 'autoloadClasses'), true);
}

public function init()
{
$this->register();
$loader = new Loader($_GET);
$controller = $loader->createController();
$controller->executeAction();
}
}

它运行良好。然而,我知道我真的应该使用PSR-0:推荐的实现

https://gist.github.com/221634

然而,我不知道如何在没有名称空间的情况下使其工作。看起来命名空间是一个可选的pararmeter。然而,如果我执行以下操作,什么都不会发生——甚至Apache日志中也不会出现错误:

$libLoader = new SplClassLoader('', 'system/libraries');

PSR-0的目标是尝试指定外部第三方库类的命名方式,以及包含这些类的文件在磁盘上的位置。这个目标已经实现,从的水平来看,这还不错。互操作性和不遍历其他库是一件好事。

您的目录布局和类命名方案与PSR-0不匹配,这意味着SplClassLoader对您来说几乎毫无用处。

你有两个选择:

  1. 重命名所有类,将它们打乱到命名空间层次结构中,并重构需要担心的其余代码,或者
  2. 不要使用SplClassLoader并编写自己的自动加载器

如果您正在构建一个用于外部分发的库,那么让自己符合PSR-0是一个好主意,因为它非常简单、合乎逻辑且无痛。

如果你正在构建自己的应用程序供自己使用,并且不打算将其作为库,那么你不需要做所有这些工作,你也不应该这样做,因为这太傻了。看起来是这样的,所以我可以用一个大胖子结束:不要打扰

我开始工作了。耶!

以下是我的前端控制器(index.php)中的代码,我将对其进行重构,因为简单地调用某种类型的引导类会更干净:

<?php
use NeilMVCsystemlibrariesLoader;
require_once('conf/conf.php');
require_once('SplClassLoader.php');
$loadSystemLibraries = new SplClassLoader('NeilMVCsystemlibraries'); 
$loadSystemControllers = new SplClassLoader('NeilMVCsystemcontrollers');
$loadSystemModels = new SplClassLoader('NeilMVCsystemmodels');
$loadApplicationLibraries = new SplClassLoader('NeilMVCapplicationlibraries');
$loadApplicationControllers = new SplClassLoader('NeilMVCapplicationcontrollers');
$loadApplicationModels = new SplClassLoader('NeilMVCapplicationmodels');
$loadSystemLibraries->register();
$loadSystemControllers->register();
$loadSystemModels->register();
$loadApplicationLibraries->register();
$loadApplicationControllers->register();
$loadApplicationModels->register();
$loader = new Loader($_GET);
$controller = $loader->createController();
$controller->executeAction();

我不得不重构一些类,以便将完全限定的类解析为MVC风格URL中使用的非限定名称。这并不难,我只需要修改一下就可以理解。如果有人想了解更多,你可以通过我的网站给我发电子邮件http://neilgirardi.com

干杯,节日快乐!

相关内容

  • 没有找到相关文章

最新更新