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

Posted

技术标签:

【中文标题】使用供应商目录中的 autoloader.php 自动加载无法正常工作【英文标题】:autloading not working correct using autoloader.php in vendor directory 【发布时间】:2014-11-14 05:53:59 【问题描述】:

因为自动加载器无法解析 Doctrine\ORM\Mapping\Table,所以我对 composer 的自动加载感到不满。 对于单元测试,我创建了带有典型注释的理论实体类:

<?php

namespace OmniSearchTest\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Picture
 *
 * @ORM\Table(name="picture")
 * @ORM\Entity
 */
class Picture

并使用这些实体创建了一个新的实体管理器。但我得到了消息:

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.

对于一些单元测试

首先,我的项目结构如下:

/src
    /OmniSearch
        SomeClass.php
/tests
    /OmniSearchTest
        SomeClassTest.php
/composer.json
/phpunit.xml.dist

我的 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/"
        
    

虽然我的 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>

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

'Doctrine\\ORM\\' => array($vendorDir . '/doctrine/orm/lib'),

【问题讨论】:

【参考方案1】:

这有点像在黑暗中拍摄,但 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;

由于我不使用注释,因此我从未真正详细研究过原因。但是试一试。伤不起。

【讨论】:

whohaaaa,你是对的......我在测试目录中创建了一个 bootstrap.php 并修改了 phpunit.xml 以引导该文件 而且我只是使用来自vendor 目录的composer 的autoload.php 并且它工作(我什至不使用bootstrap.php):$loader = require_once __DIR__.'/vendor/autoload.php'; AnnotationRegistry::registerLoader(array($loader,'loadClass'));【参考方案2】:

这有点老了,但是我创建了一个作曲家插件,它将作曲家类加载器注册到 AnnotationRegistry 作为加载器。

https://github.com/indigophp/doctrine-annotation-autoload

【讨论】:

【参考方案3】:

首先运行这个命令:

composer require indigophp/doctrine-annotation-autoload

完成后,运行:

composer dump-autoload

【讨论】:

完成第一个之后的这个:composer dump-autoload

以上是关于使用供应商目录中的 autoloader.php 自动加载无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

php autoloader.php

在 Laravel 中配置 Autoloader.php [重复]

带有 Zend Framework 2 模块的 PHPUnit

workerman怎样统计框架里的函数执行情况

workerman实现简单弹幕的方法

PRC服务治理组件封装