php - Eclipse PDT - 文件系统更改或新的 Composer 自动加载路径会破坏自动加载器

标签 php filesystems require autoload

我正在使用 Eclipse PDT 在 Composer 中创建一个项目,但是每次我将文件添加到 Composer 自动加载基目录下的目录时,phpunit 测试运行程序都无法再找到我的文件。

至少有两次我做了一些修补并让它再次工作,但似乎每次我更改文件系统时它都会崩溃。我希望 Composer 自动加载器能够找到我的文件,无论 fs 发生什么变化。

这是我最新的自动加载器配置:

{
    "name": "someone/webapp",
    "description": "",
    "require-dev":  {
        "phpunit/phpunit":"~9.0",
        "squizlabs/php_codesniffer": "~3.0"
    },
    "require": {
        "doctrine/orm": "~2.7"
    },
    "autoload" : {
        "psr-4": {
            "WebApp\\": "src/"
         }
    },
    "autoload-dev" : {
        "psr-4": {
            "WebApp\\Tests\\" : "tests/"
        }
    }
}

我之前尝试过使用符合 PSR-0 标准的自动加载机:

{
     "name": "srmes/shopping-app-test",
     "description": "Developer test. Basic OO-orientated PHP webapp",
     "require-dev": {
        "phpunit/phpunit":"~9.0",
        "squizlabs/php_codesniffer": "~3.0"
     },
     "require": {
         "doctrine/orm": "~2.7"
     },
    "autoload" : {
         "classmap": ["src/", "src/Models/"],
         "psr-0": {
             "WebApp\\": "src/",
             "WebApp\\Models\\": "src/Models/"
         }
    },
    "autoload-dev" : {
         "classmap": ["tests/", "tests/Models/"],
         "psr-0": {
             "WebApp\\Tests\\" : "tests/"
         }
    }
}

我的问题涉及将文件添加到自动加载目录。我的目录结构如下所示:

someone/webapp
|-vendor
| |-MISC_PACKAGES
|- src --autoloader base dir
| |-Models
| | |-Product.php
| | |-Furniture.php
| |- IComparable.php -- THIS WAS ADDED, BREAKING AUTOLOADER
|- tests -- autoloader base dir
| |- Models
| | |- FurnitureTest.php
| | |- IProductTest.php
| |-bootstrap.php

编辑:

如下面我的评论所示,我发现这个问题与 Eclipse PDT 自动完成功能有关,只有在使用后续新的 Composer require 语句等向 git 提交后才起作用,这对我来说不太理想,因为我想在提交之前尝试一下 Packagist 包

最佳答案

Composer/PHPUnit 问题

您的问题与 Eclipse PDT 本身无关。在您的 Composer 中,您注册了类映射和 PSR-0。类映射要求 Composer 重新扫描您的目录以查找新类 [1]。

您的 src/目录的 PSR-4 就足够了。例如,如果您在 src/Service/Foo.php 自动加载器(例如 phpunit)中创建 WebApp\Service\Foo 类,则会找到它。

警告:如果您使用"optimize-autoloader": true或运行composer install--optimize-autoloader或转储自动加载 --optimize你的 PSR4/PSR-0 将转换为类映射!!!

我假设您已将 Composer Autoloder 正确注册为 phpunit bootstrap。

Eclipse PDT 问题

您不必每次都删除/添加 Composer 支持,但因为您在 Eclipse 外部运行 Composer Update,所以您必须在每次 composer install 之后执行其他任务或composer update :

  1. 在项目上按 F5(刷新)以确保 Eclipse 与文件系统同步。如果您启用了自动同步,则可以正常工作
  2. click on project -> composer -> update build path
  3. 有时还需要清理项目

自动同步暂时不起作用,请参阅我的错误:bugs.eclipse.org/bugs/show_bug.cgi?id=515742

[1] - https://getcomposer.org/doc/04-schema.md#classmap

关于php - Eclipse PDT - 文件系统更改或新的 Composer 自动加载路径会破坏自动加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61395332/

相关文章:

php - SQL 搜索查询在不同服务器上的处理方式不同

php - laravel 中的 Composer 是什么?

c - 如何使用 write() 系统调用将整数写入文件

Android mkdirs() 设置无效权限,将其他应用程序锁定在文件夹之外

javascript - 使用//代替协议(protocol)

function - 函数内的全局 require 和局部 require 之间有区别吗

php - 无法将背景放入我的工作的 HTML/CSS 模板中

javascript - 更改使用 AJAX 加载的元素的 src

node.js - 如何以原子方式更新文件的一部分?

node.js - 在多个文件/模块中使用相同的模块