2015-01-14 2 views
2

Я не нашел похожих вопросов, так что вот оно. Возможно ли (если да, то как) автоматически загружать классы извне проекта? То есть:Symfony2.6 composer autoload namespace вне проекта

Существует эта структура каталогов:

commons/ 
    bundle1/ 
app1/ 
    ... 
    composer.json 
    ... 
app2/ 

внутри composer.json файла, который я хотел бы сделать следующее:

"autoload": { 
    "psr-0": { 
     "CommonNamespace\\": "../commons/bundle1/" 
    } 
}, 

Но это не сработало. Так что я пытался использовать autoload.php файл, который находится внутри app1/каталог:

$loader = require __DIR__.'/../vendor/autoload.php'; 
$loader->add('CommonNamespace\\', '../../commons/bundle1'); 
$loader->register(); 

Но это игнорируется, а также.

Есть ли другие способы сделать это? Или как вы делитесь своим кодом между приложениями и убедитесь, что он постоянно обновляется?

ответ

2

Ваш первый пример - путь. Просто вопрос о правильности синтаксиса.

Вот некоторые рабочий код:

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

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

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

return $loader; 

Нет необходимости вызывать $ Loader-> регистр();

Не требуется обратная косая черта после пространства имен.

Что касается вашего второго вопроса об использовании внешнего кода, довольно легко создать собственные пакеты композиторов, а затем просто использовать композитор для его включения в приложение.

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

Пример включения GitHub на основе композитор пакет с помощью composer.json

"repositories": [ 
    { 
     "type": "vcs", 
     "url": "https://github.com/cerad/FOSUserBundle" 
    } 
], 
"require": { 
    # Grabs my cloned version of FOSUserBundle from github 
    "friendsofsymfony/user-bundle": "dev-master" 
+0

Да, вы были правы. Я должен был исправить некоторые имена внутри кода. Но $ loader-> add все еще не работает. ТАК ИЛИ ИНАЧЕ. Любой композитор или новый автозагрузчик. Композитор - самое чистое решение. – greg

+0

Убедитесь, что ваш путь верен. Измените его на абсолютный путь, как мой пример, и посмотрите, поможет ли это. – Cerad

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; 
    } 
}); 
Смежные вопросы