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

时间:2017-05-09 12:25:45

标签: php composer-php silex autoload

我正在使用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行(或我尝试过的任何内容)。

我无法弄清楚出了什么问题。

1 个答案:

答案 0 :(得分:2)

你所做的一切都是正确的。

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

但是,你没有课。你有一个功能。到目前为止,PHP无法自动加载函数。它被提出了不止一次(我发现的一个提案很容易https://wiki.php.net/rfc/function_autoloading),但直到现在这个功能还没有实现。

您的替代解决方案:

  1. 将函数移动到类的静态方法中。类可以自动加载。
  2. 将功能定义包含为&#34;文件&#34;自动加载:"files": ["src/Oc/ParseImport.php"]请注意,这种方法将始终包含该文件,即使它没有被使用 - 但是没有其他方法可以在PHP中包含函数。
  3. 如图所示,看看Guzzle是如何做到的:
    Autoloading in composer.json
    Conditional include of functions基于function_exists
    Function definition