使旧版应用程序PSR-4兼容

时间:2015-08-18 15:58:04

标签: php composer-php psr-4

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

谢谢,

注意事项: - &GT;我不想将源代码上传到任何可以像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

2 个答案:

答案 0 :(得分: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();

希望它有所帮助。

答案 1 :(得分:0)

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

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

完成此操作后,请运行composer update