2017-05-09 100 views
0

我正在開發與Silex的REST API,我面臨着自定義庫的自動加載問題。看起來Composer的自動加載不包含它,因爲當我自己包含它時它就可以工作。作曲家自動載入不包括我的自定義命名空間(Silex)

# 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.json操作後運行composer dumpautoload,我確實看到vendor/composer/autoload_psr4.php(我試過或任何東西)行'Oc\\' => array($baseDir . '/src/Oc')。我想不出什麼是錯的。

+0

什麼是確切的問題,我想你已經超重的問題有額外的東西 –

回答

2

幾乎所有你做的事都是正確的。

當一個命名空間試圖自動加載類,因爲一類被命名爲Oc\Foo和所在的文件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中包含函數。

作爲解說看到狂飲如何做到了:
Autoloading in composer.json
Conditional include of functions基於function_exists
Function definition