没有作曲家的 PSR 4 自动加载
PSR4 auto load without composer
我在一个项目中有一个包是使用 composer 自动加载的,composer.json 条目如下:
"autoload": {
"psr-4": {
"CompanyName\PackageName\": "packages/package-folder/src/"
}
}
现在我将其复制到另一个未使用 Composer 的项目中。我怎样才能在那里自动加载同一个包?
您必须自己阅读作曲家并为 composer.json
中定义的每个名称空间加载 类。
方法如下:
function loadPackage($dir)
{
$composer = json_decode(file_get_contents("$dir/composer.json"), 1);
$namespaces = $composer['autoload']['psr-4'];
// Foreach namespace specified in the composer, load the given classes
foreach ($namespaces as $namespace => $classpaths) {
if (!is_array($classpaths)) {
$classpaths = array($classpaths);
}
spl_autoload_register(function ($classname) use ($namespace, $classpaths, $dir) {
// Check if the namespace matches the class we are looking for
if (preg_match("#^".preg_quote($namespace)."#", $classname)) {
// Remove the namespace from the file path since it's psr4
$classname = str_replace($namespace, "", $classname);
$filename = preg_replace("#\\#", "/", $classname).".php";
foreach ($classpaths as $classpath) {
$fullpath = $dir."/".$classpath."/$filename";
if (file_exists($fullpath)) {
include_once $fullpath;
}
}
}
});
}
}
loadPackage(__DIR__."/vendor/project");
new CompanyName\PackageName\Test();
当然,我不知道您在 PackageName 中的类。
/vendor/project
是您的外部库被克隆或下载的地方。这是您拥有 composer.json
文件的地方。
注意:这仅适用于 psr4 自动加载。
编辑:为一个命名空间添加对多个类路径的支持
EDIT2 :如果有人想改进它,我创建了一个 Github repo 来处理这段代码。
是的,这个问题已有 6 个月之久,但我只是使用了以下内容。
我刚刚找到了以下解决问题的方法。我只是在本地 运行 我的项目文件夹中的命令 composer dump-autoload -o
。之后,我只需要将 ./vendor/composer 文件夹和 /vendor/autoload.php 文件夹的内容上传到服务器,它又可以工作了。
如果您无法在服务器上 运行 作曲家,这将很有帮助。
出于很多原因,我不是 Composer 的粉丝。第一个原因共享托管服务不提供作曲家作为一个包,因此它使得交付低预算应用程序或简单的 MVC 自定义框架变得更加困难。这是一个符合 PSR4 标准的解决方法。
假设您将此 auto-load 方法添加到根目录中的文件中,并且我们正在 auto-loading 类 文件夹中名为“src”的所有内容这里是如何存档。
define('ROOT', dirname(__DIR__));
define('SLASH', DIRECTORY_SEPARATOR);
spl_autoload_register(function ($className)
{
$fileName = sprintf("%s%ssrc%s%s.php", ROOT, SLASH, SLASH, str_replace("\", "/", $className));
if (file_exists($fileName))
{
require ($fileName);
}
else
{
echo "file not found {$fileName}";
}
});
现在您应该在每个文件中添加一个命名空间,如果您有依赖项,请使用。这是
中的一个基本示例
namespace myapp;
use Core\Example;
此外,在我的示例中,src 中的所有文件夹都应以大写字母开头。
完成。干杯@jerryurenaa
我在一个项目中有一个包是使用 composer 自动加载的,composer.json 条目如下:
"autoload": {
"psr-4": {
"CompanyName\PackageName\": "packages/package-folder/src/"
}
}
现在我将其复制到另一个未使用 Composer 的项目中。我怎样才能在那里自动加载同一个包?
您必须自己阅读作曲家并为 composer.json
中定义的每个名称空间加载 类。
方法如下:
function loadPackage($dir)
{
$composer = json_decode(file_get_contents("$dir/composer.json"), 1);
$namespaces = $composer['autoload']['psr-4'];
// Foreach namespace specified in the composer, load the given classes
foreach ($namespaces as $namespace => $classpaths) {
if (!is_array($classpaths)) {
$classpaths = array($classpaths);
}
spl_autoload_register(function ($classname) use ($namespace, $classpaths, $dir) {
// Check if the namespace matches the class we are looking for
if (preg_match("#^".preg_quote($namespace)."#", $classname)) {
// Remove the namespace from the file path since it's psr4
$classname = str_replace($namespace, "", $classname);
$filename = preg_replace("#\\#", "/", $classname).".php";
foreach ($classpaths as $classpath) {
$fullpath = $dir."/".$classpath."/$filename";
if (file_exists($fullpath)) {
include_once $fullpath;
}
}
}
});
}
}
loadPackage(__DIR__."/vendor/project");
new CompanyName\PackageName\Test();
当然,我不知道您在 PackageName 中的类。
/vendor/project
是您的外部库被克隆或下载的地方。这是您拥有 composer.json
文件的地方。
注意:这仅适用于 psr4 自动加载。
编辑:为一个命名空间添加对多个类路径的支持
EDIT2 :如果有人想改进它,我创建了一个 Github repo 来处理这段代码。
是的,这个问题已有 6 个月之久,但我只是使用了以下内容。
我刚刚找到了以下解决问题的方法。我只是在本地 运行 我的项目文件夹中的命令 composer dump-autoload -o
。之后,我只需要将 ./vendor/composer 文件夹和 /vendor/autoload.php 文件夹的内容上传到服务器,它又可以工作了。
如果您无法在服务器上 运行 作曲家,这将很有帮助。
出于很多原因,我不是 Composer 的粉丝。第一个原因共享托管服务不提供作曲家作为一个包,因此它使得交付低预算应用程序或简单的 MVC 自定义框架变得更加困难。这是一个符合 PSR4 标准的解决方法。
假设您将此 auto-load 方法添加到根目录中的文件中,并且我们正在 auto-loading 类 文件夹中名为“src”的所有内容这里是如何存档。
define('ROOT', dirname(__DIR__));
define('SLASH', DIRECTORY_SEPARATOR);
spl_autoload_register(function ($className)
{
$fileName = sprintf("%s%ssrc%s%s.php", ROOT, SLASH, SLASH, str_replace("\", "/", $className));
if (file_exists($fileName))
{
require ($fileName);
}
else
{
echo "file not found {$fileName}";
}
});
现在您应该在每个文件中添加一个命名空间,如果您有依赖项,请使用。这是
中的一个基本示例namespace myapp;
use Core\Example;
此外,在我的示例中,src 中的所有文件夹都应以大写字母开头。
完成。干杯@jerryurenaa