使遗留应用程序 PSR-4 兼容
Making Legacy Application PSR-4 Compatible
我有一个关于重构遗留 PHP 应用程序以与 PHP 的 PSR-4 标准兼容的问题。我有一些位于 app/classes/ 文件夹中的 classes 尚未正确命名 spaced,我希望它们在我调用 composer 的 vendor/autoload.[= 时直接自动加载49=]。我根据 \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
添加了一个名称 space 并且我尝试在 composer 的 vendor 文件夹下创建一个 vendor/myapp/classes/src/
目录,并执行 dump-autoload 命令但无济于事。 class 没有加载,作曲家不知道在哪里可以找到它。关于如何执行此操作的任何指示?
谢谢,
一月
Thing/s 注意:
-> 我不想将源代码上传到任何可以公开搜索的存储库,如 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
这是我的 issues/questions:
- 当我尝试加载 submodule.php 时,它会依次加载 submodule2.php 和 submodule3.php,它会告诉我找不到 submodule3.php。 submodule3.php 的名称space 是 Myapp\Classes\Module3 但它说找不到。
- 我想在 autoload.php
的每次调用中强制包含 config.db.php
您可以通过创建自己的 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
。
我现在明白了。但是源文件不会驻留在 /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();
希望对您有所帮助。
我有一个关于重构遗留 PHP 应用程序以与 PHP 的 PSR-4 标准兼容的问题。我有一些位于 app/classes/ 文件夹中的 classes 尚未正确命名 spaced,我希望它们在我调用 composer 的 vendor/autoload.[= 时直接自动加载49=]。我根据 \<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
添加了一个名称 space 并且我尝试在 composer 的 vendor 文件夹下创建一个 vendor/myapp/classes/src/
目录,并执行 dump-autoload 命令但无济于事。 class 没有加载,作曲家不知道在哪里可以找到它。关于如何执行此操作的任何指示?
谢谢,
一月
Thing/s 注意: -> 我不想将源代码上传到任何可以公开搜索的存储库,如 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
这是我的 issues/questions:
- 当我尝试加载 submodule.php 时,它会依次加载 submodule2.php 和 submodule3.php,它会告诉我找不到 submodule3.php。 submodule3.php 的名称space 是 Myapp\Classes\Module3 但它说找不到。
- 我想在 autoload.php 的每次调用中强制包含 config.db.php
您可以通过创建自己的 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
。
我现在明白了。但是源文件不会驻留在 /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();
希望对您有所帮助。