使用vendor目录中的autoloader.php自动加载无法正常工作

tor*_*ten 6 php phpunit autoload doctrine-orm composer-php

由于自动加载器无法解析Doctrine\ORM\Mapping\Table,因此我很难对作曲家进行自动加载.对于Unittests,我创建了带有典型Annotations的doctrine实体类:

<?php

namespace OmniSearchTest\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Picture
 *
 * @ORM\Table(name="picture")
 * @ORM\Entity
 */
class Picture
{
Run Code Online (Sandbox Code Playgroud)

并使用此实体创建了一个新的实体管理器.但我收到消息:

Doctrine\Common\Annotations\AnnotationException: [Semantical Error] The annotation "@Doctrine\ORM\Mapping\Table" in class OmniSearchTest\Entity\Picture does not exist, or could not be auto-loaded.
Run Code Online (Sandbox Code Playgroud)

对于一些Unittests

首先,我有以下项目结构:

/src
    /OmniSearch
        SomeClass.php
/tests
    /OmniSearchTest
        SomeClassTest.php
/composer.json
/phpunit.xml.dist
Run Code Online (Sandbox Code Playgroud)

我的composer.json看起来像这样:

{
    /* ... */

    "require": {
        "php": ">=5.4",
        "doctrine/orm": "2.*"
    },
    "require-dev": {
        "phpunit/phpunit": "4.*"
    },
    "autoload": {
        "psr-0": {
            "OmniSearch\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-0": {
            "OmniSearchTest\\": "tests/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我的phpunit看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
     backupStaticAttributes="false"
     bootstrap="vendor/autoload.php"
     strict="true"
     verbose="true">
    <testsuites>
        <testsuite name="omnisearch">
            <directory>./tests/OmniSearchTest</directory>
        </testsuite>
    </testsuites>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

我从我的另一个zf2项目中切断了这个项目,自动加载工作正常.我不确定究竟出了什么问题,因为自动生成的autoload_namespaces.php包含映射:

'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),
Run Code Online (Sandbox Code Playgroud)

Cer*_*rad 14

这是一个黑暗的镜头,但Symfony 2应用程序包括一个autoload.php文件,它显式加载注释注册表.

// autoload.php
use Doctrine\Common\Annotations\AnnotationRegistry;
use Composer\Autoload\ClassLoader;

/**
 * @var ClassLoader $loader
 */
$loader = require __DIR__.'/../vendor/autoload.php';

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

return $loader;
Run Code Online (Sandbox Code Playgroud)

因为我不使用注释,所以我从未真正研究过为什么会有任何细节.但试一试.不能伤害.

  • 我只是使用来自`vendor`目录的composer的autoload.php并且它工作(我甚至不使用bootstrap.php):`$ loader = require_once __DIR __.'/ vendor/autoload.php'; AnnotationRegistry :: registerLoader(阵列($装载机, '的loadClass'));` (2认同)