来自项目外部的Symfony2.6 composer autoload名称空间

时间:2015-01-14 07:57:10

标签: php symfony composer-php autoload

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

有这样的目录结构:

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

但它也被忽略了。

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

2 个答案:

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