作曲家自动加载不包括我的自定义命名空间(Silex)



我正在使用Silex开发一个REST API,但我遇到了有关自动加载自定义库的问题。看起来作曲家的自动加载不包括它,因为当我自己包含它时,它可以工作。

# The autoload section in composer.json
# Tried with :
#    "Oc\": "src/Oc"
#    "Oc\": "src/"
#    "": "src/"
"autoload": {
"psr-4": {
"Oc\": "src/"
}
}

<?php
// api/index.php <-- public-facing API
require_once __DIR__.'/../vendor/autoload.php';
$app = require __DIR__.'/../src/app.php';
require __DIR__.'/../src/routes.php'; // <--
$app->run();

<?php
// src/routes.php
// When uncommented, it works!
//include('Oc/ParseImport.php');
use SymfonyComponentHttpFoundationResponse;
use OcParseImport;
$app->get('/hello', function () use ($app) {
return new Response(OcParseImport(), 200);
});

<?php
// src/Oc/ParseImport.php
namespace Oc {
function ParseImport() {
return 'foobar!';
}
}

每次composer.json操作后我都会运行composer dumpautoload,并且我确实在vendor/composer/autoload_psr4.php中看到'Oc\' => array($baseDir . '/src/Oc')(或我尝试过的任何内容)的行。

我不知道出了什么问题。

你所做的几乎所有事情都是正确的。

当尝试在命名空间中自动加载类时,假设类名为OcFoo并且位于文件src/Oc/Foo.php中,正确的自动加载将是"PSR-4": { "Oc\": "src/Oc" }

但是,您没有类。你有一个函数。到目前为止,PHP 还不能自动加载函数。它已经被提出不止一次(我很容易找到的一个建议是 https://wiki.php.net/rfc/function_autoloading),但直到现在这个功能还没有实现。

您的替代解决方案:

  1. 将函数移动到类的静态方法中。 类可以自动加载。
  2. 将函数定义作为"文件"自动加载:"files": ["src/Oc/ParseImport.php"]请注意,即使未使用该文件,此方法也将始终包含该文件 - 但是没有其他方法可以在 PHP 中包含函数。

作为插图,看看Guzzle是如何做到的:
在composer.json
中自动加载基于function_exists
函数定义的函数的条件包含

最新更新