经过几个小时,调试和修改无法弄清楚是否有可能,请赐教。
我的框架被我服务器上的许多网站使用。我试图实现SplClassLoader但很少或没有成功。加载器正在运行(带一些修改),直到我需要添加另一条路径(完成调度时)。
看起来加载器只有在框架放在app所在的同一目录下才可以运行,但不能反过来。
是否可以将此加载器与
一起使用当库集中并且许多应用程序将使用它时?
我的设置:
/lib
/Framework
/Controller
Front.php
/site1
/App
/App1
/App2
/Controllers
/site2
site1/public/index.php
启动前端控制器,然后执行调度,然后启动实际控制器。
我的(可能是错误的)命名空间设置:
使用命名空间Framework
的{{1}}内的每个类。这很好,直到我想启动一个从Framework扩展类的控制器。这是事情出错的地方。提到的SplClassLoader无法处理这些路径。我从错误日志中看到的主要问题是Framework
未置于lib
下,这对我来说是不可接受的。
答案 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();