Symfony2.6 composer 从项目外部自动加载命名空间

Symfony2.6 composer autoload namespace from outside the project

我没有找到类似的问题,所以在这里。是否可以(如果是,那么如何)从项目外部自动加载 类 ?即:

有这样的目录结构:

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();

但它也被忽略了。

还有其他方法吗?或者您如何在应用程序之间共享您的代码并确保它始终是最新的?

我最后写了一个简短的自动加载器(下面的代码),我把它放在 app/autoload.php 文件中,就在 return $loader 行之前。它工作完美。只是搞砸了部署。

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;
  }
});

你的第一个例子就是要走的路。只是语法正确的问题。

这是一些工作代码:

$loader = require __DIR__.'/../vendor/autoload.php';

$loader->add('Cerad',   __DIR__  . '/../../cerad2/src');

AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

return $loader;

无需调用 $loader->register();

命名空间后不需要反斜杠。

关于您关于使用外部代码的第二个问题,制作您自己的作曲家包然后使用作曲家将其包含在您的应用程序中是相当容易的。

https://getcomposer.org/doc/02-libraries.md

使用 composer.json

包含基于 github 的作曲家包的示例
"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/cerad/FOSUserBundle"
    }
],
"require": {
    # Grabs my cloned version of FOSUserBundle from github
    "friendsofsymfony/user-bundle": "dev-master"