我最近开始用PHP编写自定义MVC框架。这基本上是一个学习练习。
我的课程位于以下目录中:
我没有使用命名空间,因为我无法弄清楚如何使用命名空间和Apache 2处理程序样式URL(控制器/操作/ 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
然而,我无法弄清楚如何在没有命名空间的情况下使其工作。看起来命名空间是可选的参数。但是,如果我执行以下操作,则不会发生任何事情 - 甚至Apache日志中的错误:
$libLoader = new SplClassLoader('', 'system/libraries');
答案 0 :(得分:0)
PSR-0的目标是尝试指定如何命名外部第三方库类,以及包含这些类的文件应该位于磁盘上的位置。这个目标已经完成,从高级别来看,这不是一件坏事。互操作性而不是跨越其他库是一件好事。
你的目录布局和类命名方案没有与PSR-0进行网格划分,这意味着SplClassLoader对你来说几乎没用。
您有两种选择:
如果您正在构建一个用于外部分发的库,那么让自己符合PSR-0是一个好主意,因为它非常简单,合乎逻辑且无痛。
如果您正在构建自己的应用程序供自己使用,并且不打算将其作为库,那么您不需要完成所有这些工作,也不应该,因为它应该< EM>傻。这看起来就是这样,所以我可以用一个大胖子结束:不要打扰。
答案 1 :(得分:0)
我得到了它的工作。好极了!
这是我的前端控制器的代码(index.php)我将重构它,因为简单地调用某种类型的bootstrap类会更简洁:
<?php
use NeilMVC\system\libraries\Loader;
require_once('conf/conf.php');
require_once('SplClassLoader.php');
$loadSystemLibraries = new SplClassLoader('NeilMVC\system\libraries');
$loadSystemControllers = new SplClassLoader('NeilMVC\system\controllers');
$loadSystemModels = new SplClassLoader('NeilMVC\system\models');
$loadApplicationLibraries = new SplClassLoader('NeilMVC\application\libraries');
$loadApplicationControllers = new SplClassLoader('NeilMVC\application\controllers');
$loadApplicationModels = new SplClassLoader('NeilMVC\application\models');
$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
给我发送电子邮件欢呼和节日快乐!