当前位置: 首页 > 知识库问答 >
问题:

使遗留应用程序PSR-4兼容

谭毅然
2023-03-14

我有一个关于重构遗留PHP应用程序以与PHP的PSR-4标准兼容的问题。我有一些类位于应用程序/类/文件夹,尚未正确命名空间,我想让他们直接自动加载时,我调用作曲家的供应商/autoload.php.我添加了一个名称空间根据\

谢谢

一月

注意事项:-

编辑:这是我的作曲家。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. 当我尝试加载子模块时。php,这将依次加载子模块2。php和子模块3。php,它会告诉我子模块3。找不到php。子模块3的命名空间。php是Myapp\Classes\Module3,但它说找不到它
  2. 我想强制包含,config。db。php,在每次调用自动加载时。php

共有2个答案

巫马泓
2023-03-14

您可以通过创建自己的作曲家包来实现这一点,将其添加到您的私有git存储库中,并将该包添加到项目的composer.json文件中:

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

完成此操作后,运行composer update

堵宪
2023-03-14

我现在明白了。但是源文件将不会驻留在/vendor文件夹中,这对我的情况没有问题。如果您想让您的文件自动加载,无论是哪个文件夹,只需将其添加到composer中的psr-4块。json,如果还没有,就创建它。在我的作曲家。json,我在顶层对象上有这个块,它添加了我想要自动加载的文件夹,还包括我想要包含的特定文件,比如某种类型的配置文件:

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

这仅仅意味着composer应该自动加载驻留在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();

希望能有帮助。

 类似资料:
  • 我正在将一组遗留应用程序升级到Spring Boot2.4.0,运行在OpenJDK8上,部署到Pivotal Cloud Foundry。 我将添加到我的和测试文件中: 仍然没有快乐--所有的测试都失败了。 我被我看到的其他链接弄糊涂了。这是的问题吗?我读到版本可能存在问题。我需要把它添加到我的应用程序吗?在升级之前,它从来不需要这种依赖关系:

  • 我有一个非常古老的遗留Java应用程序,我想从C#中实现自动化。问题是我们没有应用程序的源代码,程序员早就离开了公司。我可能可以“反编译”这个文件。jar文件,但我也不是java程序员,我不认为访问源代码(没有注释)会让我走得更远。 到目前为止,我使用以下代码(我在循环中轮询,因为Java应用可能有多个实例),成功地(相当成功地)自动化了应用程序的登录对话框: 现在的问题是我无法获取Java窗口的

  • 我面临的问题是,有一个服务,我必须调用,这是一个传统的Spring启动应用程序,而不是反应性的! 下面是一个示例endpoint,它接近上述遗留系统的想法: 我知道我不能用这个来实现真正的反应性善,有没有一个快乐的非阻塞和阻塞的媒介我可以在这里实现? 谢谢

  • 现在我面临的问题是如何实现On-Prem和云应用程序之间的集成。我想了几个选择。 直接将消息从遗留的Tibco主题复制到。NET应用程序将消息发布到GCP中的pub/sub主题。我不是Tibco专家,不确定这是否得到支持。我找到了下面的链接,但不确定这是否适合我的用例。另外,客户想要离开Tibco,并且不确定数据中心上的遗留Tibco EMS是否支持下面的Tibco连接器功能。https://ww

  • 虽然 Sequelize 自认为可以开箱即用, 但是如果你要使用应用之前遗留的资产和凭据,仅需要通过定义(否则生成)表和字段名称即可. 表 class User extends Model {} User.init({ // ... }, { modelName: 'user', tableName: 'users', sequelize, }); 字段 class MyModel

  • 我和许多其他人一样,似乎很难弄清楚何时以及如何使用自动加载。我想我理解作曲家和PSR-0/PSR-4的概念和这需要的目录结构。但是如果我用自己的MVC框架构建自己的项目 > 由于composer自带了自动加载器,它将加载我希望包含在项目中的所有依赖项,如果我不打算将我的网站变成分布式项目,我甚至需要自己的名称空间吗?为什么我不坚持使用include/requires? 最后,如果我采用名称空间,使