我没有找到类似的问题,所以在这里。是否有可能(如果是,那么如何)从项目外部自动加载类?即:
有这样的目录结构:
commons/
bundle1/
app1/
...
composer.json
...
app2/
在composer.json文件中我想做以下事情:
"autoload": {
"psr-0": {
"CommonNamespace\\": "../commons/bundle1/"
}
},
但它没有用。所以我尝试使用驻留在app1 /目录中的autoload.php文件:
$loader = require __DIR__.'/../vendor/autoload.php';
$loader->add('CommonNamespace\\', '../../commons/bundle1');
$loader->register();
但它也被忽略了。
还有其他方法吗?或者,您如何在应用程序之间共享代码并确保它始终是最新的?
答案 0 :(得分:2)
你的第一个例子是要走的路。只是一个让语法正确的问题。
以下是一些有效的代码:
$loader = require __DIR__.'/../vendor/autoload.php';
$loader->add('Cerad', __DIR__ . '/../../cerad2/src');
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;
无需致电$ loader-> register();
命名空间后不需要反斜杠。
至于关于使用外部代码的第二个问题,制作自己的编写器包然后只需使用composer将其包含在应用程序中就相当容易了。
https://getcomposer.org/doc/02-libraries.md
使用composer.json
包含基于github的composer包的示例"repositories": [
{
"type": "vcs",
"url": "https://github.com/cerad/FOSUserBundle"
}
],
"require": {
# Grabs my cloned version of FOSUserBundle from github
"friendsofsymfony/user-bundle": "dev-master"
答案 1 :(得分:0)
我最后写了一个简短的自动加载器(下面的代码),我把它放在app / autoload.php文件中,就在返回$ loader line之前。它完美无缺。只是搞砸了部署。
spl_autoload_register(function ($class) {
$prefix = 'Somenamespace\\';
$base_dir = __DIR__ . '/../../commons/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) { return; }
$relative_class = substr($class, $len);
$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
if(file_exists($file)) {
require $file;
}
});