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),但直到现在这个功能还没有实现。

您的替代解决方案:

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

如图所示,看看 Guzzle 是如何做到的:
Autoloading in composer.json
Conditional include of functions 基于 function_exists
Function definition