0

この投稿は、独自の名前空間を追加するために存在すると思われる簡単なソリューション、つまり app/autoload.php のローダーを使用したソリューションに専念しています。

registerNamespace や registerPrefix などのマジック メソッドについて説明しているドキュメントはたくさんあります。

問題は、これらのメソッドが UniversalClassLoader オブジェクトに対して存在することです。

私は Symfony 標準版 2.2 をダウンロードしましたが、app/autoload.php はそれに似ています (Symfony 標準版 2.1 とほとんど同じです):

use Doctrine\Common\Annotations\AnnotationRegistry;

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

// intl
if (!function_exists('intl_get_error_code')) {
  require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
}

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

return $loader;

実際に使用されているローダーは composer ローダーです。たとえば、「seclibs/collections」名前空間を追加したい場合に使用できる唯一の方法は、次のような「add」メソッドです。

$loader->add("seculibs\\collections", __DIR__.'/../vendor/seculibs/collections/');

しかし、それはうまくいかないようです:私がプログラムを実行すると、 /seclibs/collections/xx.php に対して同じ classNotFound があります

だから私は autoload.php を次のように変更しました:

    require_once ('/../vendor/symfony/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php');

use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = require __DIR__.'/../vendor/autoload.php';
$universalLoader = new UniversalClassLoader();

$universalLoader->registerNamespace("seculibs\\collections", __DIR__.'/../vendor/seculibs/collections/');
$universalLoader->register();

// intl
if (!function_exists('intl_get_error_code')) {    
    require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';

}

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

return $loader;

何もない...

しかし、明らかにそれは多くの人にとってうまくいくので..何が間違っているのですか? 秘密のウェブサイトで見つけられる他のバージョンの Symfony はありますか?

クラスの1つはそのようなものです:

namespace seculibs\collections;

class LinkedMap {
    private $items;

    public function __construct() {
        $this->items = array();
    }

    public function __destruct() {
        unset($this->items);
    }

 ....
4

2 に答える 2

1

独自のライブラリを composer.json autoload 構成に追加できるため、composer によって読み込まれなくても、生成された autoloader に含まれます。

"autoload": {
    "psr-0": {
        "": "src/",
        "MyLib_": "/home/sites/MyLib"
    }
},
于 2013-03-07T16:19:43.350 に答える
1
$loader->add('seculibs\\collections',__DIR__ . '/../vendor');

new LinkedMap();

次のファイルがあると仮定します: vendor/seculibs/collections/LinkedMap.php

通常、ライブラリには別のレベルがあります。何かのようなもの:

ベンダー/MyStuff/seclibs/コレクション

そして add 行は vendor/MyStuff を指します

于 2013-03-07T16:34:06.233 に答える