使传统应用程序PSR-4兼容


Making Legacy Application PSR-4 Compatible

我有一个关于重构遗留PHP应用程序以与PHP的PSR-4标准兼容的问题。我有一些类位于app/classes/文件夹,还没有适当的命名空间,我希望他们是自动加载直接当我调用作曲家的vendor/autolload .php。我根据'<NamespaceName>('<SubNamespaceNames>)*'<ClassName>添加了一个名称空间,并尝试在composer的供应商文件夹下创建一个vendor/myapp/classes/src/目录,并执行dump- autolload命令,但无济于事。类没有被加载,编曲者也不知道在哪里找到它。有什么建议吗?

谢谢,1月

注意事项:->我不想将源代码上传到任何可以像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. 我想包括强行,config.db.php,在每次调用autolload .php

我现在明白了。但是源文件不会驻留在/vendor文件夹中,这对我来说是可以的。如果你想让你的文件自动加载,无论在哪个文件夹,只要把它添加到psr-4块在作曲器。Json,如果还没有,就创建它。在我的作曲家。json中,顶层对象中有这个block,它添加了我想要自动加载的文件夹还包含了我想要包含的特定文件,比如配置文件

  ... 
  "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

如果我想把myclass1。php文件包含在index。php中,我只需要这样添加:

include_once( __DIR__ . "/vendor/autoload.php");
use 'MyApp'Classes'MyClass1;
$foo = new MyClass1();
$foo->bar();

希望能有所帮助。

您可以通过创建自己的编写器包,将其添加到您的私有git存储库中,然后将该包添加到项目的编写器中来实现这一点。json文件:

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

完成后,运行composer update .