PSR-0 SplClassLoader有很多路径

时间:2012-11-21 12:35:23

标签: php namespaces autoload spl-autoload-register psr-0

经过几个小时,调试和修改无法弄清楚是否有可能,请赐教。

我的框架被我服务器上的许多网站使用。我试图实现SplClassLoader但很少或没有成功。加载器正在运行(带一些修改),直到我需要添加另一条路径(完成调度时)

看起来加载器只有在框架放在app所在的同一目录下才可以运行,但不能反过来。

是否可以将此加载器与

一起使用
  • 正确的命名空间支持
  • 很少或根本没有黑客

当库集中并且许多应用程序将使用它时?

我的设置:

/lib
  /Framework
    /Controller
      Front.php
/site1
  /App
    /App1
    /App2
      /Controllers
/site2

site1/public/index.php启动前端控制器,然后执行调度,然后启动实际控制器。

我的(可能是错误的)命名空间设置:

使用命名空间Framework的{​​{1}}内的每个类。这很好,直到我想启动一个从Framework扩展类的控制器。这是事情出错的地方。提到的SplClassLoader无法处理这些路径。我从错误日志中看到的主要问题是Framework未置于lib下,这对我来说是不可接受的。

1 个答案:

答案 0 :(得分:1)

修改

好的,你没有提到你正在使用PEAR命名/命名空间。在这种情况下,它有点不同。

首先,您需要调整Framework的类命名。那些需要Framework段,所以:

Controller_Front

应该是

Framework_Controller_Front

这为控制器提供了唯一的ns。

然后使用加载器,您将注册一个前缀,如:

$loader->registerPrefix('Framework', 'absolute/path/to/lib');

没有从未使用过带有PEAR命名的ClassLoader我不确定你是否需要在前缀上留下尾随_但你应该能够通过反复试验来解决这个问题。我也不确定你是否会将路径指向' absolute / path / to / lib'或者'绝对/路径/到/ lib / Framework' - 再次尝试和错误应指出: - )


好吧不确定你哪里出错了但是让我们这样做。

让我们在/lib中创建一个名为autoload.php的文件,其内容为:

// require/use statements for the Symfony ClassLoader Component

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Framework' => __DIR__                    
));

$loader->register();

return $loader;

此时已设置类加载器。那么在每个站点的index.php(或者你用来执行引导程序的任何内容中:

// configure the path to the framework from SITE/public and require the autoload.php
$frameworkDir = realpath(__DIR__ . '/../../lib');
$siteDir = realpath(__DIR__ . '/../'); // whatever gives us site1

$loader = require_once($frameworkDir . '/autoload.php');

// now lets start mapping our application specific namespaces
$loader->registerNamespace('App1', $siteDir . '/App/App1');
$loader->registerNamespace('App2', $siteDir . '/App/App2');

// then the rest of your bootstrapping and FC initialization

你可能想试试Symfony Components ClassLoader - 这就是我通常使用的东西。只要你用绝对路径注册你的名字,就没关系了。

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    'Framework' => __DIR__ . '/lib',
    'AppOne'    => $somevarHoldingTheABSPrefixToTheAppOneCode . '/lib',
    'AppTwo'    => $somevarHoldingTheABSPrefixToTheAppTwoCode . '/lib',
    'AppTwo\\SomeVendor' => $somevarHoldingTheABSPrefixToTheAppTwoCode . '/vendor/somevendor/lib'                    
));

$loader->register();