0

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

我的服务器上的许多站点都使用我的框架。我正在尝试实现SplClassLoader,但几乎没有成功。加载程序工作(进行一些修改),直到我需要添加另一个路径(当调度完成时)

看起来加载器只能在框架放置在应用程序所在的同一目录下时才能运行,但不能相反。

是否可以将此加载程序与

  • 适当的命名空间支持
  • 很少或没有黑客攻击

当图书馆是集中的并且许多应用程序将使用它时?

我的设置:

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

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

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

Frameworkusing namespace中的每个类Framework。这很好,直到我想启动一个从框架扩展类的控制器。这就是事情出错的地方。提到的 SplClassLoader 不能处理这样的路径。我从错误日志中看到的是主要问题lib不是site1我不能接受的问题。

4

1 回答 1

1

编辑:

好的,您没有提到您正在使用 PEAR 命名/命名空间。在这种情况下,它的工作方式会有所不同。

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

Controller_Front

应该

Framework_Controller_Front

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

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

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

从来没有使用过带有 PEAR 命名的 ClassLoader,我不确定您是否需要_在前缀上留下尾随,但您应该能够通过反复试验来解决这个问题。此外,我不确定您是否会将路径指向“absolute/path/to/lib”或“absolute/path/to/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();
于 2012-11-21T15:10:32.403 回答