我正在使用Silex开发REST API,我遇到了关于自定义librairy自动加载的问题。看起来Composer的自动加载不包括它,因为当我自己包含它时它可以工作。
# 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 Symfony\Component\HttpFoundation\Response;
use Oc\ParseImport;
$app->get('/hello', function () use ($app) {
return new Response(Oc\ParseImport(), 200);
});
<?php
// src/Oc/ParseImport.php
namespace Oc {
function ParseImport() {
return 'foobar!';
}
}
我在每次composer dumpautoload
操作后运行composer.json
,我确实在'Oc\\' => array($baseDir . '/src/Oc')
中看到了vendor/composer/autoload_psr4.php
行(或我尝试过的任何内容)。
我无法弄清楚出了什么问题。
答案 0 :(得分:2)
你所做的一切都是正确的。
尝试在命名空间中自动加载类时,假定某个类名为Oc\Foo
且位于文件src/Oc/Foo.php
中,则正确的自动加载将为"PSR-4": { "Oc\\": "src/Oc" }
。
但是,你没有课。你有一个功能。到目前为止,PHP无法自动加载函数。它被提出了不止一次(我发现的一个提案很容易https://wiki.php.net/rfc/function_autoloading),但直到现在这个功能还没有实现。
您的替代解决方案:
"files": ["src/Oc/ParseImport.php"]
请注意,这种方法将始终包含该文件,即使它没有被使用 - 但是没有其他方法可以在PHP中包含函数。如图所示,看看Guzzle是如何做到的:
Autoloading in composer.json
Conditional include of functions基于function_exists
Function definition