2

我有一个关于重构遗留 PHP 应用程序以兼容 PHP 的 PSR-4 标准的问题。我有一些位于 app/classes/ 文件夹中的类尚未正确命名空间,我希望在调用 composer 的 vendor/autoload.php 时直接自动加载它们。我根据添加了一个命名空间,\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>并尝试vendor/myapp/classes/src/在composer的供应商文件夹下创建一个目录,并执行了dump-autoload命令但无济于事。该类没有加载,作曲家无法弄清楚在哪里可以找到它。有关如何执行此操作的任何指示?

谢谢,

注意事项:-> 我不想将源代码上传到任何可以公开搜索的存储库,例如 Packagist,因为代码仅供内部使用。

编辑:这是我的composer.json:

...
  "autoload":{
    "psr-4": {
      "Myapp\\" : "Myapp"
    }
  },
...

但现在结构看起来像:

->Myapp
-->Classes
--->Module1
---->submodule.php
--->Module2
---->submodule2.php
--->Module3
---->submodule3.php
--->Config
---->config.db.php

->vendor
-->autoload.php

这是我的问题/问题:

  1. 当我尝试加载 submodule.php 时,它又会加载 submodule2.php 和 submodule3.php,它会告诉我找不到 submodule3.php。submodule3.php 的命名空间是 Myapp\Classes\Module3 但它说它没有找到。
  2. 我想在每次调用 autoload.php 时强制包含 config.db.php
4

2 回答 2

1

我现在想通了。但是源文件不会驻留在 /vendor 文件夹中,这对我来说是可以的。如果你想让你的文件无论在哪个文件夹都自动加载,只需将它添加到 composer.json 中的 psr-4 块,或者如果它还没有,则创建它。在我的 composer.json 中,我在顶层对象上有这个块,它添加了我想要自动加载的文件夹,还包括我想要包含的特定文件,比如某种配置文件:

  ... 
  "autoload":{
    "files": [
      "somefolder/somefile.php"
    ],
    "psr-4": {
      "MyApp\\" : "MyApp"
    }
  },
  ...

这仅仅意味着作曲家应该自动加载驻留在 MyApp 目录中的文件,该目录也将具有 MyApp 的命名空间。

所以我的文件夹结构现在看起来像这样:

->MyApp
-->Classes
--->MyClass1.php   --> namespace MyApp\Classes classname: MyClass1
-->Components
--->MyClass2.php   --> namespace MyApp\Classes classname: MyClass2
->somefolder
-->somefile.php
->vendor
-->autoload.php
->index.php

因此,如果我想在 index.php 中包含文件 MyClass1.php,我只需像这样添加它:

include_once( __DIR__ . "/vendor/autoload.php");

use \MyApp\Classes\MyClass1;

$foo = new MyClass1();
$foo->bar();

希望能帮助到你。

于 2015-08-19T13:33:18.130 回答
0

您可以通过创建自己的 composer 包、将其添加到您的私有 git 存储库并将包添加到项目的 composer.json 文件来解决此问题:

"require": {
    "{your-vendor}/{package-name}": "dev-master"
},
"repositories": [
    {
        "type": "vcs",
        "url": "git@bitbucket.org:{your-vendor}/{package-name}.git"
    }
],

完成后,运行composer update.

于 2015-08-18T16:51:13.650 回答