2017-05-09 2 views
0

Je développe une API REST avec Silex et je suis confronté à un problème concernant le chargement automatique de ma bibliothèque personnalisée. Il semble que l'autoload de Composer ne l'inclut pas, parce que quand je l'inclue moi-même cela fonctionne.Autoload du compositeur n'incluant pas mes espaces de noms personnalisés (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!'; 
    } 
} 

Je cours composer dumpautoload après chaque manipulation composer.json, et je ne vois la ligne 'Oc\\' => array($baseDir . '/src/Oc') (ou tout ce que j'ai essayé) dans vendor/composer/autoload_psr4.php.

Je n'arrive pas à comprendre ce qui ne va pas.

+0

Quel est le problème exact je pense que vous avez surpondérés votre question avec des étoffes supplémentaires –

Répondre

2

Presque tout ce que vous avez fait était correct.

Lorsque vous essayez de classes autoload dans un espace de noms, étant donné qu'une classe est nommée Oc\Foo et se trouve dans le fichier src/Oc/Foo.php, le autoloading correct serait "PSR-4": { "Oc\\": "src/Oc" }.

Cependant, vous n'avez pas de classe. Vous avez une fonction. Et les fonctions ne peuvent pas être automatiquement chargées par PHP jusqu'à maintenant. Il a été proposé plus d'une fois (la seule proposition que j'ai trouvée est https://wiki.php.net/rfc/function_autoloading), mais jusqu'à présent cette fonctionnalité n'a pas été implémentée.

Vos solutions alternatives:

  1. Déplacer la fonction dans une méthode statique d'une classe. Les classes peuvent être chargées automatiquement.
  2. Inclure la définition de la fonction en tant que "fichiers" chargement automatique: "files": ["src/Oc/ParseImport.php"] Notez que cette approche inclura toujours ce fichier même s'il n'est pas utilisé - mais il n'y a pas d'autre moyen d'inclure des fonctions dans PHP.

Comme illustration voir comment Guzzle a fait:
Autoloading in composer.json
Conditional include of functions basé sur function_exists
Function definition