Composer 自动加载不包括我的自定义命名空间 (Silex)
Composer autoload not including my custom namespaces (Silex)
我正在使用 Silex 开发 REST API,但我遇到了有关自动加载自定义库的问题。看起来 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
操作之后,我确实在 vendor/composer/autoload_psr4.php
中看到了 'Oc\' => array($baseDir . '/src/Oc')
行(或我尝试过的任何内容)。
我不知道哪里出了问题。
几乎你所做的一切都是正确的。
当尝试在命名空间中自动加载 classes 时,假设 class 被命名为 Oc\Foo
并且位于文件 src/Oc/Foo.php
中,正确的自动加载将成为 "PSR-4": { "Oc\": "src/Oc" }
.
但是,您没有class。你有一个功能。直到现在,PHP 还不能自动加载函数。不止一次被提出(我很容易找到的一个提议是https://wiki.php.net/rfc/function_autoloading),但直到现在这个功能还没有实现。
您的替代解决方案:
- 将函数移动到class的静态方法中。 类 可以自动加载。
- 将函数定义包含为 "files" 自动加载:
"files": ["src/Oc/ParseImport.php"]
请注意,此方法将始终包含该文件,即使它未被使用 - 但没有其他方法可以将函数包含在PHP.
如图所示,看看 Guzzle 是如何做到的:
Autoloading in composer.json
Conditional include of functions 基于 function_exists
Function definition
我正在使用 Silex 开发 REST API,但我遇到了有关自动加载自定义库的问题。看起来 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
操作之后,我确实在 vendor/composer/autoload_psr4.php
中看到了 'Oc\' => array($baseDir . '/src/Oc')
行(或我尝试过的任何内容)。
我不知道哪里出了问题。
几乎你所做的一切都是正确的。
当尝试在命名空间中自动加载 classes 时,假设 class 被命名为 Oc\Foo
并且位于文件 src/Oc/Foo.php
中,正确的自动加载将成为 "PSR-4": { "Oc\": "src/Oc" }
.
但是,您没有class。你有一个功能。直到现在,PHP 还不能自动加载函数。不止一次被提出(我很容易找到的一个提议是https://wiki.php.net/rfc/function_autoloading),但直到现在这个功能还没有实现。
您的替代解决方案:
- 将函数移动到class的静态方法中。 类 可以自动加载。
- 将函数定义包含为 "files" 自动加载:
"files": ["src/Oc/ParseImport.php"]
请注意,此方法将始终包含该文件,即使它未被使用 - 但没有其他方法可以将函数包含在PHP.
如图所示,看看 Guzzle 是如何做到的:
Autoloading in composer.json
Conditional include of functions 基于 function_exists
Function definition